@finsys/core 4.1.0 → 4.3.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/survey-generator.ts","../src/rhf-generator.ts","../src/validator.ts","../src/schema/unified-form.schema.json","../src/form-field-category.ts","../src/form-field.ts","../src/form-spec.ts","../src/form-field-validator.ts","../src/data/form-field-base-specs.json","../src/data/form-field-types.json","../src/data/form-field-validators.json","../src/catalogs.ts","../src/ihs-types.ts","../src/document-types.ts","../src/data/form-field-display-names.json","../src/ihs-processing.ts","../src/roles.ts","../src/extraction.ts","../src/ihs-status.ts","../src/extraction-status.ts","../src/adapter.ts","../src/adapter-aggregation.ts","../src/data/adapter-categories.json","../src/adapter-categories.ts"],"sourcesContent":["/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @finsys/core\n * Convert unified form configurations into Zod schemas, React Hook Form defaults, and SurveyJS JSON\n */\n\n// Functions\nexport {\n generateSurveyJson,\n resolvePageFields,\n getCategoryName,\n groupFieldsByCategory,\n applyDynamicTitles\n} from \"./survey-generator.js\";\n\nexport { getPastMonthLabel, getPastYearLabel, evaluateExpression } from \"./utils.js\";\n\nexport { \n generateRHFSchema,\n getStepSchema,\n getStepDefaultValues\n} from \"./rhf-generator.js\";\n\nexport { validateFormConfig, validateFormSpec, validatePagesConfig } from \"./validator.js\";\n\n// Unified Form Config types\nexport type {\n Category,\n Choice,\n Validator,\n FieldData,\n FieldReference,\n PageConfig,\n UnifiedFormConfig,\n ResolvedField,\n FieldGroup,\n} from \"./survey-generator.js\";\n\n// Output types (SurveyJS JSON compatible)\nexport type { SurveyElementJSON, SurveyPageJSON, SurveyJSON } from \"./survey-generator.js\";\n\n// RHF Generator types\nexport type { RHFStep, RHFSchemaOutput } from \"./rhf-generator.js\";\n\n// Re-export survey-core types for convenience\nexport type { IQuestion, IPage, ISurvey, IPanel, IElement } from \"./survey-generator.js\";\n\n// Form domain classes\nexport { FormSpec } from \"./form-spec.js\";\nexport { default as FormField, BasicFormField, FileFormField, FieldType } from \"./form-field.js\";\nexport type { FormFieldType, FormFieldInputType, FormFieldTypeDefinitions, DropdownOption, EditorValidator } from \"./form-field.js\";\nexport { FormFieldCategory } from \"./form-field-category.js\";\nexport { FormFieldValidator } from \"./form-field-validator.js\";\nexport type { FormValidatorDefinitions } from \"./form-field-validator.js\";\n\n// Catalogs\nexport {\n BASE_FIELD_SPECS,\n DEFAULT_VALIDATOR_DEFINITIONS,\n FIELD_TYPE_DEFINITIONS,\n getBaseFieldSpecs,\n getBaseCategories,\n getBaseFieldNames,\n getBaseFieldSpecMap,\n} from \"./catalogs.js\";\n\n// IHS data processing\nexport {\n getDisplayNames,\n getDisplayName,\n getGroupDisplayNames,\n extractTimePeriods,\n groupColumnsByTimePeriod,\n groupColumnsByInstance,\n groupFieldsByPattern,\n buildFileFieldTables,\n buildFileFieldTablesFromInstances,\n processIhsDetails,\n groupDetailsByCategory,\n buildDocumentRows,\n parseFileField,\n getDocDisplayNames,\n getExtractableDocTypes,\n getReuploadableDocTypes,\n formatDocumentType,\n formatDocumentSize,\n formatDocumentUploaded,\n} from './ihs-processing.js'\n\nexport { IhsValueFormat, FileFieldTableType, isValidIhsFieldOrigin, IHS_FIELD_ORIGINS } from './ihs-types.js'\nexport type { IhsFieldOrigin } from './ihs-types.js'\n\n// Roles\nexport { Role } from './roles.js'\n\n// Extraction\nexport { ExtractionJobStatus } from './extraction.js'\nexport type { ExtractionFileType } from './extraction.js'\nexport {\n getDocumentTypeGroups,\n isDocumentType,\n assertDocumentType,\n} from './document-types.js'\nexport type { DocumentTypeGroup, WireFormat, TaggedFieldData, TimePeriodUnit } from './document-types.js'\n\n// IHS status (canonical enum, mirrors finsys-api)\nexport {\n IhsStatus,\n IHS_VALID_STATUSES,\n IHS_TERMINAL_STATUSES,\n IHS_FAILURE_STATUSES,\n isValidIhsStatus,\n isTerminalIhsStatus,\n isFailureIhsStatus,\n} from './ihs-status.js'\n\n// Extraction status\nexport {\n resolveExtractionStatus,\n DocExtractionStatus,\n} from './extraction-status.js'\n\nexport type {\n ExtractionJobRecord,\n DocExtractionResult,\n ExtractionStatusResult,\n} from './extraction-status.js'\n\nexport type {\n IhsFieldDetail,\n IhsDetailCategory,\n FileFieldTableData,\n FileFieldTableItem,\n IhsFieldProvenance,\n DocumentRow,\n DocumentRowCapabilities,\n DocumentFileMetadata,\n InstanceRow,\n} from './ihs-types.js'\n\nexport type { CategorySpec } from './ihs-processing.js'\n\n// ── Source Adapter framework (SYS-2440) ──────────────────────────────\n// The contract for ingesting unstructured / partner-specific data\n// sources and producing canonical credit signals. Vendor-specific\n// adapter implementations live OUTSIDE this open-source package, in\n// private extension directories loaded by the host app at runtime.\n// finsys-core publishes the contract + the category catalogue.\n\nexport type {\n RawPayload,\n CanonicalFieldValue,\n CanonicalFieldValues,\n AdapterExtraction,\n SourceAdapter,\n AdapterErrorReason,\n ApplicantIdentity,\n} from './adapter.js'\n\nexport { AdapterError } from './adapter.js'\n\nexport type { AggregationOp, InstanceValue } from './adapter-aggregation.js'\nexport { applyAggregation, ALL_AGGREGATION_OPS } from './adapter-aggregation.js'\n\nexport type {\n AdapterCategory,\n CanonicalFieldName,\n CanonicalFieldSpec,\n CategorySchema,\n} from './adapter-categories.js'\n\n// NB: `buildCategoryRegistry` + the `CategoryRegistry` shape are\n// intentionally NOT re-exported here. They're the internal loader (and\n// its return type, which carries mutable Maps that `ReadonlyMap` only\n// guards at compile time). Keeping them out of the package's public API\n// avoids exposing a corruptible view of the shared singleton registry.\n// They remain module-exported for finsys-core's own tests. Promote to a\n// public, defensively-immutable API only when a consumer (e.g. host-side\n// category merging in a future phase) actually needs it.\nexport {\n ADAPTER_CATEGORY_IDS,\n categorySchemaOf,\n categoryFieldsOf,\n allCategories,\n categoryForField,\n isAdapterCategory,\n assertAdapterCategory,\n} from './adapter-categories.js'\n\nexport type {\n AdapterManifest,\n DeclarativeImplementation,\n TypescriptImplementation,\n FieldMapEntry,\n} from './adapter-manifest.js'\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Utility functions for @finsys/core\n */\n\nexport function getPastMonthLabel(monthsAgo: number): string {\n const date = new Date();\n date.setDate(1); // Avoid day-of-month rollover (e.g. Mar 31 → \"February\" would roll to March)\n date.setMonth(date.getMonth() - monthsAgo);\n return date.toLocaleString('default', { month: 'long' });\n}\n\nexport function getPastYearLabel(yearsAgo: number): string {\n const date = new Date();\n return (date.getFullYear() - yearsAgo).toString();\n}\n\n/**\n * Evaluate a SurveyJS-style expression against a data object.\n * e.g. \"{totalFinancing} > 50000\"\n * \n * NOTE: This is a simplified evaluator that replaces {key} with data[key] access.\n * It does not support complex SurveyJS functions like age() or complicated nested paths unless handled by JS.\n */\nexport function evaluateExpression(expression: string, data: any): boolean {\n if (!expression) return true;\n \n try {\n // 1. Replace {variable} with this['variable'] safely\n let jsExpression = expression.replace(/\\{([^}]+)\\}/g, (_, key) => {\n // Clean key if needed (trim)\n return `this['${key.trim()}']`;\n });\n\n // 2. Map SurveyJS comparison operators to JS operators FIRST\n // (before array operator transforms inject JS code containing '=' assignments)\n // Replace single '=' with '==' if it's not already '==' or '!=' or '>=' or '<='\n jsExpression = jsExpression.replace(/(?<![<>!=])=(?![=])/g, '==');\n\n // 3. Map SurveyJS array operators to JS equivalents\n // These run AFTER the '=' transform so their generated JS won't be mangled.\n\n // \"anyof\" → value is one of the items in the array\n // e.g. this['employmentType'] anyof ['01','08','09']\n // → (['01','08','09']).includes(this['employmentType'])\n jsExpression = jsExpression.replace(\n /(this\\['[^']+'\\])\\s+anyof\\s+(\\[[^\\]]+\\])/gi,\n (_, ref, arr) => `(${arr}).includes(${ref})`\n );\n\n // \"allof\" → value (expected to be an array) contains all items\n // e.g. this['skills'] allof ['a','b']\n // → ['a','b'].every(item => (this['skills'] || []).includes(item))\n // Arrow functions inherit `this` from enclosing scope (the new Function call),\n // so this works correctly with Function.call(data).\n jsExpression = jsExpression.replace(\n /(this\\['[^']+'\\])\\s+allof\\s+(\\[[^\\]]+\\])/gi,\n (_, ref, arr) => `${arr}.every(item => (${ref} || []).includes(item))`\n );\n\n // \"contains\" → string/array contains value\n // e.g. this['roles'] contains 'admin'\n // Uses || [] fallback to handle both string and array values correctly.\n // (|| '' would stringify arrays causing false positives)\n jsExpression = jsExpression.replace(\n /(this\\['[^']+'\\])\\s+contains\\s+'([^']+)'/gi,\n (_, ref, val) => `(${ref} || []).includes('${val}')`\n );\n\n // \"notcontains\" → string/array does not contain value\n jsExpression = jsExpression.replace(\n /(this\\['[^']+'\\])\\s+notcontains\\s+'([^']+)'/gi,\n (_, ref, val) => `!(${ref} || []).includes('${val}')`\n );\n\n // 4. Execute with Function, binding 'data' as 'this'\n const func = new Function(`return ${jsExpression};`);\n return !!func.call(data || {});\n } catch (e) {\n // console.warn(`Failed to evaluate expression: \"${expression}\"`, e);\n return false;\n }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Survey Generator - Converts unified form configurations into SurveyJS-compatible JSON\n *\n * This module converts a unified form-config.json into SurveyJS-compatible JSON,\n * resolving field references, applying dynamic titles, and grouping by category.\n */\n\n// Re-export survey-core types for consumers\nexport type { IQuestion, IPage, ISurvey, IPanel, IElement } from \"survey-core\";\nimport { getPastMonthLabel, getPastYearLabel } from \"./utils.js\";\n\n// ============ Unified Form Config Types ============\n\nexport interface Category {\n id: string;\n name: string;\n}\n\nexport interface Choice {\n value: string;\n text: string;\n}\n\nexport interface Validator {\n type: \"regex\" | \"email\" | \"numeric\" | \"text\" | \"expression\" | \"answercount\" | \"custom\";\n text?: string;\n regex?: string;\n minValue?: number;\n maxValue?: number;\n minLength?: number;\n maxLength?: number;\n minCount?: number;\n maxCount?: number;\n expression?: string;\n validator?: string; // For custom validator name\n}\n\n/**\n * FieldData - Field definition in the unified form config\n */\nexport interface FieldData {\n name?: string; // Optional in fields{} (key is name), required in arrays\n displayName?: string;\n type: string;\n inputType?: \"text\" | \"number\" | \"tel\" | \"date\" | \"email\" | \"password\" | \"url\";\n category?: string; // Category ID (strictly string)\n maxLength?: number | string;\n min?: number | string;\n max?: number | string;\n step?: number;\n html?: string;\n choices?: Choice[];\n validators?: Validator[];\n visible?: boolean;\n visibleIf?: string;\n required?: boolean;\n isRequired?: boolean; // SurveyJS compat alias\n placeholder?: string;\n defaultValue?: string | number | boolean | string[];\n readOnly?: boolean;\n startWithNewLine?: boolean;\n enableIf?: string;\n titleLocation?: \"default\" | \"top\" | \"bottom\" | \"left\" | \"hidden\";\n // FinSys-specific fields\n ihs_column_names?: string[];\n requiredForEvaluation?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * FieldReference - How fields are referenced in pages\n */\nexport type FieldReference = \n | string // Simple field name reference\n | { ref: string; [key: string]: unknown } // Reference with overrides\n | { definition: FieldData & { name: string } }; // Inline definition\n\nexport interface PageConfig {\n id: string;\n title?: string;\n description?: string;\n showTOC?: boolean;\n showProgressBar?: boolean;\n showCategoryHeadings?: boolean;\n layout?: \"default\" | \"grid\" | \"vertical\";\n fields: FieldReference[];\n}\n\n/**\n * UnifiedFormConfig - The main configuration type for the unified form format\n */\nexport interface UnifiedFormConfig {\n $schema?: string;\n schemaVersion?: string;\n displayName?: string;\n templateIcon?: string; // Icon identifier for form template editors\n categories: Category[];\n fields: Record<string, FieldData>;\n pages?: PageConfig[]; // Optional when used in editor-only mode (no rendered form)\n}\n\n\n// ============ Output Types (SurveyJS JSON compatible) ============\n\nexport interface SurveyElementJSON {\n type: string;\n name: string;\n title?: string;\n isRequired?: boolean;\n maxLength?: number;\n storeDataAsText?: boolean;\n category?: string;\n [key: string]: unknown;\n}\n\nexport interface SurveyPageJSON {\n name: string;\n title: string;\n elements: Array<{\n type: string;\n name: string;\n elements: SurveyElementJSON[];\n }>;\n}\n\nexport interface SurveyJSON {\n title: string;\n logoPosition?: string;\n pages: SurveyPageJSON[];\n showQuestionNumbers?: string;\n questionErrorLocation?: string;\n completedHtml?: string;\n showTOC?: boolean;\n completeText?: string;\n showPreviewBeforeComplete?: string;\n showProgressBar?: string;\n widthMode?: string;\n width?: string;\n}\n\n// ============ Helper Types ============\n\nexport interface ResolvedField extends FieldData {\n name: string;\n}\n\n/**\n * Normalize a field to ensure backward compatibility\n * - Sets both `required` and `isRequired` to the same value\n */\nfunction normalizeField(field: ResolvedField): ResolvedField {\n // Spec: Fields are required by default unless explicitly false\n const isRequired = field.isRequired !== false && field.required !== false;\n return {\n ...field,\n required: isRequired,\n isRequired: isRequired\n };\n}\n\n/**\n * Resolve a field reference to a full field definition\n */\nfunction resolveFieldReference(\n ref: FieldReference, \n fields: Record<string, FieldData>\n): ResolvedField | null {\n if (typeof ref === \"string\") {\n // Simple string reference\n const fieldDef = fields[ref];\n if (!fieldDef) {\n console.warn(`Field \"${ref}\" not found in fields definition`);\n return null;\n }\n return normalizeField({ name: ref, ...fieldDef });\n }\n \n if (\"definition\" in ref) {\n // Inline definition\n return normalizeField(ref.definition as ResolvedField);\n }\n \n if (\"ref\" in ref) {\n // Reference with overrides\n const fieldDef = fields[ref.ref];\n if (!fieldDef) {\n console.warn(`Field \"${ref.ref}\" not found in fields definition`);\n return null;\n }\n const { ref: fieldName, ...overrides } = ref;\n return normalizeField({ name: fieldName, ...fieldDef, ...overrides });\n }\n \n return null;\n}\n\n/**\n * Apply dynamic title logic (e.g., bank statements with dynamic month labels,\n * financial statements with dynamic year labels)\n */\nexport function applyDynamicTitles(field: ResolvedField): ResolvedField {\n const bankStatementMatch = field.name.match(/^bank_statement_t(\\d+)$/);\n if (bankStatementMatch) {\n const monthsAgo = parseInt(bankStatementMatch[1], 10);\n return {\n ...field,\n displayName: `Bank Statement (${getPastMonthLabel(monthsAgo)})`\n };\n }\n if (field.name === \"financials\") {\n return {\n ...field,\n displayName: `Audited Financial Statement (${getPastYearLabel(1)})`\n };\n }\n return field;\n}\n\n/**\n * Generate SurveyJS JSON from unified form config\n */\nexport function generateSurveyJson(config: UnifiedFormConfig): SurveyJSON | Record<string, never> {\n if (!config.pages || config.pages.length === 0) return {};\n \n const firstPage = config.pages.find(p => p.id !== \"success-message\");\n if (!firstPage) return {};\n\n const categories = config.categories || [];\n const categoryMap: Record<string, string> = categories.reduce((acc, cat) => {\n acc[cat.id] = cat.name;\n return acc;\n }, {} as Record<string, string>);\n\n // Process all fields from the first page\n const processedFields = firstPage.fields\n .map(ref => resolveFieldReference(ref, config.fields))\n .filter((f): f is ResolvedField => f !== null)\n .map(f => applyDynamicTitles(f))\n .map(f => mapFieldToSurveyJS(f));\n\n // Group by Category\n const grouped = processedFields.reduce((acc: Record<string, SurveyElementJSON[]>, field) => {\n const catName = categoryMap[field.category as string] || \"Default\";\n if (!acc[catName]) acc[catName] = [];\n acc[catName].push(field);\n return acc;\n }, {} as Record<string, SurveyElementJSON[]>);\n\n // Build Pages (One Page per Category for Wizard effect)\n const pages: SurveyPageJSON[] = Object.entries(grouped).map(([categoryName, elements]) => ({\n name: categoryName.toLowerCase().replace(/\\s+/g, \"-\"),\n title: firstPage.showCategoryHeadings === false ? \"\" : categoryName,\n elements: [\n {\n type: \"panel\",\n name: `${categoryName.toLowerCase().replace(/\\s+/g, \"-\")}-panel`,\n elements: elements,\n },\n ],\n }));\n\n return {\n title: config.displayName || \"Flexible Financing Program\",\n logoPosition: \"right\",\n pages,\n showQuestionNumbers: \"off\",\n questionErrorLocation: \"bottom\",\n completedHtml: \"<h3>Thank you for completing the form</h3>\",\n showTOC: firstPage.showTOC ?? true,\n completeText: \"Submit\",\n showPreviewBeforeComplete: \"showAllQuestions\",\n showProgressBar: firstPage.showProgressBar === false ? \"off\" : \"top\",\n widthMode: \"responsive\",\n width: \"100%\",\n };\n}\n\n/**\n * Map a field definition to SurveyJS element format\n */\nfunction mapFieldToSurveyJS(field: ResolvedField): SurveyElementJSON {\n const element: SurveyElementJSON = {\n type: field.type,\n name: field.name,\n ...(field.displayName && { title: field.displayName }),\n isRequired: field.isRequired ?? field.required ?? false,\n ...(field.maxLength && { maxLength: Number(field.maxLength) }),\n };\n\n if (field.type === \"file\") {\n element.storeDataAsText = false;\n }\n\n // Copy other properties\n const excludeKeys = [\"displayName\", \"required\", \"category\"];\n Object.keys(field).forEach((key) => {\n if (!(key in element) && !excludeKeys.includes(key) && field[key] !== undefined) {\n element[key] = field[key];\n }\n });\n\n // Store category for grouping\n element.category = field.category ?? \"\";\n\n return element;\n}\n\n/**\n * Resolve all fields from a page to full field definitions\n */\nexport function resolvePageFields(\n page: PageConfig,\n fields: Record<string, FieldData>\n): ResolvedField[] {\n return page.fields\n .map(ref => resolveFieldReference(ref, fields))\n .filter((f): f is ResolvedField => f !== null)\n .map(f => applyDynamicTitles(f));\n}\n\n/**\n * Get category name from category ID (supports string or number IDs)\n */\nexport function getCategoryName(\n categoryId: string | undefined,\n categories: Category[]\n): string {\n if (categoryId === undefined) return \"Other\";\n const cat = categories.find(c => c.id === categoryId);\n return cat?.name || \"Other\";\n}\n\n/**\n * Group fields by their category, maintaining order and creating section breaks\n */\nexport interface FieldGroup {\n category: string;\n categoryName: string;\n fields: ResolvedField[];\n}\n\nexport function groupFieldsByCategory(\n fields: ResolvedField[],\n categories: Category[]\n): FieldGroup[] {\n const groups: FieldGroup[] = [];\n let currentGroup: FieldGroup | null = null;\n\n for (const field of fields) {\n const category = field.category ?? \"\";\n \n if (!currentGroup || currentGroup.category !== category) {\n currentGroup = {\n category,\n categoryName: getCategoryName(category, categories),\n fields: []\n };\n groups.push(currentGroup);\n }\n \n currentGroup.fields.push(field);\n }\n\n return groups;\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { z } from \"zod\";\nimport {\n type UnifiedFormConfig,\n type PageConfig,\n type FieldData,\n type FieldReference,\n type ResolvedField,\n type Category,\n resolvePageFields,\n groupFieldsByCategory,\n applyDynamicTitles,\n type FieldGroup\n} from \"./survey-generator.js\";\nimport { evaluateExpression } from \"./utils.js\";\n\nexport interface RHFStep {\n id: number;\n title: string;\n description?: string;\n fields: ResolvedField[];\n showCategoryHeadings: boolean;\n layout?: \"default\" | \"grid\" | \"vertical\";\n}\n\nexport interface RHFSchemaOutput {\n zodSchema: z.ZodTypeAny; // Can be ZodEffects\n baseSchema: z.ZodObject<any>;\n defaultValues: Record<string, any>;\n fields: ResolvedField[];\n groupedFields: FieldGroup[];\n steps: RHFStep[];\n displayName: string;\n categories: Category[];\n templateIcon?: string;\n}\n\n/**\n * Apply visibility-aware validation to a Zod schema\n */\nfunction applyVisibilityValidation(\n baseObject: z.ZodObject<any>, \n fields: ResolvedField[]\n): z.ZodTypeAny {\n return baseObject.superRefine((data, ctx) => {\n fields.forEach((field) => {\n const isRequired = field.isRequired !== false && field.required !== false && field.type !== \"html\";\n if (!isRequired) return;\n\n // Determine Visibility\n let isVisible = field.visible !== false;\n if (isVisible && field.visibleIf) {\n isVisible = evaluateExpression(field.visibleIf, data);\n }\n\n if (isVisible) {\n const value = data[field.name];\n const isEmpty = \n value === undefined || \n value === null || \n value === \"\" || \n (Array.isArray(value) && value.length === 0);\n\n if (isEmpty) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"This field is required\",\n path: [field.name],\n });\n }\n }\n });\n });\n}\n\nexport function generateRHFSchema(config: UnifiedFormConfig): RHFSchemaOutput {\n // ... (existing logic for collecting fields/building shape)\n const pages = config.pages || [];\n const categories = config.categories || [];\n const fieldsMap = config.fields || {};\n\n if (pages.length === 0) {\n throw new Error(\"v2.0.0 templates must include a 'pages' configuration.\");\n }\n\n // 1. Collect all fields from all pages\n const allFields: ResolvedField[] = [];\n \n for (const page of pages) {\n const pageFields = resolvePageFields(page, fieldsMap);\n allFields.push(...pageFields);\n }\n\n // Apply dynamic titles\n const mergedFields = allFields.map(applyDynamicTitles);\n\n // 2. Build Zod Shape & Default Values\n const shape: Record<string, z.ZodTypeAny> = {};\n const defaultValues: Record<string, any> = {};\n\n mergedFields.forEach((field) => {\n let schema: z.ZodTypeAny = z.string();\n\n // Track base type before validators/wrapping transform it via .refine()\n // (instanceof checks won't work after .refine() converts ZodString → ZodEffects)\n let baseType: \"string\" | \"number\" | \"array\" | \"boolean\" | \"any\" = \"string\";\n\n // --- Base Type Handling ---\n if (field.inputType === \"number\" || field.type === \"number\" || field.type === \"slider\" || field.type === \"range\") {\n schema = z.coerce.number();\n baseType = \"number\";\n defaultValues[field.name] = field.defaultValue !== undefined ? Number(field.defaultValue) : \"\";\n } else if (field.type === \"checkbox\") {\n schema = z.array(z.string());\n baseType = \"array\";\n defaultValues[field.name] = [];\n } else if (field.type === \"file\") {\n schema = z.array(z.any());\n baseType = \"array\";\n defaultValues[field.name] = [];\n } else if (field.type === \"boolean\") {\n schema = z.boolean();\n baseType = \"boolean\";\n defaultValues[field.name] = field.defaultValue ?? false;\n } else if (field.type === \"html\") {\n schema = z.any().optional();\n baseType = \"any\";\n defaultValues[field.name] = \"\";\n } else {\n if (Array.isArray(field.defaultValue)) {\n defaultValues[field.name] = field.defaultValue[0] || \"\";\n } else {\n defaultValues[field.name] = field.defaultValue ?? \"\";\n }\n }\n\n // --- Validation Constraints ---\n\n // Min/Max for Numbers\n if (baseType === \"number\" && schema instanceof z.ZodNumber) {\n let numSchema = schema;\n if (field.min !== undefined) numSchema = numSchema.min(Number(field.min), { message: `Minimum value is ${field.min}` });\n if (field.max !== undefined) numSchema = numSchema.max(Number(field.max), { message: `Maximum value is ${field.max}` });\n schema = numSchema;\n }\n\n const isRequired = field.isRequired !== false && field.required !== false && field.type !== \"html\";\n const isAlwaysVisible = field.visible !== false && !field.visibleIf;\n const isActuallyInput = field.type !== \"html\";\n\n // --- Required .min(1) for always-visible fields ---\n // Must be applied BEFORE validators (.refine) which change the schema type.\n if (isRequired && isAlwaysVisible && isActuallyInput) {\n if (baseType === \"string\" && schema instanceof z.ZodString) {\n schema = schema.min(1, { message: \"This field is required\" });\n } else if (baseType === \"array\" && schema instanceof z.ZodArray) {\n schema = schema.min(1, { message: \"Please select at least one option\" });\n }\n }\n\n // --- Enhancements: Validators ---\n // Applied BEFORE optional wrapping so instanceof checks still work on the\n // base type. The .refine() calls here will transform the schema to ZodEffects,\n // which is why we use baseType for subsequent decisions instead of instanceof.\n\n // Email\n const hasExplicitEmailValidator = field.validators?.some(v => v.type === \"email\");\n if ((field.inputType === \"email\" || field.name === \"email\") && baseType === \"string\" && schema instanceof z.ZodString && !hasExplicitEmailValidator) {\n schema = schema.refine(val => val === \"\" || z.string().email().safeParse(val).success, {\n message: \"Invalid email address\"\n });\n }\n\n // Legacy Validators (Regex / Numeric)\n if (field.validators) {\n field.validators.forEach((v) => {\n if (v.type === \"regex\" && v.regex) {\n try {\n const regex = new RegExp(v.regex);\n if (baseType === \"string\") {\n schema = schema.refine((val: any) => val === \"\" || regex.test(val), {\n message: v.text || \"Invalid format\"\n });\n }\n } catch (e) {\n console.warn(`Invalid regex pattern for field ${field.name}:`, v.regex);\n }\n }\n if (v.type === \"email\" && baseType === \"string\") {\n schema = schema.refine((val: any) => val === \"\" || z.string().email().safeParse(val).success, {\n message: v.text || \"Invalid email\"\n });\n }\n if (v.type === \"numeric\" && schema instanceof z.ZodNumber) {\n let numSchema = schema;\n if (v.minValue !== undefined) numSchema = numSchema.min(v.minValue, { message: v.text });\n if (v.maxValue !== undefined) numSchema = numSchema.max(v.maxValue, { message: v.text });\n schema = numSchema;\n }\n });\n }\n\n // --- Final Wrapper: Optional for conditional/hidden fields ---\n // Uses baseType instead of instanceof since validators may have transformed the schema.\n if (!(isRequired && isAlwaysVisible && isActuallyInput)) {\n if (baseType === \"number\") {\n schema = schema.optional().or(z.literal(\"\")).or(z.null());\n } else if (baseType === \"array\") {\n schema = schema.optional();\n } else if (baseType === \"boolean\") {\n schema = schema.optional();\n } else if (baseType === \"string\") {\n schema = schema.optional().or(z.literal(\"\"));\n }\n }\n\n shape[field.name] = schema;\n });\n\n // 3. Group Fields by Category\n const groupedFields = groupFieldsByCategory(mergedFields, categories);\n\n // 4. Build Steps (Dynamic Wizard)\n const steps: RHFStep[] = pages.map((page, idx) => {\n const pageFields = resolvePageFields(page, fieldsMap);\n\n return {\n id: idx,\n title: page.title || \"\",\n description: page.description,\n fields: pageFields,\n showCategoryHeadings: page.showCategoryHeadings ?? false,\n layout: page.layout\n };\n });\n\n // 5. Build Final Schema with Visibility-Aware Validation\n const baseObject = z.object(shape);\n const zodSchema = applyVisibilityValidation(baseObject, mergedFields);\n\n return {\n zodSchema,\n baseSchema: baseObject,\n defaultValues,\n fields: mergedFields,\n groupedFields,\n steps,\n displayName: config.displayName || \"Application Form\",\n categories,\n templateIcon: config.templateIcon\n };\n}\n\n/**\n * Get Zod schema for a specific step\n */\nexport function getStepSchema(step: RHFStep, fullSchema: any): z.ZodTypeAny {\n const stepFieldNames = step.fields.map(f => f.name);\n const stepShape: Record<string, z.ZodTypeAny> = {};\n \n // 1. Determine the base ZodObject\n let baseObj: z.ZodObject<any> | undefined;\n\n if (fullSchema instanceof z.ZodObject) {\n baseObj = fullSchema;\n } else if (fullSchema && typeof fullSchema === \"object\" && \"baseSchema\" in fullSchema) {\n baseObj = fullSchema.baseSchema as z.ZodObject<any>;\n } else if (fullSchema && \"_def\" in fullSchema && fullSchema._def.schema instanceof z.ZodObject) {\n // Basic Unwrap for ZodEffects\n baseObj = fullSchema._def.schema;\n }\n\n if (!baseObj) {\n console.warn(\"[RHF Generator] Could not extract ZodObject shape for step validation\");\n return z.object({});\n }\n\n const shape = baseObj.shape;\n const stepFields: ResolvedField[] = [];\n \n stepFieldNames.forEach(name => {\n if (name in shape) {\n stepShape[name] = shape[name];\n // Keep track of which fields are in this step\n const fieldDef = step.fields.find(f => f.name === name);\n if (fieldDef) stepFields.push(fieldDef);\n }\n });\n \n const stepBaseObject = z.object(stepShape);\n return applyVisibilityValidation(stepBaseObject, stepFields);\n}\n\n/**\n * Extract default values for a specific step\n */\nexport function getStepDefaultValues(\n step: RHFStep, \n allDefaults: Record<string, any>\n): Record<string, any> {\n const stepDefaults: Record<string, any> = {};\n \n step.fields.forEach(field => {\n if (field.name in allDefaults) {\n stepDefaults[field.name] = allDefaults[field.name];\n }\n });\n \n return stepDefaults;\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport AjvModule, { ErrorObject } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport unifiedFormSchema from \"./schema/unified-form.schema.json\" with { type: \"json\" };\n\n// Interop for Ajv which can be exported differently in ESM/CJS\nconst Ajv = (AjvModule as any).default || AjvModule;\nconst ajv = new Ajv({ allErrors: true, strict: false });\n\n// Interop for ajv-formats\nconst addFormatsFn = (addFormats as any).default || addFormats;\naddFormatsFn(ajv);\n\n// Register the unified schema\najv.addSchema(unifiedFormSchema, \"unified-form.schema.json\");\n\nexport interface ValidationResult {\n valid: boolean;\n errors?: ErrorObject[];\n message?: string;\n}\n\n/**\n * Validates a unified form-config.json object against its schema\n */\nexport function validateFormConfig(data: unknown): ValidationResult {\n const validate = ajv.getSchema(\"unified-form.schema.json\");\n if (!validate) {\n return { valid: false, message: \"Could not load unified form schema\" };\n }\n\n const valid = validate(data);\n return {\n valid: !!valid,\n errors: validate.errors || undefined,\n };\n}\n\n// Legacy exports - these now just call validateFormConfig\n/** @deprecated Use validateFormConfig instead */\nexport function validateFormSpec(data: unknown): ValidationResult {\n return validateFormConfig(data);\n}\n\n/** @deprecated Use validateFormConfig instead */\nexport function validatePagesConfig(data: unknown): ValidationResult {\n return validateFormConfig(data);\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Unified Form Configuration Schema\",\n \"description\": \"A unified schema combining field definitions and page layout configuration for multi-step forms.\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"description\": \"Reference to this JSON schema file\"\n },\n \"schemaVersion\": {\n \"type\": \"string\",\n \"pattern\": \"^v?[0-9]+\\\\.[0-9]+\\\\.[0-9]+$\",\n \"description\": \"Semantic version of the schema format (e.g., 'v2.0.0' or '2.0.0')\"\n },\n \"displayName\": {\n \"type\": \"string\",\n \"description\": \"The human-readable name of the loan product or form\"\n },\n \"templateIcon\": {\n \"type\": \"string\",\n \"description\": \"Icon identifier or path for the form template (used in FinSys editor)\"\n },\n \"categories\": {\n \"type\": \"array\",\n \"description\": \"Category definitions for field organization and grouping\",\n \"items\": {\n \"$ref\": \"#/definitions/category\"\n }\n },\n \"fields\": {\n \"type\": \"object\",\n \"description\": \"Master field definitions keyed by field name\",\n \"additionalProperties\": {\n \"$ref\": \"#/definitions/fieldData\"\n }\n },\n \"pages\": {\n \"type\": \"array\",\n \"description\": \"Ordered list of pages in the form wizard. Optional for FinSys editor mode.\",\n \"items\": {\n \"$ref\": \"#/definitions/pageConfig\"\n }\n }\n },\n \"required\": [\"categories\", \"fields\", \"pages\"],\n \"definitions\": {\n \"category\": {\n \"type\": \"object\",\n \"description\": \"A category for grouping related form fields\",\n \"properties\": {\n \"id\": { \n \"type\": \"string\",\n \"description\": \"Unique identifier for the category (string)\" \n },\n \"name\": { \"type\": \"string\", \"description\": \"Display name for the category heading\" }\n },\n \"required\": [\"id\", \"name\"]\n },\n \"choice\": {\n \"type\": \"object\",\n \"description\": \"A selectable option for dropdown or radiogroup fields\",\n \"properties\": {\n \"value\": { \"type\": \"string\", \"description\": \"Value submitted when this choice is selected\" },\n \"text\": { \"type\": \"string\", \"description\": \"Display text for this choice\" }\n },\n \"required\": [\"value\", \"text\"]\n },\n \"validator\": {\n \"type\": \"object\",\n \"description\": \"Validation rule for a form field\",\n \"properties\": {\n \"type\": { \n \"type\": \"string\",\n \"enum\": [\"regex\", \"email\", \"numeric\", \"text\", \"expression\", \"answercount\", \"custom\"],\n \"description\": \"Type of validation to perform\"\n },\n \"text\": { \"type\": \"string\", \"description\": \"Error message to display on validation failure\" },\n \"regex\": { \"type\": \"string\", \"description\": \"Regular expression pattern (for type=regex)\" },\n \"minValue\": { \"type\": \"number\", \"description\": \"Minimum numeric value (for type=numeric)\" },\n \"maxValue\": { \"type\": \"number\", \"description\": \"Maximum numeric value (for type=numeric)\" },\n \"minLength\": { \"type\": \"integer\", \"description\": \"Minimum text length (for type=text)\" },\n \"maxLength\": { \"type\": \"integer\", \"description\": \"Maximum text length (for type=text)\" },\n \"minCount\": { \"type\": \"integer\", \"description\": \"Minimum selection count (for type=answercount)\" },\n \"maxCount\": { \"type\": \"integer\", \"description\": \"Maximum selection count (for type=answercount)\" },\n \"expression\": { \"type\": \"string\", \"description\": \"SurveyJS expression for custom validation\" },\n \"validator\": { \"type\": \"string\", \"description\": \"Name of the custom validator function (for type=custom)\" }\n },\n \"required\": [\"type\"]\n },\n \"fieldData\": {\n \"type\": \"object\",\n \"description\": \"Definition of a form field\",\n \"properties\": {\n \"name\": { \n \"type\": \"string\", \n \"description\": \"Field name (optional in fields{} since it's the key, required in arrays)\"\n },\n \"displayName\": { \n \"type\": \"string\",\n \"description\": \"Human-readable label for the field\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"text\", \"number\", \"email\", \"file\", \"dropdown\", \"checkbox\", \"boolean\", \"comment\", \"radiogroup\", \"range\", \"html\", \"slider\"],\n \"description\": \"Field type determining rendering and behavior\"\n },\n \"inputType\": { \n \"type\": \"string\", \n \"enum\": [\"text\", \"number\", \"tel\", \"date\", \"email\", \"password\", \"url\"],\n \"description\": \"HTML input type override for text fields\" \n },\n \"category\": { \n \"type\": \"string\",\n \"description\": \"Category ID this field belongs to (string to match category.id)\" \n },\n \"categoryId\": { \n \"type\": \"integer\",\n \"description\": \"Legacy integer category ID (deprecated, prefer 'category')\"\n },\n \"maxLength\": { \"type\": [\"integer\", \"string\"], \"description\": \"Maximum character length\" },\n \"min\": { \"type\": [\"integer\", \"string\"], \"description\": \"Minimum value for numeric/slider fields\" },\n \"max\": { \"type\": [\"integer\", \"string\"], \"description\": \"Maximum value for numeric/slider fields\" },\n \"step\": { \"type\": \"number\", \"description\": \"Step increment for slider/range fields\" },\n \"html\": { \"type\": \"string\", \"description\": \"HTML content for type=html fields\" },\n \"choices\": {\n \"type\": \"array\",\n \"description\": \"Options for dropdown or radiogroup fields\",\n \"items\": { \"$ref\": \"#/definitions/choice\" }\n },\n \"validators\": {\n \"type\": \"array\",\n \"description\": \"Validation rules to apply to this field\",\n \"items\": { \"$ref\": \"#/definitions/validator\" }\n },\n \"visible\": { \n \"type\": \"boolean\", \n \"default\": true,\n \"description\": \"Whether the field is visible\"\n },\n \"visibleIf\": { \n \"type\": \"string\", \n \"description\": \"SurveyJS expression for conditional visibility\" \n },\n \"required\": { \n \"type\": \"boolean\",\n \"description\": \"Whether the field is required for form submission\"\n },\n \"isRequired\": { \n \"type\": \"boolean\", \n \"description\": \"Alias for 'required' (SurveyJS compatibility)\" \n },\n \"placeholder\": { \n \"type\": \"string\",\n \"description\": \"Placeholder text shown in empty field\"\n },\n \"defaultValue\": { \n \"type\": [\"string\", \"number\", \"boolean\", \"array\"],\n \"description\": \"Default value for the field\"\n },\n \"readOnly\": { \n \"type\": \"boolean\",\n \"description\": \"Whether the field is read-only\"\n },\n \"startWithNewLine\": { \n \"type\": \"boolean\",\n \"default\": true,\n \"description\": \"If false, field appears on same line as previous field\" \n },\n \"enableIf\": { \n \"type\": \"string\", \n \"description\": \"SurveyJS expression for conditional enable/disable\" \n },\n \"titleLocation\": { \n \"type\": \"string\", \n \"enum\": [\"default\", \"top\", \"bottom\", \"left\", \"hidden\"],\n \"description\": \"Position of the field label\"\n },\n \"ihs_column_names\": {\n \"type\": \"array\",\n \"description\": \"FinSys IHS column mappings for file fields (used for data extraction)\",\n \"items\": { \"type\": \"string\" }\n },\n \"requiredForEvaluation\": { \n \"type\": \"boolean\",\n \"default\": true,\n \"description\": \"Whether this field is required for loan evaluation (FinSys specific)\"\n }\n },\n \"required\": [\"type\"]\n },\n \"fieldReference\": {\n \"description\": \"Reference to a field in a page, supporting simple refs, refs with overrides, or inline definitions\",\n \"oneOf\": [\n { \n \"type\": \"string\", \n \"description\": \"Simple field name reference to a field defined in 'fields'\" \n },\n {\n \"type\": \"object\",\n \"description\": \"Field reference with optional property overrides\",\n \"properties\": {\n \"ref\": { \"type\": \"string\", \"description\": \"Reference to field name in 'fields' object\" },\n \"displayName\": { \"type\": \"string\", \"description\": \"Override display name for this page\" },\n \"type\": { \"type\": \"string\", \"description\": \"Override field type for this usage\" },\n \"defaultValue\": { \"type\": [\"string\", \"number\", \"boolean\", \"array\"] },\n \"readOnly\": { \"type\": \"boolean\" },\n \"visible\": { \"type\": \"boolean\" },\n \"visibleIf\": { \"type\": \"string\" },\n \"required\": { \"type\": \"boolean\" },\n \"min\": { \"type\": [\"integer\", \"string\"] },\n \"max\": { \"type\": [\"integer\", \"string\"] },\n \"choices\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/definitions/choice\" } }\n },\n \"required\": [\"ref\"]\n },\n {\n \"type\": \"object\",\n \"description\": \"Inline field definition (page-specific field not in master 'fields')\",\n \"properties\": {\n \"definition\": { \n \"allOf\": [\n { \"$ref\": \"#/definitions/fieldData\" },\n { \n \"type\": \"object\",\n \"properties\": {\n \"name\": { \"type\": \"string\" }\n },\n \"required\": [\"name\"]\n }\n ]\n }\n },\n \"required\": [\"definition\"]\n }\n ]\n },\n \"pageConfig\": {\n \"type\": \"object\",\n \"description\": \"Configuration for a single page/step in the form wizard\",\n \"properties\": {\n \"id\": { \"type\": \"string\", \"description\": \"Unique page identifier\" },\n \"title\": { \"type\": \"string\", \"description\": \"Page title displayed to user\" },\n \"description\": { \"type\": \"string\", \"description\": \"Optional page description or instructions\" },\n \"showTOC\": { \"type\": \"boolean\", \"default\": false, \"description\": \"Show table of contents\" },\n \"showProgressBar\": { \"type\": \"boolean\", \"default\": false, \"description\": \"Show progress indicator\" },\n \"showCategoryHeadings\": { \n \"type\": \"boolean\", \n \"default\": false,\n \"description\": \"Render category names as section headings when category changes between fields\"\n },\n \"layout\": { \n \"type\": \"string\", \n \"enum\": [\"default\", \"grid\", \"vertical\"],\n \"description\": \"Layout mode for the page\"\n },\n \"fields\": {\n \"type\": \"array\",\n \"description\": \"Ordered list of field references to display on this page\",\n \"items\": { \"$ref\": \"#/definitions/fieldReference\" }\n }\n },\n \"required\": [\"id\", \"fields\"]\n }\n }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class FormFieldCategory {\n private _id: string;\n private _name: string;\n\n constructor(id: string | number, name: string) {\n this._id = String(id);\n this._name = name;\n }\n\n get id(): string {\n return this._id;\n }\n\n get name(): string {\n return this._name;\n }\n\n set name(value: string) {\n this._name = value;\n }\n\n toJSON() {\n return {\n id: this._id,\n name: this._name,\n };\n }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { FieldData, Choice, Validator } from \"./survey-generator.js\";\n\nexport enum FieldType {\n FILE = 'file',\n TEXT = 'text',\n DROPDOWN = 'dropdown',\n BOOLEAN = 'boolean',\n CHECKBOX = 'checkbox',\n RADIOGROUP = 'radiogroup',\n SLIDER = 'slider',\n HTML = 'html',\n TAGBOX = 'tagbox',\n NUMBER = 'number',\n EMAIL = 'email',\n COMMENT = 'comment',\n RANGE = 'range',\n UNKNOWN = 'unknown',\n}\n\nexport interface FormFieldType {\n name: string;\n displayName: string;\n}\n\nexport interface FormFieldInputType {\n name: string;\n displayName: string;\n}\n\nexport interface FormFieldTypeDefinitions {\n version: number;\n types: FormFieldType[];\n input_types: FormFieldInputType[];\n}\n\nexport interface DropdownOption {\n id: number;\n name: string;\n displayName: string;\n choices: Choice[];\n}\n\nexport interface EditorValidator {\n id: number;\n displayName: string;\n class: string;\n description: string;\n isRequired: boolean;\n validators: Validator[];\n}\n\nfunction toFieldType(value: string): FieldType {\n const typeMap: Record<string, FieldType> = {\n [FieldType.FILE]: FieldType.FILE,\n [FieldType.TEXT]: FieldType.TEXT,\n [FieldType.DROPDOWN]: FieldType.DROPDOWN,\n [FieldType.BOOLEAN]: FieldType.BOOLEAN,\n [FieldType.CHECKBOX]: FieldType.CHECKBOX,\n [FieldType.RADIOGROUP]: FieldType.RADIOGROUP,\n [FieldType.SLIDER]: FieldType.SLIDER,\n [FieldType.HTML]: FieldType.HTML,\n [FieldType.TAGBOX]: FieldType.TAGBOX,\n [FieldType.NUMBER]: FieldType.NUMBER,\n [FieldType.EMAIL]: FieldType.EMAIL,\n [FieldType.COMMENT]: FieldType.COMMENT,\n [FieldType.RANGE]: FieldType.RANGE,\n };\n return typeMap[value] || FieldType.UNKNOWN;\n}\n\nexport default abstract class FormField {\n fieldObject: FieldData;\n\n constructor(name: string, displayName: string, type: string, category: string) {\n this.fieldObject = {\n name,\n displayName,\n type,\n category,\n };\n }\n\n static fromObject(fieldObject: FieldData): FormField {\n if (!fieldObject.name) {\n throw new Error('Field name is required');\n }\n\n if (!fieldObject.displayName || !fieldObject.category) {\n throw new Error(\n `Invalid field object: '${fieldObject.name}' field missing displayName or category`\n );\n }\n\n const identifiedType = toFieldType(fieldObject.type as string);\n if (identifiedType === FieldType.UNKNOWN) {\n throw new Error(\n `'${fieldObject.name}' field has unsupported or missing type: ${fieldObject.type}`\n );\n }\n\n if (\n fieldObject.choices &&\n !['dropdown', 'checkbox', 'radiogroup', 'tagbox'].includes(fieldObject.type as string)\n ) {\n // Logic remained as is\n }\n\n if (fieldObject.type === 'dropdown' && !fieldObject.choices) {\n throw new Error(\n `Invalid field object: '${fieldObject.name}' field has type dropdown, but does not have choices`\n );\n }\n\n let field: FormField;\n if (fieldObject.type === 'file') {\n field = new FileFormField(\n fieldObject.name,\n fieldObject.displayName || fieldObject.name,\n fieldObject.type,\n String(fieldObject.category),\n fieldObject.ihs_column_names || []\n );\n } else {\n field = new BasicFormField(\n fieldObject.name,\n fieldObject.displayName || fieldObject.name,\n fieldObject.type || 'text',\n String(fieldObject.category)\n );\n }\n\n field.fieldObject = { ...fieldObject };\n field.fieldObject.category = String(field.fieldObject.category);\n\n // Remove legacy categoryId property\n delete (field.fieldObject as any).categoryId;\n\n return field;\n }\n\n abstract getFieldNames(): string[];\n\n protected cleanObject(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n\n let target = obj;\n if (typeof obj.toJSON === 'function' && obj !== this) {\n target = obj.toJSON();\n }\n\n if (Array.isArray(target)) {\n return target.map((v: any) => (typeof v === 'object' ? this.cleanObject(v) : v));\n }\n\n if (typeof target !== 'object') return target;\n\n const cleaned: any = {};\n Object.keys(target).forEach((key) => {\n const value = target[key];\n if (value !== null && value !== undefined && value !== '') {\n if (typeof value === 'object') {\n cleaned[key] = this.cleanObject(value);\n } else {\n cleaned[key] = value;\n }\n }\n });\n return cleaned;\n }\n\n toJSON() {\n return this.cleanObject({ ...this.fieldObject });\n }\n\n get displayName(): string {\n return this.fieldObject.displayName || this.fieldObject.name || '';\n }\n\n set displayName(newDisplayName: string) {\n this.fieldObject.displayName = newDisplayName;\n }\n\n get name(): string {\n return this.fieldObject.name || '';\n }\n\n get type(): FieldType {\n return toFieldType(this.fieldObject.type as string);\n }\n\n get inputType(): string {\n return this.fieldObject.inputType ?? '';\n }\n\n get categoryId(): string {\n return String(this.fieldObject.category || '');\n }\n\n set categoryId(categoryId: string) {\n this.fieldObject.category = categoryId;\n }\n\n get defaultValue(): any {\n return this.fieldObject.defaultValue;\n }\n\n set defaultValue(value: any) {\n this.fieldObject.defaultValue = value;\n }\n\n get placeholder(): string | undefined {\n return this.fieldObject.placeholder;\n }\n\n get validators(): Validator[] | undefined {\n return this.fieldObject.validators as Validator[];\n }\n\n get choices(): Choice[] {\n return (this.fieldObject.choices as Choice[]) ?? [];\n }\n\n set choices(choices: Choice[]) {\n this.fieldObject.choices = choices;\n }\n\n get visible(): boolean {\n return this.fieldObject.visible ?? true;\n }\n\n get visibleIf(): string | undefined {\n return this.fieldObject.visibleIf;\n }\n\n get isRequired(): boolean {\n return this.fieldObject.required ?? this.fieldObject.isRequired ?? true;\n }\n\n get startWithNewLine(): boolean {\n return this.fieldObject.startWithNewLine ?? true;\n }\n\n get requiredForEvaluation(): boolean {\n return this.fieldObject.requiredForEvaluation ?? true;\n }\n\n get maxLength(): number | undefined {\n return typeof this.fieldObject.maxLength === 'string'\n ? Number.parseInt(this.fieldObject.maxLength)\n : this.fieldObject.maxLength;\n }\n\n get min(): number | undefined {\n return typeof this.fieldObject.min === 'string'\n ? Number.parseFloat(this.fieldObject.min)\n : this.fieldObject.min;\n }\n\n get max(): number | undefined {\n return typeof this.fieldObject.max === 'string'\n ? Number.parseFloat(this.fieldObject.max)\n : this.fieldObject.max;\n }\n}\n\nexport class BasicFormField extends FormField {\n constructor(name: string, displayName: string, type: string, category: string) {\n super(name, displayName, type, category);\n }\n\n getFieldNames(): string[] {\n if (this.fieldObject.requiredForEvaluation === false) {\n return [];\n }\n\n return [this.fieldObject.name!];\n }\n}\n\nexport class FileFormField extends FormField {\n constructor(\n name: string,\n displayName: string,\n type: string,\n category: string,\n ihs_column_names: string[]\n ) {\n super(name, displayName, type, category);\n this.fieldObject.ihs_column_names = ihs_column_names;\n }\n\n getFieldNames(): string[] {\n if (this.fieldObject.requiredForEvaluation === false) {\n return [];\n }\n\n return this.fieldObject.ihs_column_names || [];\n }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FormFieldCategory } from \"./form-field-category.js\";\nimport FormField from \"./form-field.js\";\nimport type { FieldData, PageConfig, UnifiedFormConfig } from \"./survey-generator.js\";\nimport { validateFormConfig } from \"./validator.js\";\nimport semver from \"semver\";\n\nexport class FormSpec {\n private _categories: FormFieldCategory[] = [];\n private _fields: FormField[] = [];\n private _displayName: string;\n private _templateIcon?: string;\n private _schemaVersion: string;\n private _pages: PageConfig[] = [];\n\n constructor(\n displayName: string,\n categories: FormFieldCategory[],\n fields: FormField[],\n pages: PageConfig[] = [],\n templateIcon?: string,\n schemaVersion: string = FormSpec.MAX_PARSER_SCHEMA_VERSION\n ) {\n this._displayName = displayName;\n this._templateIcon = templateIcon;\n this._categories = categories;\n this._fields = fields;\n this._pages = pages;\n this._schemaVersion = schemaVersion;\n }\n\n static readonly MIN_PARSER_SCHEMA_VERSION = 'v1.0.0';\n static readonly MAX_PARSER_SCHEMA_VERSION = 'v2.0.0';\n\n get fieldNames(): string[] {\n let names: string[] = [];\n\n this.fields.forEach((field) => {\n names = names.concat(field.getFieldNames());\n });\n\n return names;\n }\n\n get schemaVersion(): string {\n return this._schemaVersion;\n }\n\n get requiresUpgrade(): boolean {\n return semver.lt(this._schemaVersion, FormSpec.MAX_PARSER_SCHEMA_VERSION);\n }\n\n upgradeToV2(): void {\n this._schemaVersion = FormSpec.MAX_PARSER_SCHEMA_VERSION;\n }\n\n get displayName(): string {\n return this._displayName;\n }\n\n set displayName(newDisplayName: string) {\n this._displayName = newDisplayName;\n }\n\n get templateIcon(): string | undefined {\n return this._templateIcon;\n }\n\n set templateIcon(value: string | undefined) {\n this._templateIcon = value;\n }\n\n get categories(): FormFieldCategory[] {\n return this._categories;\n }\n\n set categories(categories: FormFieldCategory[]) {\n this._categories = categories;\n }\n\n get fields(): FormField[] {\n return this._fields;\n }\n\n set fields(fields: FormField[]) {\n this._fields = fields;\n }\n\n get pages(): PageConfig[] {\n return this._pages;\n }\n\n set pages(value: PageConfig[]) {\n this._pages = value;\n }\n\n addField(field: FormField): void {\n this._fields.push(field);\n }\n\n updateField(field: FormField): void {\n const index = this._fields.findIndex((f) => f.name === field.name);\n if (index !== -1) {\n this._fields[index] = field;\n } else {\n throw new Error(\n `${field.name} not found. Form Spec of ${this._displayName} cannot update ${field.name}`\n );\n }\n }\n\n removeField(fieldName: string): void {\n const fieldIndex = this._fields.findIndex((f) => f.name === fieldName);\n if (fieldIndex !== -1) {\n this._fields.splice(fieldIndex, 1);\n\n this._pages.forEach((page) => {\n page.fields = page.fields.filter((fieldRef) => {\n let refName: string | undefined;\n if (typeof fieldRef === 'string') {\n refName = fieldRef;\n } else if ('ref' in fieldRef) {\n refName = fieldRef.ref;\n } else if ('definition' in fieldRef) {\n refName = fieldRef.definition.name;\n }\n return refName !== fieldName;\n });\n });\n }\n }\n\n getFieldsByCategory(categoryName: string): FormField[] {\n const foundCategory = this.categories.find((category) => category.name === categoryName);\n\n if (!foundCategory) {\n return [];\n }\n\n return this._fields.filter((field) => field.categoryId === foundCategory.id);\n }\n\n validate(): { valid: boolean; errors?: any[] } {\n const config = this.toJSON() as UnifiedFormConfig;\n const result = validateFormConfig(config);\n const errors: any[] = [];\n\n if (result.errors) {\n result.errors.forEach((err: any) => {\n let path = err.instancePath || err.dataPath || '';\n path = path.replace(/^\\//, '').replace(/\\//g, '.');\n const prefix = path ? `${path}: ` : '';\n errors.push({\n message: `${prefix}${err.message}`,\n path: path,\n });\n });\n }\n\n if (!this._displayName || this._displayName.trim() === '') {\n errors.push({\n message: 'displayName: Form display name is required',\n path: 'displayName',\n });\n }\n\n const categoryIds = new Set(this._categories.map((c) => String(c.id)));\n this._fields.forEach((field) => {\n if (field.categoryId && !categoryIds.has(String(field.categoryId))) {\n errors.push({\n message: `fields.${field.name}.category: references non-existent category '${field.categoryId}'`,\n path: `fields.${field.name}.category`,\n });\n }\n });\n\n const fieldNames = new Set(this._fields.map((f) => f.name));\n this._pages.forEach((page, pageIndex) => {\n page.fields.forEach((fieldRef, fieldIndex) => {\n let refName: string | undefined;\n if (typeof fieldRef === 'string') {\n refName = fieldRef;\n } else if (fieldRef && (fieldRef as any).ref) {\n refName = (fieldRef as any).ref;\n } else if (fieldRef && (fieldRef as any).definition) {\n refName = (fieldRef as any).definition.name;\n }\n\n if (refName && !fieldNames.has(refName)) {\n errors.push({\n message: `pages.${pageIndex}.fields.${fieldIndex}: references non-existent field '${refName}'`,\n path: `pages.${pageIndex}.fields.${fieldIndex}`,\n });\n }\n });\n });\n\n return {\n valid: result.valid && errors.length === (result.errors?.length || 0),\n errors: errors.length > 0 ? errors : undefined,\n };\n }\n\n private cleanObject(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n\n let target = obj;\n if (typeof obj.toJSON === 'function' && obj !== this) {\n target = obj.toJSON();\n }\n\n if (Array.isArray(target)) {\n return target.map((v: any) => (typeof v === 'object' ? this.cleanObject(v) : v));\n }\n\n if (typeof target !== 'object') return target;\n\n const cleaned: any = {};\n Object.keys(target).forEach((key) => {\n const value = target[key];\n if (value !== null && value !== undefined && value !== '') {\n if (typeof value === 'object') {\n cleaned[key] = this.cleanObject(value);\n } else {\n cleaned[key] = value;\n }\n }\n });\n return cleaned;\n }\n\n toJSON(): object {\n const fieldsMap: Record<string, any> = {};\n this._fields.forEach((field) => {\n fieldsMap[field.name] = field.toJSON();\n delete fieldsMap[field.name].name;\n });\n\n return this.cleanObject({\n $schema:\n '../../../node_modules/@finsys/core/dist/schema/unified-form.schema.json',\n schemaVersion: this._schemaVersion,\n displayName: this._displayName,\n templateIcon: this._templateIcon,\n categories: this._categories,\n fields: fieldsMap,\n pages: this._pages,\n });\n }\n\n static fromJSON(jsonString: string): FormSpec {\n let jsonData: any;\n try {\n jsonData = JSON.parse(jsonString);\n } catch (error) {\n console.error(`Error parsing JSON for Loantype with string: ${jsonString}`);\n throw error;\n }\n\n if (!jsonData.schemaVersion) {\n throw new Error('Invalid JSON: schemaVersion is missing or invalid');\n }\n\n if (semver.lt(jsonData.schemaVersion, FormSpec.MIN_PARSER_SCHEMA_VERSION)) {\n throw new Error(\n `This form spec file is using an outdated schema version ${jsonData.schemaVersion}. Minimum supported version is ${FormSpec.MIN_PARSER_SCHEMA_VERSION}`\n );\n }\n\n if (!jsonData.displayName) {\n throw new Error('Invalid JSON: displayName is missing or invalid');\n }\n\n if (!jsonData.categories) {\n throw new Error('Invalid JSON: categories is missing or invalid');\n }\n\n if (!jsonData.fields) {\n throw new Error('Invalid JSON: fields is missing or invalid');\n }\n\n if (!jsonData.pages || jsonData.pages.length === 0) {\n if (semver.satisfies(jsonData.schemaVersion, '>=2.0.0')) {\n console.warn(\n `v2.0.0 template ${jsonData.displayName} is missing pages. Generating default pages.`\n );\n }\n }\n\n let fieldObjects: FieldData[] = [];\n if (Array.isArray(jsonData.fields)) {\n fieldObjects = jsonData.fields;\n } else if (typeof jsonData.fields === 'object' && jsonData.fields !== null) {\n fieldObjects = Object.entries(jsonData.fields).map(([name, data]: [string, any]) => {\n return {\n name,\n ...data,\n };\n });\n }\n\n fieldObjects.forEach((f: any) => {\n if (f.categoryId && !f.category) {\n f.category = String(f.categoryId);\n } else if (f.category) {\n f.category = String(f.category);\n }\n });\n\n const categories = (jsonData.categories || []).map((cat: any) => {\n return new FormFieldCategory(String(cat.id), cat.name);\n });\n\n const fields: FormField[] = fieldObjects.map((fieldObject) => {\n return FormField.fromObject(fieldObject);\n });\n\n let pages = jsonData.pages || [];\n if (pages.length === 0) {\n const categoriesMap: Record<string, string[]> = {};\n fields.forEach((f) => {\n const catId = f.categoryId;\n if (!categoriesMap[catId]) {\n categoriesMap[catId] = [];\n }\n categoriesMap[catId].push(f.name);\n });\n\n pages = categories\n .map((cat: FormFieldCategory) => ({\n id: `page-${cat.id}`,\n title: cat.name,\n fields: categoriesMap[cat.id] || [],\n }))\n .filter((p: PageConfig) => p.fields.length > 0);\n }\n\n return new FormSpec(\n jsonData.displayName,\n categories,\n fields,\n pages,\n jsonData.templateIcon,\n jsonData.schemaVersion\n );\n }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Validator } from \"./survey-generator.js\";\nimport type { EditorValidator } from \"./form-field.js\";\n\nexport interface FormValidatorDefinitions {\n options: EditorValidator[];\n version: number;\n}\n\nexport class FormFieldValidator implements EditorValidator {\n id: number;\n displayName: string;\n class: string;\n description: string;\n isRequired: boolean;\n validators: Validator[];\n\n constructor(validatorData: EditorValidator) {\n this.id = validatorData.id;\n this.displayName = validatorData.displayName;\n this.class = validatorData.class;\n this.description = validatorData.description;\n this.isRequired = validatorData.isRequired;\n this.validators = validatorData.validators;\n }\n\n validate(value: any): boolean {\n for (const validator of this.validators) {\n switch (validator.type) {\n case 'numeric':\n if (!this.validateNumeric(value, validator.minValue, validator.maxValue)) {\n return false;\n }\n break;\n case 'text':\n if (!this.validateText(value, validator.minLength, validator.maxLength)) {\n return false;\n }\n break;\n }\n }\n return true;\n }\n\n private validateNumeric(value: number, min?: number, max?: number): boolean {\n if (min !== undefined && value < min) return false;\n if (max !== undefined && value > max) return false;\n return true;\n }\n\n private validateText(value: string, minLength?: number, maxLength?: number): boolean {\n if (minLength !== undefined && value.length < minLength) return false;\n if (maxLength !== undefined && value.length > maxLength) return false;\n return true;\n }\n}\n","{\n \"schemaVersion\": \"v2.0.0\",\n \"categories\": [\n {\n \"id\": \"1\",\n \"name\": \"Basic Information\"\n },\n {\n \"id\": \"2\",\n \"name\": \"Personal Information\"\n },\n {\n \"id\": \"3\",\n \"name\": \"Company Information\"\n },\n {\n \"id\": \"4\",\n \"name\": \"Financial Information\"\n },\n {\n \"id\": \"5\",\n \"name\": \"Employment Information\"\n },\n {\n \"id\": \"6\",\n \"name\": \"Consent and Legal Agreements\"\n },\n {\n \"id\": \"7\",\n \"name\": \"Address Information\"\n },\n {\n \"id\": \"8\",\n \"name\": \"Contact Information\"\n },\n {\n \"id\": \"9\",\n \"name\": \"Declarations\"\n },\n {\n \"id\": \"10\",\n \"name\": \"Account Information\"\n },\n {\n \"id\": \"11\",\n \"name\": \"Loan Information\"\n },\n {\n \"id\": \"12\",\n \"name\": \"Vehicle Information\"\n },\n {\n \"id\": \"13\",\n \"name\": \"Document Upload\"\n }\n ],\n \"fields\": [\n {\n \"name\": \"fullName\",\n \"displayName\": \"Full Name\",\n \"placeholder\": \"E.g. John Doe\",\n \"type\": \"text\",\n \"maxLength\": 80,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please make sure the name doesn't include extra spaces, numbers, or invalid symbols\",\n \"regex\": \"^[A-Za-z'-]+(?:\\\\s[A-Za-z'-]+)*\\\\s?[A-Za-z'-]+$\"\n }\n ],\n \"category\": \"1\"\n },\n {\n \"name\": \"email\",\n \"displayName\": \"Email\",\n \"placeholder\": \"E.g. johndoe@example.com\",\n \"type\": \"text\",\n \"inputType\": \"email\",\n \"maxLength\": 65,\n \"validators\": [\n {\n \"type\": \"email\",\n \"text\": \"Value must be a valid email\"\n }\n ],\n \"category\": \"1\"\n },\n {\n \"name\": \"mobilePhoneNoAreaCode\",\n \"displayName\": \"Mobile Phone Number Area Code\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"1\"\n },\n {\n \"name\": \"mobilePhoneNo\",\n \"displayName\": \"Mobile Phone Number\",\n \"placeholder\": \"Mobile Phone Number\",\n \"type\": \"text\",\n \"inputType\": \"tel\",\n \"maxLength\": 12,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"A valid Malaysia phone number is required.\",\n \"regex\": \"^(011[0-9]{8}|01[2346789][0-9]{7}|[2-9][0-9]{0,8})$\"\n }\n ],\n \"category\": \"1\"\n },\n {\n \"type\": \"text\",\n \"name\": \"idNumber\",\n \"title\": \"ID Number\",\n \"placeholder\": \"E.g. 700513065143\",\n \"isRequired\": true,\n \"displayName\": \"IC Number\",\n \"maxLength\": 25,\n \"inputType\": \"text\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d{12}$\",\n \"text\": \"Please enter exactly 12 digits numbers\"\n },\n {\n \"type\": \"regex\",\n \"regex\": \"^(\\\\d{2})(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])\\\\d{6}$\",\n \"text\": \"First 6 digits must be valid birth year (00-99), month (01-12), and day (01-31)\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"dateOfBirth\",\n \"displayName\": \"Date of Birth\",\n \"type\": \"text\",\n \"inputType\": \"date\",\n \"visible\": false,\n \"category\": \"2\"\n },\n {\n \"name\": \"companyName\",\n \"displayName\": \"Company Name\",\n \"type\": \"text\",\n \"category\": \"3\"\n },\n {\n \"name\": \"companyRegNo\",\n \"displayName\": \"Company Registration Number\",\n \"type\": \"text\",\n \"category\": \"3\"\n },\n {\n \"name\": \"natureOfBusiness\",\n \"displayName\": \"Nature of Business\",\n \"placeholder\": \"Select your Nature of Business\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Manufacturing\",\n \"text\": \"Manufacturing\"\n },\n {\n \"value\": \"Services\",\n \"text\": \"Services\"\n },\n {\n \"value\": \"Others\",\n \"text\": \"Others\"\n }\n ],\n \"maxLength\": 80,\n \"category\": \"3\"\n },\n {\n \"name\": \"officeFacilityType\",\n \"displayName\": \"Office Facility Type\",\n \"placeholder\": \"Select your facility type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Owned\",\n \"text\": \"Owned\"\n },\n {\n \"value\": \"Rented\",\n \"text\": \"Rented\"\n }\n ],\n \"maxLength\": 80,\n \"category\": \"3\"\n },\n {\n \"name\": \"companySize\",\n \"displayName\": \"Company Size\",\n \"placeholder\": \"Select your company size\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"selfEmplyed\",\n \"text\": \"Self-employed\"\n },\n {\n \"value\": \"1-10\",\n \"text\": \"1-10\"\n },\n {\n \"value\": \"11-20\",\n \"text\": \"11-20\"\n },\n {\n \"value\": \"21-30\",\n \"text\": \"21-30\"\n },\n {\n \"value\": \"31-50\",\n \"text\": \"31-50\"\n },\n {\n \"value\": \"51-100\",\n \"text\": \"51-100\"\n },\n {\n \"value\": \"101-500\",\n \"text\": \"101-500\"\n },\n {\n \"value\": \"500+\",\n \"text\": \"500+\"\n }\n ],\n \"category\": \"3\"\n },\n {\n \"name\": \"facilityAddress\",\n \"displayName\": \"Facility Address\",\n \"type\": \"text\",\n \"category\": \"3\"\n },\n {\n \"name\": \"companyEntityType\",\n \"displayName\": \"Company Entity Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Branch office\",\n \"text\": \"Branch office\"\n },\n {\n \"value\": \"Company Limited by guarantee\",\n \"text\": \"Company Limited by guarantee\"\n },\n {\n \"value\": \"Enterprise or Sole Proprietorship\",\n \"text\": \"Enterprise or Sole Proprietorship\"\n },\n {\n \"value\": \"Foreign Companies\",\n \"text\": \"Foreign Companies\"\n },\n {\n \"value\": \"Limited Liability Partnership\",\n \"text\": \"Limited Liability Partnership\"\n },\n {\n \"value\": \"Partnership\",\n \"text\": \"Partnership\"\n },\n {\n \"value\": \"Private Limited Company (Sdn. Bhd.)\",\n \"text\": \"Private Limited Company (Sdn. Bhd.)\"\n },\n {\n \"value\": \"Public Limited Company (Bhd.)\",\n \"text\": \"Public Limited Company (Bhd.)\"\n },\n {\n \"value\": \"Proprietorship/ Partnership\",\n \"text\": \"Proprietorship/ Partnership\"\n }\n ],\n \"category\": \"3\"\n },\n {\n \"name\": \"tnbTariff\",\n \"displayName\": \"TNB Tariff\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"B\",\n \"text\": \"B\"\n },\n {\n \"value\": \"C1\",\n \"text\": \"C1\"\n },\n {\n \"value\": \"C2\",\n \"text\": \"C2\"\n },\n {\n \"value\": \"D\",\n \"text\": \"D\"\n },\n {\n \"value\": \"E1\",\n \"text\": \"E1\"\n },\n {\n \"value\": \"E2\",\n \"text\": \"E2\"\n },\n {\n \"value\": \"E3\",\n \"text\": \"E3\"\n },\n {\n \"value\": \"H\",\n \"text\": \"H\"\n },\n {\n \"value\": \"H1\",\n \"text\": \"H1\"\n },\n {\n \"value\": \"H2\",\n \"text\": \"H2\"\n }\n ],\n \"category\": \"4\"\n },\n {\n \"name\": \"avgMaximumDemand\",\n \"displayName\": \"Average Maximum Demand\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"ctRatio\",\n \"displayName\": \"CT Ratio\",\n \"type\": \"text\",\n \"category\": \"4\"\n },\n {\n \"name\": \"buildingType\",\n \"displayName\": \"Building Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Warehouse/Factory\",\n \"text\": \"Warehouse/Factory\"\n },\n {\n \"value\": \"Office building/Shoplot\",\n \"text\": \"Office building/Shoplot\"\n },\n {\n \"value\": \"Shopping Mall/Complex\",\n \"text\": \"Shopping Mall/Complex\"\n },\n {\n \"value\": \"School\",\n \"text\": \"School\"\n },\n {\n \"value\": \"Other\",\n \"text\": \"Other\"\n }\n ],\n \"category\": \"3\"\n },\n {\n \"name\": \"tnbBills\",\n \"displayName\": \"TNB Bills\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"2\"\n },\n {\n \"name\": \"financingSelection\",\n \"displayName\": \"Financing Selection\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Loan\",\n \"text\": \"Loan\"\n },\n {\n \"value\": \"Leasing\",\n \"text\": \"Leasing\"\n },\n {\n \"value\": \"Extended Terms\",\n \"text\": \"Extended Terms\"\n }\n ],\n \"category\": \"4\"\n },\n {\n \"name\": \"businessSector\",\n \"displayName\": \"Business Sector\",\n \"type\": \"text\",\n \"category\": \"5\"\n },\n {\n \"name\": \"companyBackground\",\n \"displayName\": \"Company Background\",\n \"type\": \"text\",\n \"category\": \"3\"\n },\n {\n \"name\": \"isApplication\",\n \"displayName\": \"Is Application\",\n \"type\": \"boolean\",\n \"category\": \"6\"\n },\n {\n \"name\": \"isReview\",\n \"displayName\": \"Is Review\",\n \"type\": \"boolean\",\n \"category\": \"6\"\n },\n {\n \"name\": \"addressLine1\",\n \"displayName\": \"Address Line 1\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"addressLine2\",\n \"displayName\": \"Address Line 2\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"addressLine3\",\n \"displayName\": \"Address Line 3\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"addressType\",\n \"displayName\": \"Address Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"P\",\n \"text\": \"Permanent\"\n },\n {\n \"value\": \"O\",\n \"text\": \"Office\"\n },\n {\n \"value\": \"R\",\n \"text\": \"Residence\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"city\",\n \"displayName\": \"City\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"country\",\n \"displayName\": \"Country\",\n \"type\": \"dropdown\",\n \"titleLocation\": \"hidden\",\n \"placeholder\": \"Country\",\n \"choices\": [\n {\n \"text\": \"Afghanistan\",\n \"value\": \"AFG\"\n },\n {\n \"text\": \"Angola\",\n \"value\": \"ANG\"\n },\n {\n \"text\": \"Albania\",\n \"value\": \"ALB\"\n },\n {\n \"text\": \"Andorra\",\n \"value\": \"AND\"\n },\n {\n \"text\": \"United Arab Emirates\",\n \"value\": \"UAE\"\n },\n {\n \"text\": \"Argentina\",\n \"value\": \"ARG\"\n },\n {\n \"text\": \"Armenia\",\n \"value\": \"ARM\"\n },\n {\n \"text\": \"Antigua and Barbuda\",\n \"value\": \"ANT\"\n },\n {\n \"text\": \"Australia\",\n \"value\": \"AUS\"\n },\n {\n \"text\": \"Austria\",\n \"value\": \"AUT\"\n },\n {\n \"text\": \"Azerbaijan\",\n \"value\": \"AZE\"\n },\n {\n \"text\": \"Burundi\",\n \"value\": \"BDI\"\n },\n {\n \"text\": \"Belgium\",\n \"value\": \"BEL\"\n },\n {\n \"text\": \"Benin\",\n \"value\": \"BEN\"\n },\n {\n \"text\": \"Burkina Faso\",\n \"value\": \"BFA\"\n },\n {\n \"text\": \"Bangladesh\",\n \"value\": \"BGD\"\n },\n {\n \"text\": \"Bulgaria\",\n \"value\": \"BUL\"\n },\n {\n \"text\": \"Bahrain\",\n \"value\": \"BRN\"\n },\n {\n \"text\": \"Bahamas\",\n \"value\": \"BAH\"\n },\n {\n \"text\": \"Bosnia and Herzegovina\",\n \"value\": \"BIH\"\n },\n {\n \"text\": \"Belarus\",\n \"value\": \"BLR\"\n },\n {\n \"text\": \"Belize\",\n \"value\": \"BIZ\"\n },\n {\n \"text\": \"Bolivia\",\n \"value\": \"BOL\"\n },\n {\n \"text\": \"Brazil\",\n \"value\": \"BRA\"\n },\n {\n \"text\": \"Barbados\",\n \"value\": \"BAR\"\n },\n {\n \"text\": \"Brunei\",\n \"value\": \"BRU\"\n },\n {\n \"text\": \"Bhutan\",\n \"value\": \"BHU\"\n },\n {\n \"text\": \"Botswana\",\n \"value\": \"BOT\"\n },\n {\n \"text\": \"Central African Republic\",\n \"value\": \"CAF\"\n },\n {\n \"text\": \"Canada\",\n \"value\": \"CAN\"\n },\n {\n \"text\": \"Switzerland\",\n \"value\": \"CHE\"\n },\n {\n \"text\": \"Chile\",\n \"value\": \"CHI\"\n },\n {\n \"text\": \"China\",\n \"value\": \"CHN\"\n },\n {\n \"text\": \"Ivory Coast\",\n \"value\": \"CIV\"\n },\n {\n \"text\": \"Cameroon\",\n \"value\": \"CMR\"\n },\n {\n \"text\": \"DR Congo\",\n \"value\": \"COD\"\n },\n {\n \"text\": \"Republic of the Congo\",\n \"value\": \"CGO\"\n },\n {\n \"text\": \"Colombia\",\n \"value\": \"COL\"\n },\n {\n \"text\": \"Comoros\",\n \"value\": \"COM\"\n },\n {\n \"text\": \"Cape Verde\",\n \"value\": \"CPV\"\n },\n {\n \"text\": \"Costa Rica\",\n \"value\": \"CRC\"\n },\n {\n \"text\": \"Cuba\",\n \"value\": \"CUB\"\n },\n {\n \"text\": \"Cyprus\",\n \"value\": \"CYP\"\n },\n {\n \"text\": \"Czechia\",\n \"value\": \"CZE\"\n },\n {\n \"text\": \"Germany\",\n \"value\": \"DEU\"\n },\n {\n \"text\": \"Djibouti\",\n \"value\": \"DJI\"\n },\n {\n \"text\": \"Dominica\",\n \"value\": \"DMA\"\n },\n {\n \"text\": \"Denmark\",\n \"value\": \"DEN\"\n },\n {\n \"text\": \"Dominican Republic\",\n \"value\": \"DOM\"\n },\n {\n \"text\": \"Algeria\",\n \"value\": \"ALG\"\n },\n {\n \"text\": \"Ecuador\",\n \"value\": \"ECU\"\n },\n {\n \"text\": \"Egypt\",\n \"value\": \"EGY\"\n },\n {\n \"text\": \"Eritrea\",\n \"value\": \"ERI\"\n },\n {\n \"text\": \"Spain\",\n \"value\": \"ESP\"\n },\n {\n \"text\": \"Estonia\",\n \"value\": \"EST\"\n },\n {\n \"text\": \"Ethiopia\",\n \"value\": \"ETH\"\n },\n {\n \"text\": \"Finland\",\n \"value\": \"FIN\"\n },\n {\n \"text\": \"Fiji\",\n \"value\": \"FIJ\"\n },\n {\n \"text\": \"France\",\n \"value\": \"FRA\"\n },\n {\n \"text\": \"Micronesia\",\n \"value\": \"FSM\"\n },\n {\n \"text\": \"Gabon\",\n \"value\": \"GAB\"\n },\n {\n \"text\": \"United Kingdom\",\n \"value\": \"GBR\"\n },\n {\n \"text\": \"Georgia\",\n \"value\": \"GEO\"\n },\n {\n \"text\": \"Ghana\",\n \"value\": \"GHA\"\n },\n {\n \"text\": \"Guinea\",\n \"value\": \"GUI\"\n },\n {\n \"text\": \"Gambia\",\n \"value\": \"GAM\"\n },\n {\n \"text\": \"Equatorial Guinea\",\n \"value\": \"GEQ\"\n },\n {\n \"text\": \"Greece\",\n \"value\": \"GRE\"\n },\n {\n \"text\": \"Grenada\",\n \"value\": \"GRN\"\n },\n {\n \"text\": \"Guatemala\",\n \"value\": \"GUA\"\n },\n {\n \"text\": \"Guyana\",\n \"value\": \"GUY\"\n },\n {\n \"text\": \"Honduras\",\n \"value\": \"HON\"\n },\n {\n \"text\": \"Croatia\",\n \"value\": \"CRO\"\n },\n {\n \"text\": \"Haiti\",\n \"value\": \"HAI\"\n },\n {\n \"text\": \"Hungary\",\n \"value\": \"HUN\"\n },\n {\n \"text\": \"Indonesia\",\n \"value\": \"INA\"\n },\n {\n \"text\": \"India\",\n \"value\": \"IND\"\n },\n {\n \"text\": \"Ireland\",\n \"value\": \"IRL\"\n },\n {\n \"text\": \"Iran\",\n \"value\": \"IRI\"\n },\n {\n \"text\": \"Iraq\",\n \"value\": \"IRQ\"\n },\n {\n \"text\": \"Iceland\",\n \"value\": \"ISL\"\n },\n {\n \"text\": \"Israel\",\n \"value\": \"ISR\"\n },\n {\n \"text\": \"Italy\",\n \"value\": \"ITA\"\n },\n {\n \"text\": \"Jamaica\",\n \"value\": \"JAM\"\n },\n {\n \"text\": \"Jordan\",\n \"value\": \"JOR\"\n },\n {\n \"text\": \"Japan\",\n \"value\": \"JPN\"\n },\n {\n \"text\": \"Kazakhstan\",\n \"value\": \"KAZ\"\n },\n {\n \"text\": \"Kenya\",\n \"value\": \"KEN\"\n },\n {\n \"text\": \"Kyrgyzstan\",\n \"value\": \"KGZ\"\n },\n {\n \"text\": \"Cambodia\",\n \"value\": \"KHM\"\n },\n {\n \"text\": \"Kiribati\",\n \"value\": \"KIR\"\n },\n {\n \"text\": \"Saint Kitts and Nevis\",\n \"value\": \"SKN\"\n },\n {\n \"text\": \"South Korea\",\n \"value\": \"KOR\"\n },\n {\n \"text\": \"Kuwait\",\n \"value\": \"KUW\"\n },\n {\n \"text\": \"Laos\",\n \"value\": \"LAO\"\n },\n {\n \"text\": \"Lebanon\",\n \"value\": \"LIB\"\n },\n {\n \"text\": \"Liberia\",\n \"value\": \"LBR\"\n },\n {\n \"text\": \"Libya\",\n \"value\": \"LBA\"\n },\n {\n \"text\": \"Saint Lucia\",\n \"value\": \"LCA\"\n },\n {\n \"text\": \"Liechtenstein\",\n \"value\": \"LIE\"\n },\n {\n \"text\": \"Sri Lanka\",\n \"value\": \"SRI\"\n },\n {\n \"text\": \"Lesotho\",\n \"value\": \"LES\"\n },\n {\n \"text\": \"Lithuania\",\n \"value\": \"LTU\"\n },\n {\n \"text\": \"Luxembourg\",\n \"value\": \"LUX\"\n },\n {\n \"text\": \"Latvia\",\n \"value\": \"LAT\"\n },\n {\n \"text\": \"Morocco\",\n \"value\": \"MAR\"\n },\n {\n \"text\": \"Monaco\",\n \"value\": \"MON\"\n },\n {\n \"text\": \"Moldova\",\n \"value\": \"MDA\"\n },\n {\n \"text\": \"Madagascar\",\n \"value\": \"MAD\"\n },\n {\n \"text\": \"Maldives\",\n \"value\": \"MDV\"\n },\n {\n \"text\": \"Mexico\",\n \"value\": \"MEX\"\n },\n {\n \"text\": \"Marshall Islands\",\n \"value\": \"MHL\"\n },\n {\n \"text\": \"North Macedonia\",\n \"value\": \"MKD\"\n },\n {\n \"text\": \"Mali\",\n \"value\": \"MLI\"\n },\n {\n \"text\": \"Malta\",\n \"value\": \"MLT\"\n },\n {\n \"text\": \"Myanmar\",\n \"value\": \"MYA\"\n },\n {\n \"text\": \"Montenegro\",\n \"value\": \"MNE\"\n },\n {\n \"text\": \"Mongolia\",\n \"value\": \"MGL\"\n },\n {\n \"text\": \"Mozambique\",\n \"value\": \"MOZ\"\n },\n {\n \"text\": \"Mauritania\",\n \"value\": \"MTN\"\n },\n {\n \"text\": \"Mauritius\",\n \"value\": \"MRI\"\n },\n {\n \"text\": \"Malawi\",\n \"value\": \"MAW\"\n },\n {\n \"text\": \"Malaysia\",\n \"value\": \"MAS\"\n },\n {\n \"text\": \"Namibia\",\n \"value\": \"NAM\"\n },\n {\n \"text\": \"Niger\",\n \"value\": \"NIG\"\n },\n {\n \"text\": \"Nigeria\",\n \"value\": \"NGR\"\n },\n {\n \"text\": \"Nicaragua\",\n \"value\": \"NCA\"\n },\n {\n \"text\": \"Netherlands\",\n \"value\": \"NED\"\n },\n {\n \"text\": \"Norway\",\n \"value\": \"NOR\"\n },\n {\n \"text\": \"Nepal\",\n \"value\": \"NEP\"\n },\n {\n \"text\": \"Nauru\",\n \"value\": \"NRU\"\n },\n {\n \"text\": \"New Zealand\",\n \"value\": \"NZL\"\n },\n {\n \"text\": \"Oman\",\n \"value\": \"OMA\"\n },\n {\n \"text\": \"Pakistan\",\n \"value\": \"PAK\"\n },\n {\n \"text\": \"Panama\",\n \"value\": \"PAN\"\n },\n {\n \"text\": \"Peru\",\n \"value\": \"PER\"\n },\n {\n \"text\": \"Philippines\",\n \"value\": \"PHI\"\n },\n {\n \"text\": \"Palau\",\n \"value\": \"PLW\"\n },\n {\n \"text\": \"Papua New Guinea\",\n \"value\": \"PNG\"\n },\n {\n \"text\": \"Poland\",\n \"value\": \"POL\"\n },\n {\n \"text\": \"North Korea\",\n \"value\": \"PRK\"\n },\n {\n \"text\": \"Portugal\",\n \"value\": \"POR\"\n },\n {\n \"text\": \"Paraguay\",\n \"value\": \"PAR\"\n },\n {\n \"text\": \"Qatar\",\n \"value\": \"QAT\"\n },\n {\n \"text\": \"Romania\",\n \"value\": \"ROU\"\n },\n {\n \"text\": \"Russia\",\n \"value\": \"RUS\"\n },\n {\n \"text\": \"Rwanda\",\n \"value\": \"RWA\"\n },\n {\n \"text\": \"Saudi Arabia\",\n \"value\": \"KSA\"\n },\n {\n \"text\": \"Sudan\",\n \"value\": \"SUD\"\n },\n {\n \"text\": \"Senegal\",\n \"value\": \"SEN\"\n },\n {\n \"text\": \"Singapore\",\n \"value\": \"SIN\"\n },\n {\n \"text\": \"Solomon Islands\",\n \"value\": \"SOL\"\n },\n {\n \"text\": \"Sierra Leone\",\n \"value\": \"SLE\"\n },\n {\n \"text\": \"El Salvador\",\n \"value\": \"ESA\"\n },\n {\n \"text\": \"San Marino\",\n \"value\": \"SMR\"\n },\n {\n \"text\": \"Somalia\",\n \"value\": \"SOM\"\n },\n {\n \"text\": \"Serbia\",\n \"value\": \"SRB\"\n },\n {\n \"text\": \"S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe\",\n \"value\": \"STP\"\n },\n {\n \"text\": \"Suriname\",\n \"value\": \"SUR\"\n },\n {\n \"text\": \"Slovakia\",\n \"value\": \"SVK\"\n },\n {\n \"text\": \"Slovenia\",\n \"value\": \"SLO\"\n },\n {\n \"text\": \"Sweden\",\n \"value\": \"SWE\"\n },\n {\n \"text\": \"Eswatini\",\n \"value\": \"SWZ\"\n },\n {\n \"text\": \"Seychelles\",\n \"value\": \"SEY\"\n },\n {\n \"text\": \"Syria\",\n \"value\": \"SYR\"\n },\n {\n \"text\": \"Chad\",\n \"value\": \"CHA\"\n },\n {\n \"text\": \"Togo\",\n \"value\": \"TOG\"\n },\n {\n \"text\": \"Thailand\",\n \"value\": \"THA\"\n },\n {\n \"text\": \"Tajikistan\",\n \"value\": \"TJK\"\n },\n {\n \"text\": \"Turkmenistan\",\n \"value\": \"TKM\"\n },\n {\n \"text\": \"Timor-Leste\",\n \"value\": \"TLS\"\n },\n {\n \"text\": \"Tonga\",\n \"value\": \"TGA\"\n },\n {\n \"text\": \"Trinidad and Tobago\",\n \"value\": \"TTO\"\n },\n {\n \"text\": \"Tunisia\",\n \"value\": \"TUN\"\n },\n {\n \"text\": \"Turkey\",\n \"value\": \"TUR\"\n },\n {\n \"text\": \"Tuvalu\",\n \"value\": \"TUV\"\n },\n {\n \"text\": \"Tanzania\",\n \"value\": \"TAN\"\n },\n {\n \"text\": \"Uganda\",\n \"value\": \"UGA\"\n },\n {\n \"text\": \"Ukraine\",\n \"value\": \"UKR\"\n },\n {\n \"text\": \"Uruguay\",\n \"value\": \"URU\"\n },\n {\n \"text\": \"United States\",\n \"value\": \"USA\"\n },\n {\n \"text\": \"Uzbekistan\",\n \"value\": \"UZB\"\n },\n {\n \"text\": \"Saint Vincent and the Grenadines\",\n \"value\": \"VIN\"\n },\n {\n \"text\": \"Venezuela\",\n \"value\": \"VEN\"\n },\n {\n \"text\": \"Vietnam\",\n \"value\": \"VIE\"\n },\n {\n \"text\": \"Vanuatu\",\n \"value\": \"VAN\"\n },\n {\n \"text\": \"Samoa\",\n \"value\": \"SAM\"\n },\n {\n \"text\": \"Yemen\",\n \"value\": \"YEM\"\n },\n {\n \"text\": \"South Africa\",\n \"value\": \"RSA\"\n },\n {\n \"text\": \"Zambia\",\n \"value\": \"ZAM\"\n },\n {\n \"text\": \"Zimbabwe\",\n \"value\": \"ZIM\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"durationInCurrentResidenceMth\",\n \"displayName\": \"Duration in Current Residence (Months)\",\n \"placeholder\": \"Duration in Current Residence (Months)\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 2,\n \"min\": 0,\n \"max\": 11,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^([0-9]|10|11)$\",\n \"text\": \"Value must be a number between 0-11.\"\n }\n ],\n \"inputType\": \"number\",\n \"category\": \"7\"\n },\n {\n \"name\": \"durationInCurrentResidenceYr\",\n \"displayName\": \"Duration in Current Residence (Years)\",\n \"placeholder\": \"Duration in Current Residence (Years)\",\n \"type\": \"text\",\n \"maxLength\": 2,\n \"min\": 0,\n \"max\": 99,\n \"inputType\": \"number\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^([0-9]|[1-9][0-9])$\",\n \"text\": \"Value must be a number between 0-99.\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"officePhoneNo\",\n \"displayName\": \"Employer Phone Number\",\n \"placeholder\": \"Employer Phone Number\",\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"text\",\n \"maxLength\": 12,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"The phone number must be a valid Malaysian number\",\n \"regex\": \"^(011[0-9]{8}|(60[4-7]|004|005|006|007|009|609|012|013|014|016|017|019)[0-9]{7})$\"\n }\n ],\n \"inputType\": \"tel\",\n \"category\": \"5\"\n },\n {\n \"name\": \"officePhoneNoAreaCode\",\n \"displayName\": \"Office Phone Number Area Code\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"8\"\n },\n {\n \"name\": \"postcode\",\n \"displayName\": \"Postcode\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"state\",\n \"displayName\": \"Permanent State\",\n \"placeholder\": \"Select State Of The Permanenet Address\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"A\",\n \"text\": \"PERAK\"\n },\n {\n \"value\": \"B\",\n \"text\": \"SELANGOR\"\n },\n {\n \"value\": \"C\",\n \"text\": \"PAHANG\"\n },\n {\n \"value\": \"D\",\n \"text\": \"KELANTAN\"\n },\n {\n \"value\": \"J\",\n \"text\": \"JOHOR\"\n },\n {\n \"value\": \"K\",\n \"text\": \"KEDAH\"\n },\n {\n \"value\": \"L\",\n \"text\": \"WP LABUAN\"\n },\n {\n \"value\": \"M\",\n \"text\": \"MELAKA\"\n },\n {\n \"value\": \"N\",\n \"text\": \"NEGERI SEMBILAN\"\n },\n {\n \"value\": \"P\",\n \"text\": \"PULAU PINANG\"\n },\n {\n \"value\": \"Q\",\n \"text\": \"SARAWAK\"\n },\n {\n \"value\": \"R\",\n \"text\": \"PERLIS\"\n },\n {\n \"value\": \"S\",\n \"text\": \"SABAH\"\n },\n {\n \"value\": \"T\",\n \"text\": \"TERENGGANU\"\n },\n {\n \"value\": \"U\",\n \"text\": \"WP PUTRAJAYA\"\n },\n {\n \"value\": \"W\",\n \"text\": \"WP KUALA LUMPUR\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"residenceAddress\",\n \"displayName\": \"Residence address same as permanent address?\",\n \"type\": \"boolean\",\n \"defaultValue\": false,\n \"requiredForEvaluation\": false,\n \"category\": \"7\"\n },\n {\n \"name\": \"officestate\",\n \"displayName\": \"Employer State\",\n \"startWithNewLine\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"placeholder\": \"Select State Of The Employer Address\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"A\",\n \"text\": \"PERAK\"\n },\n {\n \"value\": \"B\",\n \"text\": \"SELANGOR\"\n },\n {\n \"value\": \"C\",\n \"text\": \"PAHANG\"\n },\n {\n \"value\": \"D\",\n \"text\": \"KELANTAN\"\n },\n {\n \"value\": \"J\",\n \"text\": \"JOHOR\"\n },\n {\n \"value\": \"K\",\n \"text\": \"KEDAH\"\n },\n {\n \"value\": \"L\",\n \"text\": \"WP LABUAN\"\n },\n {\n \"value\": \"M\",\n \"text\": \"MELAKA\"\n },\n {\n \"value\": \"N\",\n \"text\": \"NEGERI SEMBILAN\"\n },\n {\n \"value\": \"P\",\n \"text\": \"PULAU PINANG\"\n },\n {\n \"value\": \"Q\",\n \"text\": \"SARAWAK\"\n },\n {\n \"value\": \"R\",\n \"text\": \"PERLIS\"\n },\n {\n \"value\": \"S\",\n \"text\": \"SABAH\"\n },\n {\n \"value\": \"T\",\n \"text\": \"TERENGGANU\"\n },\n {\n \"value\": \"U\",\n \"text\": \"WP PUTRAJAYA\"\n },\n {\n \"value\": \"W\",\n \"text\": \"WP KUALA LUMPUR\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"type\": \"text\",\n \"name\": \"age\",\n \"title\": \"Age\",\n \"isRequired\": true,\n \"displayName\": \"Age\",\n \"visible\": false,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid whole number age between 21 and 55.\",\n \"regex\": \"^(2[1-9]|[3-4][0-9]|55)$\"\n }\n ],\n \"defaultValue\": \"21\",\n \"category\": \"2\"\n },\n {\n \"name\": \"consentCrossSelling\",\n \"displayName\": \"Consent Cross-Selling, Consent to Obtain Information from CTOS and Disclosure of Information\",\n \"type\": \"boolean\",\n \"validators\": [\n {\n \"type\": \"expression\",\n \"expression\": \"{consentCrossSelling} = true\",\n \"text\": \"You must provide consent to Consent Cross-Selling.\"\n }\n ],\n \"defaultValue\": false,\n \"showTitle\": true,\n \"category\": \"9\"\n },\n {\n \"type\": \"text\",\n \"name\": \"consentObtainInfoFromCtos\",\n \"displayName\": \"Consent to Obtain Information from CTOS\",\n \"defaultValue\": \"yes\",\n \"showTitle\": true,\n \"visible\": false,\n \"category\": \"9\"\n },\n {\n \"name\": \"dateJoined\",\n \"displayName\": \"Date Joined\",\n \"placeholder\": \"Date Joined\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 10,\n \"inputType\": \"date\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\",\n \"text\": \"Date must be in YYYY-MM-DD format\"\n },\n {\n \"type\": \"custom\",\n \"validator\": \"validateNotFutureDate\",\n \"text\": \"Date of joining cannot be in the future\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"disclosureOfInformation\",\n \"displayName\": \"Disclosure of Information\",\n \"type\": \"text\",\n \"defaultValue\": \"yes\",\n \"showTitle\": true,\n \"visible\": false,\n \"category\": \"9\"\n },\n {\n \"name\": \"educationLevel\",\n \"displayName\": \"Education Level\",\n \"placeholder\": \"Highest Education Level\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Primary\"\n },\n {\n \"value\": \"02\",\n \"text\": \"Secondary/High school\"\n },\n {\n \"value\": \"03\",\n \"text\": \"College graduate-certificate/Diploma holder\"\n },\n {\n \"value\": \"04\",\n \"text\": \"University Degree/Associate Degree\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Master Degree\"\n },\n {\n \"value\": \"06\",\n \"text\": \"Doctorate\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"emerContactTelNo1\",\n \"displayName\": \"Emergency Contact Telephone Number 1\",\n \"startWithNewLine\": false,\n \"placeholder\": \"Emergency Contact Telephone Number 1\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"A valid Malaysia phone number is required.\",\n \"regex\": \"^((60[4-79]|0[4-79])[0-9]{7}|011[0-9]{8}|01[2346789][0-9]{7})$\"\n }\n ],\n \"type\": \"text\",\n \"maxLength\": 18,\n \"inputType\": \"tel\",\n \"category\": \"8\"\n },\n {\n \"name\": \"emerContactTelNo1AreaCode\",\n \"displayName\": \"Emergency Contact Telephone Number 1 Area Code\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"8\"\n },\n {\n \"name\": \"emergencyContactName\",\n \"displayName\": \"Emergency Contact Name\",\n \"placeholder\": \"Emergency Contact Name\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"8\"\n },\n {\n \"name\": \"employerName\",\n \"displayName\": \"Employer Name\",\n \"placeholder\": \"Employer Name\",\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"5\"\n },\n {\n \"name\": \"employmentSector\",\n \"displayName\": \"Employment Sector\",\n \"placeholder\": \"Select Employment Sector\",\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"0010\",\n \"text\": \"Accounting\"\n },\n {\n \"value\": \"0020\",\n \"text\": \"Actuarial / Statistic\"\n },\n {\n \"value\": \"0030\",\n \"text\": \"Advertising / Marketing / PR\"\n },\n {\n \"value\": \"0040\",\n \"text\": \"Aerospace\"\n },\n {\n \"value\": \"0050\",\n \"text\": \"Agricultural / Chemicals / Forest Products\"\n },\n {\n \"value\": \"0060\",\n \"text\": \"Architecture\"\n },\n {\n \"value\": \"0070\",\n \"text\": \"Automotive / Manufacturing / Production\"\n },\n {\n \"value\": \"0080\",\n \"text\": \"Aviation\"\n },\n {\n \"value\": \"0090\",\n \"text\": \"Buying / Retail\"\n },\n {\n \"value\": \"0100\",\n \"text\": \"Computers / Electronics\"\n },\n {\n \"value\": \"0110\",\n \"text\": \"Construction\"\n },\n {\n \"value\": \"0120\",\n \"text\": \"Creative / Graphics\"\n },\n {\n \"value\": \"0130\",\n \"text\": \"Customer Service\"\n },\n {\n \"value\": \"0140\",\n \"text\": \"Education (includes students) / Training\"\n },\n {\n \"value\": \"0150\",\n \"text\": \"Energy / Mining\"\n },\n {\n \"value\": \"0160\",\n \"text\": \"Engineering\"\n },\n {\n \"value\": \"0170\",\n \"text\": \"Finance / Banking / Insurance\"\n },\n {\n \"value\": \"0180\",\n \"text\": \"Freight / Shipping\"\n },\n {\n \"value\": \"0190\",\n \"text\": \"Government / Military / Public Service\"\n },\n {\n \"value\": \"0200\",\n \"text\": \"Recreation / Hospitality / Sports\"\n },\n {\n \"value\": \"0210\",\n \"text\": \"Hotel / Food\"\n },\n {\n \"value\": \"0220\",\n \"text\": \"Human Resources\"\n },\n {\n \"value\": \"0230\",\n \"text\": \"Investment\"\n },\n {\n \"value\": \"0240\",\n \"text\": \"Journalist / Editor\"\n },\n {\n \"value\": \"0250\",\n \"text\": \"Media / Publishing\"\n },\n {\n \"value\": \"0260\",\n \"text\": \"Medical / Health Services\"\n },\n {\n \"value\": \"0270\",\n \"text\": \"Non-Profit Organization\"\n },\n {\n \"value\": \"0280\",\n \"text\": \"Geology\"\n },\n {\n \"value\": \"0290\",\n \"text\": \"Pharmaceuticals\"\n },\n {\n \"value\": \"0300\",\n \"text\": \"Real Estate\"\n },\n {\n \"value\": \"0310\",\n \"text\": \"Administrative and Support Service Activities\"\n },\n {\n \"value\": \"0320\",\n \"text\": \"Social Services\"\n },\n {\n \"value\": \"0330\",\n \"text\": \"Telecommunications / Networking\"\n },\n {\n \"value\": \"0340\",\n \"text\": \"Travel\"\n },\n {\n \"value\": \"0350\",\n \"text\": \"Transportation\"\n },\n {\n \"value\": \"0360\",\n \"text\": \"Entertainment / Arts\"\n },\n {\n \"value\": \"0370\",\n \"text\": \"Electricity, Gas, Steam and Air Conditioning Supply\"\n },\n {\n \"value\": \"0380\",\n \"text\": \"Water Supply; Sewerage, Waste Management and Remediation Activities\"\n },\n {\n \"value\": \"0390\",\n \"text\": \"Activities of Households as Employers; Undifferentiated Goods and Services Producing Activities of Households for Own Use\"\n },\n {\n \"value\": \"0400\",\n \"text\": \"Activities of Extraterritorial Organisations and Bodies\"\n },\n {\n \"value\": \"0410\",\n \"text\": \"Unemployed/ Outside Labour Force\"\n },\n {\n \"value\": \"0420\",\n \"text\": \"Other Service Activities\"\n },\n {\n \"value\": \"0430\",\n \"text\": \"Legal Services\"\n },\n {\n \"value\": \"0440\",\n \"text\": \"Research & Experimental Development Services\"\n },\n {\n \"value\": \"0450\",\n \"text\": \"Other Professional, Scientific and Technical Activities\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"employmentStatus\",\n \"displayName\": \"Employment Status\",\n \"placeholder\": \"Select Employment Status\",\n \"startWithNewLine\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '08', '09']\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"CON\",\n \"text\": \"Contract\"\n },\n {\n \"value\": \"FRL\",\n \"text\": \"Freelance\"\n },\n {\n \"value\": \"OTH\",\n \"text\": \"Others\"\n },\n {\n \"value\": \"PER\",\n \"text\": \"Permanent\"\n },\n {\n \"value\": \"PRT\",\n \"text\": \"Part Time\"\n },\n {\n \"value\": \"TMP\",\n \"text\": \"Temporary\"\n },\n {\n \"value\": \"UPROB\",\n \"text\": \"Under Probation\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"employmentType\",\n \"displayName\": \"Employment Type\",\n \"placeholder\": \"Select Employment Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Private Employee\"\n },\n {\n \"value\": \"02\",\n \"text\": \"Employer\"\n },\n {\n \"value\": \"03\",\n \"text\": \"Housewife\"\n },\n {\n \"value\": \"04\",\n \"text\": \"Retired\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Student\"\n },\n {\n \"value\": \"06\",\n \"text\": \"Unemployed\"\n },\n {\n \"value\": \"07\",\n \"text\": \"Self-employed/Own Account Worker\"\n },\n {\n \"value\": \"08\",\n \"text\": \"Government Employee\"\n },\n {\n \"value\": \"09\",\n \"text\": \"Reporting Entity Employee\"\n },\n {\n \"value\": \"10\",\n \"text\": \"Unpaid Family Worker\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"gender\",\n \"displayName\": \"Gender\",\n \"placeholder\": \"Select Gender\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"M\",\n \"text\": \"Male\"\n },\n {\n \"value\": \"F\",\n \"text\": \"Female\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"idType\",\n \"displayName\": \"ID Type\",\n \"type\": \"dropdown\",\n \"defaultValue\": \"MyKad\",\n \"choices\": [\n {\n \"value\": \"MK\",\n \"text\": \"MyKad\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"lengthOfServiceMonth\",\n \"displayName\": \"Length of Service (Months)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"5\"\n },\n {\n \"name\": \"lengthOfServiceYear\",\n \"displayName\": \"Length of Service (Years)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"5\"\n },\n {\n \"name\": \"mailingBillingAddressInd\",\n \"displayName\": \"Preferred Mailing Address\",\n \"placeholder\": \"Select Preferred Mailing Address\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"O\",\n \"text\": \"Office\"\n },\n {\n \"value\": \"R\",\n \"text\": \"Residence\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"maritalStatus\",\n \"displayName\": \"Marital Status\",\n \"placeholder\": \"Select Marital Status\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"S\",\n \"text\": \"Single\"\n },\n {\n \"value\": \"M\",\n \"text\": \"Married\"\n },\n {\n \"value\": \"W\",\n \"text\": \"Widowed\"\n },\n {\n \"value\": \"D\",\n \"text\": \"Divorced\"\n },\n {\n \"value\": \"E\",\n \"text\": \"Separated\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"monthlyGrossIncome\",\n \"displayName\": \"Monthly Gross Income\",\n \"placeholder\": \"E.g. 6000\",\n \"visibleIf\": \"{employmentType} anyof ['01', '07', '08', '09', '10']\",\n \"type\": \"text\",\n \"maxLength\": 15,\n \"inputType\": \"number\",\n \"min\": 2000,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d+(\\\\.\\\\d+)?$\",\n \"text\": \"Please enter a valid non-negative number.\"\n },\n {\n \"type\": \"expression\",\n \"expression\": \"{monthlyGrossIncome} >= 2000\",\n \"text\": \"Income must be at least RM 2000.\"\n }\n ],\n \"category\": \"4\"\n },\n {\n \"name\": \"monthlyNetIncome\",\n \"displayName\": \"Monthly Net Income\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"nationality\",\n \"displayName\": \"Nationality\",\n \"type\": \"text\",\n \"category\": \"2\"\n },\n {\n \"name\": \"noOfDependants\",\n \"displayName\": \"Number of Dependants\",\n \"placeholder\": \"Number Of Dependants\",\n \"type\": \"text\",\n \"startWithNewLine\": false,\n \"maxLength\": 3,\n \"inputType\": \"number\",\n \"min\": 0,\n \"max\": 99,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid whole number between 0 and 99.\",\n \"regex\": \"^[0-9][0-9]?$\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"occupation\",\n \"displayName\": \"Occupation\",\n \"placeholder\": \"Select Occupation\",\n \"startWithNewLine\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"001\",\n \"text\": \"Accountant\"\n },\n {\n \"value\": \"005\",\n \"text\": \"Army Officer\"\n },\n {\n \"value\": \"007\",\n \"text\": \"Assistant Director\"\n },\n {\n \"value\": \"008\",\n \"text\": \"Assistant Manager\"\n },\n {\n \"value\": \"009\",\n \"text\": \"Auditor\"\n },\n {\n \"value\": \"010\",\n \"text\": \"Baker\"\n },\n {\n \"value\": \"011\",\n \"text\": \"Beautician\"\n },\n {\n \"value\": \"012\",\n \"text\": \"Broker\"\n },\n {\n \"value\": \"013\",\n \"text\": \"Business Partner\"\n },\n {\n \"value\": \"014\",\n \"text\": \"Businessman/Businesswoman\"\n },\n {\n \"value\": \"015\",\n \"text\": \"Carpenter\"\n },\n {\n \"value\": \"016\",\n \"text\": \"Cashier\"\n },\n {\n \"value\": \"017\",\n \"text\": \"CEO\"\n },\n {\n \"value\": \"018\",\n \"text\": \"Chairman\"\n },\n {\n \"value\": \"019\",\n \"text\": \"Chief Accountant\"\n },\n {\n \"value\": \"020\",\n \"text\": \"Chief Auditor\"\n },\n {\n \"value\": \"022\",\n \"text\": \"Co-Director\"\n },\n {\n \"value\": \"023\",\n \"text\": \"Consultant\"\n },\n {\n \"value\": \"024\",\n \"text\": \"Contractor\"\n },\n {\n \"value\": \"025\",\n \"text\": \"Financial Controller\"\n },\n {\n \"value\": \"026\",\n \"text\": \"Coordinator\"\n },\n {\n \"value\": \"027\",\n \"text\": \"Copywriter\"\n },\n {\n \"value\": \"028\",\n \"text\": \"Dealer/Distributor\"\n },\n {\n \"value\": \"029\",\n \"text\": \"Dentist\"\n },\n {\n \"value\": \"031\",\n \"text\": \"Despatch\"\n },\n {\n \"value\": \"032\",\n \"text\": \"Detective\"\n },\n {\n \"value\": \"034\",\n \"text\": \"Diplomat\"\n },\n {\n \"value\": \"035\",\n \"text\": \"Director\"\n },\n {\n \"value\": \"036\",\n \"text\": \"Doctor\"\n },\n {\n \"value\": \"038\",\n \"text\": \"Electrician\"\n },\n {\n \"value\": \"040\",\n \"text\": \"Executive\"\n },\n {\n \"value\": \"041\",\n \"text\": \"Executive Director\"\n },\n {\n \"value\": \"042\",\n \"text\": \"Exporter\"\n },\n {\n \"value\": \"043\",\n \"text\": \"Farmer\"\n },\n {\n \"value\": \"044\",\n \"text\": \"Foreman\"\n },\n {\n \"value\": \"045\",\n \"text\": \"Gardener\"\n },\n {\n \"value\": \"046\",\n \"text\": \"General Manager\"\n },\n {\n \"value\": \"047\",\n \"text\": \"Goldsmith\"\n },\n {\n \"value\": \"048\",\n \"text\": \"Hairdresser\"\n },\n {\n \"value\": \"049\",\n \"text\": \"Hawker\"\n },\n {\n \"value\": \"050\",\n \"text\": \"Housewife\"\n },\n {\n \"value\": \"051\",\n \"text\": \"Homemaker\"\n },\n {\n \"value\": \"053\",\n \"text\": \"Investor\"\n },\n {\n \"value\": \"054\",\n \"text\": \"Jeweller\"\n },\n {\n \"value\": \"055\",\n \"text\": \"Judge\"\n },\n {\n \"value\": \"057\",\n \"text\": \"Lawyer/Barrister/Solicitor\"\n },\n {\n \"value\": \"058\",\n \"text\": \"Lender\"\n },\n {\n \"value\": \"060\",\n \"text\": \"Managing Director\"\n },\n {\n \"value\": \"061\",\n \"text\": \"Manufacturer\"\n },\n {\n \"value\": \"063\",\n \"text\": \"Money Lender\"\n },\n {\n \"value\": \"064\",\n \"text\": \"Money-Changer\"\n },\n {\n \"value\": \"068\",\n \"text\": \"Owner/Co-Owner\"\n },\n {\n \"value\": \"070\",\n \"text\": \"Partner\"\n },\n {\n \"value\": \"071\",\n \"text\": \"Pastor\"\n },\n {\n \"value\": \"072\",\n \"text\": \"Physician\"\n },\n {\n \"value\": \"073\",\n \"text\": \"Plumber\"\n },\n {\n \"value\": \"075\",\n \"text\": \"Principal\"\n },\n {\n \"value\": \"076\",\n \"text\": \"Programmer\"\n },\n {\n \"value\": \"077\",\n \"text\": \"Quantity Surveyor\"\n },\n {\n \"value\": \"078\",\n \"text\": \"Remiser\"\n },\n {\n \"value\": \"079\",\n \"text\": \"Retailer\"\n },\n {\n \"value\": \"080\",\n \"text\": \"Retiree\"\n },\n {\n \"value\": \"082\",\n \"text\": \"Secretary\"\n },\n {\n \"value\": \"083\",\n \"text\": \"Self-Employed\"\n },\n {\n \"value\": \"084\",\n \"text\": \"Smallholder\"\n },\n {\n \"value\": \"085\",\n \"text\": \"Stockbroker\"\n },\n {\n \"value\": \"086\",\n \"text\": \"Store-Keeper\"\n },\n {\n \"value\": \"087\",\n \"text\": \"Student\"\n },\n {\n \"value\": \"088\",\n \"text\": \"Sub-contractor\"\n },\n {\n \"value\": \"090\",\n \"text\": \"Supplier\"\n },\n {\n \"value\": \"091\",\n \"text\": \"Tailor/Dressmaker\"\n },\n {\n \"value\": \"094\",\n \"text\": \"Tourist Guide\"\n },\n {\n \"value\": \"095\",\n \"text\": \"Trader\"\n },\n {\n \"value\": \"096\",\n \"text\": \"Valuer\"\n },\n {\n \"value\": \"097\",\n \"text\": \"Vice President\"\n },\n {\n \"value\": \"098\",\n \"text\": \"Waiter/Waitress\"\n },\n {\n \"value\": \"099\",\n \"text\": \"Welder\"\n },\n {\n \"value\": \"100\",\n \"text\": \"Wholesaler\"\n },\n {\n \"value\": \"101\",\n \"text\": \"Fisherman\"\n },\n {\n \"value\": \"102\",\n \"text\": \"Grocer\"\n },\n {\n \"value\": \"104\",\n \"text\": \"Unemployed\"\n },\n {\n \"value\": \"105\",\n \"text\": \"Babysitter\"\n },\n {\n \"value\": \"107\",\n \"text\": \"Sole Proprietor\"\n },\n {\n \"value\": \"108\",\n \"text\": \"Politician\"\n },\n {\n \"value\": \"109\",\n \"text\": \"Actor\"\n },\n {\n \"value\": \"110\",\n \"text\": \"Adjusters\"\n },\n {\n \"value\": \"111\",\n \"text\": \"Air Hostess\"\n },\n {\n \"value\": \"112\",\n \"text\": \"Aquaculture\"\n },\n {\n \"value\": \"115\",\n \"text\": \"Athlete\"\n },\n {\n \"value\": \"116\",\n \"text\": \"Auctioneer\"\n },\n {\n \"value\": \"117\",\n \"text\": \"Author\"\n },\n {\n \"value\": \"118\",\n \"text\": \"Bell Boy\"\n },\n {\n \"value\": \"119\",\n \"text\": \"Biographer\"\n },\n {\n \"value\": \"120\",\n \"text\": \"Butcher\"\n },\n {\n \"value\": \"121\",\n \"text\": \"Catering\"\n },\n {\n \"value\": \"122\",\n \"text\": \"Chargeman\"\n },\n {\n \"value\": \"123\",\n \"text\": \"Chemist, Physicist\"\n },\n {\n \"value\": \"124\",\n \"text\": \"Choreographer/Dancer\"\n },\n {\n \"value\": \"125\",\n \"text\": \"Circus Performer\"\n },\n {\n \"value\": \"126\",\n \"text\": \"Civil Servant\"\n },\n {\n \"value\": \"127\",\n \"text\": \"Clergy\"\n },\n {\n \"value\": \"128\",\n \"text\": \"Coach\"\n },\n {\n \"value\": \"129\",\n \"text\": \"Composer\"\n },\n {\n \"value\": \"130\",\n \"text\": \"Decorator\"\n },\n {\n \"value\": \"131\",\n \"text\": \"Direct Sales\"\n },\n {\n \"value\": \"132\",\n \"text\": \"Economist\"\n },\n {\n \"value\": \"133\",\n \"text\": \"Editor\"\n },\n {\n \"value\": \"135\",\n \"text\": \"Fireman\"\n },\n {\n \"value\": \"136\",\n \"text\": \"Fishmonger\"\n },\n {\n \"value\": \"137\",\n \"text\": \"Florist\"\n },\n {\n \"value\": \"138\",\n \"text\": \"Forestry\"\n },\n {\n \"value\": \"139\",\n \"text\": \"Freight Forwarding Services\"\n },\n {\n \"value\": \"140\",\n \"text\": \"General Worker\"\n },\n {\n \"value\": \"142\",\n \"text\": \"Hunter\"\n },\n {\n \"value\": \"143\",\n \"text\": \"Journalist\"\n },\n {\n \"value\": \"144\",\n \"text\": \"Launderer/Dry Cleaner\"\n },\n {\n \"value\": \"145\",\n \"text\": \"Librarian/Curator\"\n },\n {\n \"value\": \"146\",\n \"text\": \"Locksmith\"\n },\n {\n \"value\": \"147\",\n \"text\": \"Magician\"\n },\n {\n \"value\": \"149\",\n \"text\": \"Model\"\n },\n {\n \"value\": \"150\",\n \"text\": \"Newscaster\"\n },\n {\n \"value\": \"151\",\n \"text\": \"NGO Staff/Volunteer\"\n },\n {\n \"value\": \"152\",\n \"text\": \"Nursery Worker & Gardener\"\n },\n {\n \"value\": \"154\",\n \"text\": \"Pharmacist\"\n },\n {\n \"value\": \"155\",\n \"text\": \"Photographer\"\n },\n {\n \"value\": \"156\",\n \"text\": \"Postman\"\n },\n {\n \"value\": \"157\",\n \"text\": \"Priest/Nun\"\n },\n {\n \"value\": \"158\",\n \"text\": \"Promoter\"\n },\n {\n \"value\": \"159\",\n \"text\": \"Proof Reader\"\n },\n {\n \"value\": \"160\",\n \"text\": \"Psychiatrist\"\n },\n {\n \"value\": \"161\",\n \"text\": \"Psychologist\"\n },\n {\n \"value\": \"162\",\n \"text\": \"Sailor\"\n },\n {\n \"value\": \"163\",\n \"text\": \"Security/Bodyguard\"\n },\n {\n \"value\": \"164\",\n \"text\": \"Shop Assistant\"\n },\n {\n \"value\": \"165\",\n \"text\": \"Singer\"\n },\n {\n \"value\": \"166\",\n \"text\": \"Social Worker\"\n },\n {\n \"value\": \"168\",\n \"text\": \"Town Planner\"\n },\n {\n \"value\": \"169\",\n \"text\": \"Translator/Interpreter\"\n },\n {\n \"value\": \"170\",\n \"text\": \"Upholsterer\"\n },\n {\n \"value\": \"171\",\n \"text\": \"Warden\"\n },\n {\n \"value\": \"172\",\n \"text\": \"Bank Officer\"\n },\n {\n \"value\": \"175\",\n \"text\": \"Astronaut/Astronomer/Astrologer\"\n },\n {\n \"value\": \"176\",\n \"text\": \"President\"\n },\n {\n \"value\": \"200\",\n \"text\": \"Production and Manufacturing Managers\"\n },\n {\n \"value\": \"201\",\n \"text\": \"Hospitality, Retail and Other Services Managers\"\n },\n {\n \"value\": \"202\",\n \"text\": \"Information and Communications Technology Managers\"\n },\n {\n \"value\": \"203\",\n \"text\": \"Services Managers\"\n },\n {\n \"value\": \"204\",\n \"text\": \"Meteorologists and Seismologists\"\n },\n {\n \"value\": \"205\",\n \"text\": \"Geologists and Geophysicists\"\n },\n {\n \"value\": \"206\",\n \"text\": \"Farming, Forestry and Fisheries Advisers\"\n },\n {\n \"value\": \"207\",\n \"text\": \"Other Life Science Professionals\"\n },\n {\n \"value\": \"208\",\n \"text\": \"Landscape Architects\"\n },\n {\n \"value\": \"209\",\n \"text\": \"Product and Garment Designers\"\n },\n {\n \"value\": \"210\",\n \"text\": \"Graphic and Multimedia Designers\"\n },\n {\n \"value\": \"211\",\n \"text\": \"Ships Engineers\"\n },\n {\n \"value\": \"212\",\n \"text\": \"Aircraft Pilots and Related Professionals\"\n },\n {\n \"value\": \"213\",\n \"text\": \"Other Ship, Aircraft and Train/Locomotive Controllers\"\n },\n {\n \"value\": \"214\",\n \"text\": \"University and Higher Education Teachers\"\n },\n {\n \"value\": \"215\",\n \"text\": \"Vocational Education Teachers\"\n },\n {\n \"value\": \"216\",\n \"text\": \"Secondary Education Teachers\"\n },\n {\n \"value\": \"217\",\n \"text\": \"Primary School and Early Childhood Teachers\"\n },\n {\n \"value\": \"218\",\n \"text\": \"Music, Arts and Performing Arts Teachers\"\n },\n {\n \"value\": \"219\",\n \"text\": \"Language Teachers\"\n },\n {\n \"value\": \"220\",\n \"text\": \"Technology Skill and Technical Trainers\"\n },\n {\n \"value\": \"221\",\n \"text\": \"System Analysts\"\n },\n {\n \"value\": \"222\",\n \"text\": \"Web and Multimedia Developers\"\n },\n {\n \"value\": \"223\",\n \"text\": \"Software and Applications Developers and Analysts n.e.c.\"\n },\n {\n \"value\": \"224\",\n \"text\": \"Database Designers and Administrators\"\n },\n {\n \"value\": \"225\",\n \"text\": \"Information Technology System Administrators\"\n },\n {\n \"value\": \"226\",\n \"text\": \"Other Database and Network Professionals\"\n },\n {\n \"value\": \"227\",\n \"text\": \"Legal Professionals n.e.c.\"\n },\n {\n \"value\": \"228\",\n \"text\": \"Sociologists, Anthropologists and Related Professionals\"\n },\n {\n \"value\": \"229\",\n \"text\": \"Philosophers, Historians and Political Scientists\"\n },\n {\n \"value\": \"230\",\n \"text\": \"Film, Stage and Related Directors and Producers\"\n },\n {\n \"value\": \"231\",\n \"text\": \"Animals Keepers and Trainers\"\n },\n {\n \"value\": \"232\",\n \"text\": \"Professional Customs and Border Inspectors\"\n },\n {\n \"value\": \"233\",\n \"text\": \"Professional Taxation and Excise Officials\"\n },\n {\n \"value\": \"234\",\n \"text\": \"Professional Government Social Benefits Officials\"\n },\n {\n \"value\": \"235\",\n \"text\": \"Professional Government Licensing Officials\"\n },\n {\n \"value\": \"236\",\n \"text\": \"Professional Civil Defence Officials\"\n },\n {\n \"value\": \"237\",\n \"text\": \"Physical and Engineering Science Technicians\"\n },\n {\n \"value\": \"238\",\n \"text\": \"Mining, Manufacturing and Construction Supervisors\"\n },\n {\n \"value\": \"239\",\n \"text\": \"Process Control Technicians\"\n },\n {\n \"value\": \"240\",\n \"text\": \"Life Science Technicians and Related Associate Professionals\"\n },\n {\n \"value\": \"241\",\n \"text\": \"Ship, Aircraft and Train Technicians\"\n },\n {\n \"value\": \"242\",\n \"text\": \"Nuclear Science Associate Professionals\"\n },\n {\n \"value\": \"243\",\n \"text\": \"Medical and Pharmaceutical Technicians\"\n },\n {\n \"value\": \"244\",\n \"text\": \"Traditional and Complementary Medicine Associate Professionals\"\n },\n {\n \"value\": \"245\",\n \"text\": \"Veterinary Technicians and Assistants\"\n },\n {\n \"value\": \"246\",\n \"text\": \"Dental Assistants and Therapists\"\n },\n {\n \"value\": \"247\",\n \"text\": \"Medical Records and Health Information Technicians\"\n },\n {\n \"value\": \"248\",\n \"text\": \"Dispensing Opticians\"\n },\n {\n \"value\": \"249\",\n \"text\": \"Physiotherapy Technicians and Assistants\"\n },\n {\n \"value\": \"250\",\n \"text\": \"Medical Assistants\"\n },\n {\n \"value\": \"251\",\n \"text\": \"Health Associate Professionals Not Elsewhere Classified\"\n },\n {\n \"value\": \"252\",\n \"text\": \"Statistical, Mathematical and Actuarial Associate Professionals\"\n },\n {\n \"value\": \"253\",\n \"text\": \"Insurance Agent\"\n },\n {\n \"value\": \"254\",\n \"text\": \"Commercial Sales Agent\"\n },\n {\n \"value\": \"255\",\n \"text\": \"Buyers\"\n },\n {\n \"value\": \"256\",\n \"text\": \"Administrative Associate Professionals\"\n },\n {\n \"value\": \"257\",\n \"text\": \"Administrative and Executive Secretaries\"\n },\n {\n \"value\": \"258\",\n \"text\": \"Other Administrative and Specialized Associate Professionals\"\n },\n {\n \"value\": \"259\",\n \"text\": \"Legal Associate Professionals\"\n },\n {\n \"value\": \"260\",\n \"text\": \"Social and Religious Associate Professionals\"\n },\n {\n \"value\": \"261\",\n \"text\": \"Fitness and Recreation Instructors and Program Leaders\"\n },\n {\n \"value\": \"262\",\n \"text\": \"Gallery, Museum and Library Technicians\"\n },\n {\n \"value\": \"263\",\n \"text\": \"Cultural Associate Professionals\"\n },\n {\n \"value\": \"264\",\n \"text\": \"Artistic and Cultural Associate Professionals Not Elsewhere Classified\"\n },\n {\n \"value\": \"265\",\n \"text\": \"Customs and Border Inspector Associate Professionals\"\n },\n {\n \"value\": \"266\",\n \"text\": \"Taxation and Excise Official Associate Professionals\"\n },\n {\n \"value\": \"267\",\n \"text\": \"Government Social Benefit Official Associate Professionals\"\n },\n {\n \"value\": \"268\",\n \"text\": \"Government Licensing Official Associate Professionals\"\n },\n {\n \"value\": \"269\",\n \"text\": \"Civil Defence Associate Professionals\"\n },\n {\n \"value\": \"270\",\n \"text\": \"General Office Clerks\"\n },\n {\n \"value\": \"271\",\n \"text\": \"Data Entry Clerks\"\n },\n {\n \"value\": \"272\",\n \"text\": \"Bank Tellers and Related Clerks\"\n },\n {\n \"value\": \"273\",\n \"text\": \"Travel Consultants and Related Clerks\"\n },\n {\n \"value\": \"274\",\n \"text\": \"Contact/Call Centre Information Clerks\"\n },\n {\n \"value\": \"275\",\n \"text\": \"Telephone Switchboard Operators\"\n },\n {\n \"value\": \"276\",\n \"text\": \"Receptionists\"\n },\n {\n \"value\": \"277\",\n \"text\": \"Enquiry Clerks\"\n },\n {\n \"value\": \"278\",\n \"text\": \"Numerical and Material Recording Clerks\"\n },\n {\n \"value\": \"279\",\n \"text\": \"Transport Conductors\"\n },\n {\n \"value\": \"280\",\n \"text\": \"Cooks\"\n },\n {\n \"value\": \"281\",\n \"text\": \"Building and Housekeeping Supervisors\"\n },\n {\n \"value\": \"282\",\n \"text\": \"Street Food Salespersons\"\n },\n {\n \"value\": \"283\",\n \"text\": \"Sales Demonstrators\"\n },\n {\n \"value\": \"284\",\n \"text\": \"Teachers Aide\"\n },\n {\n \"value\": \"285\",\n \"text\": \"Personal Care Workers in Health Services Not Elsewhere Classified\"\n },\n {\n \"value\": \"286\",\n \"text\": \"Immigration/Custom Officers and Assistants\"\n },\n {\n \"value\": \"287\",\n \"text\": \"Protective Services Workers n.e.c.\"\n },\n {\n \"value\": \"288\",\n \"text\": \"Livestock and Dairy Producers\"\n },\n {\n \"value\": \"289\",\n \"text\": \"Animal Producers and Related Workers Not Elsewhere Classified\"\n },\n {\n \"value\": \"290\",\n \"text\": \"Mixed Crop and Animal Producers\"\n },\n {\n \"value\": \"291\",\n \"text\": \"Subsistence Farmers, Fishermen, Hunters and Gatherers\"\n },\n {\n \"value\": \"292\",\n \"text\": \"House Builders\"\n },\n {\n \"value\": \"293\",\n \"text\": \"Air Conditioning and Refrigeration Mechanics\"\n },\n {\n \"value\": \"294\",\n \"text\": \"Other Building Finishers and Related Trades Workers\"\n },\n {\n \"value\": \"295\",\n \"text\": \"Spray Painters and Varnishers\"\n },\n {\n \"value\": \"296\",\n \"text\": \"Building Structure Cleaners\"\n },\n {\n \"value\": \"297\",\n \"text\": \"Metal Moulders and Coremakers\"\n },\n {\n \"value\": \"298\",\n \"text\": \"Other Sheet and Structural Metal Workers, Moulders, Welders and Related Workers\"\n },\n {\n \"value\": \"299\",\n \"text\": \"Metal Working Machine Tool Setters and Operators\"\n },\n {\n \"value\": \"300\",\n \"text\": \"Aircraft Engine Mechanics and Repairers\"\n },\n {\n \"value\": \"301\",\n \"text\": \"Agricultural and Industrial Machinery Mechanics and Repairers\"\n },\n {\n \"value\": \"302\",\n \"text\": \"Bicycle and Related Repairers\"\n },\n {\n \"value\": \"303\",\n \"text\": \"Machinery Mechanics and Repairers Not Elsewhere Classified\"\n },\n {\n \"value\": \"304\",\n \"text\": \"Sign Writers, Decorative Painters, Engravers and Etchers\"\n },\n {\n \"value\": \"305\",\n \"text\": \"Pre-press Workers\"\n },\n {\n \"value\": \"306\",\n \"text\": \"Other Printing Trades Workers\"\n },\n {\n \"value\": \"307\",\n \"text\": \"Electrical Mechanics and Fitters\"\n },\n {\n \"value\": \"308\",\n \"text\": \"Electronics Mechanics and Servicers\"\n },\n {\n \"value\": \"309\",\n \"text\": \"Information and Communications Technology Installers and Services\"\n },\n {\n \"value\": \"310\",\n \"text\": \"Other Food Processing and Related Trades Workers\"\n },\n {\n \"value\": \"311\",\n \"text\": \"Woodworking-Machine Tool Setters and Operators\"\n },\n {\n \"value\": \"312\",\n \"text\": \"Other Wood Treaters, Cabinet-Makers and Related Trades Workers\"\n },\n {\n \"value\": \"313\",\n \"text\": \"Other Garment and Related Trades Workers\"\n },\n {\n \"value\": \"314\",\n \"text\": \"Other Craft and Related Workers\"\n },\n {\n \"value\": \"315\",\n \"text\": \"Stationary Plant and Machine Operators\"\n },\n {\n \"value\": \"316\",\n \"text\": \"Mechanical Machinery Assemblers\"\n },\n {\n \"value\": \"317\",\n \"text\": \"Assemblers Not Elsewhere Classified\"\n },\n {\n \"value\": \"318\",\n \"text\": \"Machine-Tool Setter-Operators\"\n },\n {\n \"value\": \"319\",\n \"text\": \"Locomotive Engine Drivers\"\n },\n {\n \"value\": \"320\",\n \"text\": \"Railway Brake, Signal and Switch Operators\"\n },\n {\n \"value\": \"321\",\n \"text\": \"Heavy Truck and Bus Drivers\"\n },\n {\n \"value\": \"322\",\n \"text\": \"Mobile Plant Operators\"\n },\n {\n \"value\": \"323\",\n \"text\": \"Mining and Construction Labourers\"\n },\n {\n \"value\": \"324\",\n \"text\": \"Hand and Pedal Vehicle Drivers\"\n },\n {\n \"value\": \"325\",\n \"text\": \"Animal-Drawn Machinery and Vehicle Drivers\"\n },\n {\n \"value\": \"326\",\n \"text\": \"Transport and Storage Labourers\"\n },\n {\n \"value\": \"327\",\n \"text\": \"Shelf Fillers\"\n },\n {\n \"value\": \"328\",\n \"text\": \"Food Preparation Assistant\"\n },\n {\n \"value\": \"329\",\n \"text\": \"Street and Related Sales and Services Workers\"\n },\n {\n \"value\": \"330\",\n \"text\": \"Refuse Workers and Other Elementary Workers\"\n },\n {\n \"value\": \"331\",\n \"text\": \"Nursing and Midwifery Associate Professionals\"\n },\n {\n \"value\": \"332\",\n \"text\": \"Police Officers - Protective Service Workers\"\n },\n {\n \"value\": \"333\",\n \"text\": \"Other Outside Labour Force\"\n },\n {\n \"value\": \"334\",\n \"text\": \"Financial and Investment Advisers\"\n },\n {\n \"value\": \"335\",\n \"text\": \"Business Services Agent\"\n },\n {\n \"value\": \"336\",\n \"text\": \"Health Care Assistants\"\n },\n {\n \"value\": \"337\",\n \"text\": \"Other Clerical Support Workers\"\n },\n {\n \"value\": \"338\",\n \"text\": \"Interior Designers and Decorators\"\n },\n {\n \"value\": \"339\",\n \"text\": \"Software Developers\"\n },\n {\n \"value\": \"340\",\n \"text\": \"Car, Van and Motorcycle Drivers\"\n },\n {\n \"value\": \"341\",\n \"text\": \"Engineering Professionals (including Electrotechnology)\"\n },\n {\n \"value\": \"342\",\n \"text\": \"Driving Instructors\"\n },\n {\n \"value\": \"343\",\n \"text\": \"Manufacturing Labourers\"\n },\n {\n \"value\": \"344\",\n \"text\": \"Administrative and Commercial Managers\"\n },\n {\n \"value\": \"345\",\n \"text\": \"Motor Vehicle Mechanics and Repairers\"\n },\n {\n \"value\": \"346\",\n \"text\": \"Nursing and Midwifery Professionals\"\n },\n {\n \"value\": \"347\",\n \"text\": \"Typist and Word Processor Operators\"\n },\n {\n \"value\": \"348\",\n \"text\": \"Painters and Related Workers\"\n },\n {\n \"value\": \"349\",\n \"text\": \"Police Officers\"\n },\n {\n \"value\": \"350\",\n \"text\": \"Stall and Market Salespersons\"\n },\n {\n \"value\": \"351\",\n \"text\": \"Shop Supervisors\"\n },\n {\n \"value\": \"352\",\n \"text\": \"Other Teaching Professionals\"\n },\n {\n \"value\": \"353\",\n \"text\": \"Information and Communications Technicians\"\n },\n {\n \"value\": \"354\",\n \"text\": \"Ships Deck Officers and Pilots\"\n },\n {\n \"value\": \"355\",\n \"text\": \"Chefs\"\n },\n {\n \"value\": \"356\",\n \"text\": \"Building Architects\"\n },\n {\n \"value\": \"357\",\n \"text\": \"Visual Artists\"\n },\n {\n \"value\": \"358\",\n \"text\": \"Creative and Performing Artists n.e.c.\"\n },\n {\n \"value\": \"359\",\n \"text\": \"Regulatory Government Professionals Not Elsewhere Classified\"\n },\n {\n \"value\": \"360\",\n \"text\": \"Cleaners and Helpers\"\n },\n {\n \"value\": \"361\",\n \"text\": \"Optometrists and Ophthalmic Opticians\"\n },\n {\n \"value\": \"362\",\n \"text\": \"Mathematicians, Actuaries and Statisticians\"\n },\n {\n \"value\": \"363\",\n \"text\": \"Financial Analysts\"\n },\n {\n \"value\": \"364\",\n \"text\": \"Administrative Professional\"\n },\n {\n \"value\": \"365\",\n \"text\": \"Other Legislators and Senior Officials\"\n },\n {\n \"value\": \"366\",\n \"text\": \"Personal Assistant\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"preferredLanguage\",\n \"displayName\": \"Preferred Language\",\n \"placeholder\": \"Select Preferred Language\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"English\"\n },\n {\n \"value\": \" 02\",\n \"text\": \"Bahasa\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"race\",\n \"displayName\": \"Race\",\n \"placeholder\": \"Select Race\",\n \"type\": \"dropdown\",\n \"startWithNewLine\": false,\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Malaysian - Chinese\"\n },\n {\n \"value\": \"02\",\n \"text\": \"Malaysian - Bumiputra - Malay\"\n },\n {\n \"value\": \"03\",\n \"text\": \"Malaysian - Bumiputra - Non Malay\"\n },\n {\n \"value\": \"04\",\n \"text\": \"Malaysian - Indian\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Malaysian - Other Race\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"relationshiptoContactName\",\n \"displayName\": \"Relationship to Contact Name\",\n \"type\": \"dropdown\",\n \"placeholder\": \"Relationship to contact Name\",\n \"choices\": [\n {\n \"value\": \"07\",\n \"text\": \"Father\"\n },\n {\n \"value\": \"08\",\n \"text\": \"Mother\"\n },\n {\n \"value\": \"09\",\n \"text\": \"Brother\"\n },\n {\n \"value\": \"10\",\n \"text\": \"Sister\"\n },\n {\n \"value\": \"11\",\n \"text\": \"Spouse\"\n },\n {\n \"value\": \"12\",\n \"text\": \"Son\"\n },\n {\n \"value\": \"13\",\n \"text\": \"Daughter\"\n },\n {\n \"value\": \"14\",\n \"text\": \"Uncle\"\n },\n {\n \"value\": \"15\",\n \"text\": \"Aunt\"\n },\n {\n \"value\": \"40\",\n \"text\": \"Relative\"\n }\n ],\n \"category\": \"8\"\n },\n {\n \"name\": \"residenceType\",\n \"displayName\": \"Residence Type\",\n \"placeholder\": \"Residence Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"PL0001\",\n \"text\": \"Own Property\"\n },\n {\n \"value\": \"PL0002\",\n \"text\": \"Mortgaged\"\n },\n {\n \"value\": \"PL0003\",\n \"text\": \"Employers\"\n },\n {\n \"value\": \"PL0004\",\n \"text\": \"Rented\"\n },\n {\n \"value\": \"PL0005\",\n \"text\": \"Parents\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"salutation\",\n \"displayName\": \"Salutation\",\n \"placeholder\": \"Select Salutation\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"002\",\n \"text\": \"CIK\"\n },\n {\n \"value\": \"004\",\n \"text\": \"DATIN\"\n },\n {\n \"value\": \"009\",\n \"text\": \"Datin Seri\"\n },\n {\n \"value\": \"011\",\n \"text\": \"DATO`\"\n },\n {\n \"value\": \"018\",\n \"text\": \"DATO SERI\"\n },\n {\n \"value\": \"023\",\n \"text\": \"DATUK\"\n },\n {\n \"value\": \"028\",\n \"text\": \"DOCTOR\"\n },\n {\n \"value\": \"033\",\n \"text\": \"ENCIK\"\n },\n {\n \"value\": \"043\",\n \"text\": \"DYTM\"\n },\n {\n \"value\": \"053\",\n \"text\": \"MADAM\"\n },\n {\n \"value\": \"061\",\n \"text\": \"MISS\"\n },\n {\n \"value\": \"062\",\n \"text\": \"MR\"\n },\n {\n \"value\": \"072\",\n \"text\": \"PUAN\"\n },\n {\n \"value\": \"075\",\n \"text\": \"PUAN SRI\"\n },\n {\n \"value\": \"079\",\n \"text\": \"TAN SRI\"\n },\n {\n \"value\": \"090\",\n \"text\": \"Toh Puan\"\n },\n {\n \"value\": \"102\",\n \"text\": \"YAM\"\n },\n {\n \"value\": \"151\",\n \"text\": \"DATO SRI\"\n },\n {\n \"value\": \"157\",\n \"text\": \"TYT TUN DATUK SERI PANGLIMA\"\n },\n {\n \"value\": \"158\",\n \"text\": \"Ms\"\n },\n {\n \"value\": \"159\",\n \"text\": \"KDYTM\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"sourceOfWealth\",\n \"displayName\": \"Source of Wealth\",\n \"placeholder\": \"Source of Wealth\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Accumulated Saving\"\n },\n {\n \"value\": \"02\",\n \"text\": \"Employment income\"\n },\n {\n \"value\": \"03\",\n \"text\": \"Inheritance\"\n },\n {\n \"value\": \"04\",\n \"text\": \"Trust Fund\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Retirement Income\"\n },\n {\n \"value\": \"06\",\n \"text\": \"EPF\"\n },\n {\n \"value\": \"07\",\n \"text\": \"Disposal of Assets/Shares\"\n },\n {\n \"value\": \"08\",\n \"text\": \"Insurance Maturity/Surrender\"\n },\n {\n \"value\": \"09\",\n \"text\": \"Return on investment\"\n },\n {\n \"value\": \"10\",\n \"text\": \"Legal Settlement\"\n },\n {\n \"value\": \"11\",\n \"text\": \"Income from own business\"\n }\n ],\n \"category\": \"4\"\n },\n {\n \"name\": \"statementType\",\n \"displayName\": \"Statement Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"E\",\n \"text\": \"Email\"\n },\n {\n \"value\": \"R\",\n \"text\": \"RHB Now\"\n }\n ],\n \"category\": \"10\"\n },\n {\n \"name\": \"subEmploymentSector\",\n \"displayName\": \"Sub Employment Sector\",\n \"placeholder\": \"Select Sub Employment Sector\",\n \"startWithNewLine\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"0011\",\n \"text\": \"Accounting\"\n },\n {\n \"value\": \"0021\",\n \"text\": \"Actuarial / Statistic\"\n },\n {\n \"value\": \"0031\",\n \"text\": \"Advertising\"\n },\n {\n \"value\": \"0032\",\n \"text\": \"Public Relations\"\n },\n {\n \"value\": \"0041\",\n \"text\": \"Aerospace\"\n },\n {\n \"value\": \"0051\",\n \"text\": \"Agricultural / Chemicals / Forest Products\"\n },\n {\n \"value\": \"0052\",\n \"text\": \"Support activities to agriculture and post-harvest crops activities\"\n },\n {\n \"value\": \"0053\",\n \"text\": \"Growing paddy, sugar cane, vegetables and melons, roots, tubers, perennial crops\"\n },\n {\n \"value\": \"0054\",\n \"text\": \"Raising of animals\"\n },\n {\n \"value\": \"0055\",\n \"text\": \"Mixed farming\"\n },\n {\n \"value\": \"0056\",\n \"text\": \"Fishing / aquaculture\"\n },\n {\n \"value\": \"0057\",\n \"text\": \"Plantation (e.g. oil palm, rubber tree, cocoa, coconut etc.)\"\n },\n {\n \"value\": \"0058\",\n \"text\": \"Silviculture and forestry activities\"\n },\n {\n \"value\": \"0059\",\n \"text\": \"Veterinary activities\"\n },\n {\n \"value\": \"0061\",\n \"text\": \"Architecture\"\n },\n {\n \"value\": \"0062\",\n \"text\": \"Engineering Services\"\n },\n {\n \"value\": \"0063\",\n \"text\": \"Engineering technical services\"\n },\n {\n \"value\": \"0064\",\n \"text\": \"Surveying Services\"\n },\n {\n \"value\": \"0071\",\n \"text\": \"Manufacture of Switchgear and Switchboard Apparatus\"\n },\n {\n \"value\": \"0072\",\n \"text\": \"Manufacture of Insulated wire and cable\"\n },\n {\n \"value\": \"0073\",\n \"text\": \"Manufacture of TV radio communication equipment\"\n },\n {\n \"value\": \"0074\",\n \"text\": \"Manufacture of Typesetting; Platemaking and Related Services\"\n },\n {\n \"value\": \"0075\",\n \"text\": \"Manufacture of Aircraft and related machinery\"\n },\n {\n \"value\": \"0076\",\n \"text\": \"Manufacture of Consumer goods & Pharmaceuticals\"\n },\n {\n \"value\": \"0077\",\n \"text\": \"Manufacture of jewellery, bijouterie & related articles\"\n },\n {\n \"value\": \"0078\",\n \"text\": \"Manufacture of machinery/ motor vehicles/ other transport equipment\"\n },\n {\n \"value\": \"0079\",\n \"text\": \"Manufacture of other fabricated metal product\"\n },\n {\n \"value\": \"0081\",\n \"text\": \"Aviation\"\n },\n {\n \"value\": \"0091\",\n \"text\": \"Radio, Television, and Consumer Electronics Stores\"\n },\n {\n \"value\": \"0092\",\n \"text\": \"Retail garments / apparels\"\n },\n {\n \"value\": \"0093\",\n \"text\": \"Household goods\"\n },\n {\n \"value\": \"0094\",\n \"text\": \"Furniture stores\"\n },\n {\n \"value\": \"0095\",\n \"text\": \"Retail sale of Chinaware Glassware\"\n },\n {\n \"value\": \"0096\",\n \"text\": \"Other retail trade (except for motor vehicle, f&b, health care and grocery)\"\n },\n {\n \"value\": \"0097\",\n \"text\": \"Other retail sale in non-specialized stores\"\n },\n {\n \"value\": \"0098\",\n \"text\": \"Retail sale of beer, wine and spirits\"\n },\n {\n \"value\": \"0099\",\n \"text\": \"Retail sale of tobacco products in specialized store\"\n },\n {\n \"value\": \"0101\",\n \"text\": \"Radio and Television Repair Shops\"\n },\n {\n \"value\": \"0102\",\n \"text\": \"Repair Shops and Related Services, N.E.C.;\"\n },\n {\n \"value\": \"0103\",\n \"text\": \"Refrigeration and Air-Conditioning Service and Repair Shops;\"\n },\n {\n \"value\": \"0104\",\n \"text\": \"Computer related activities;\"\n },\n {\n \"value\": \"0105\",\n \"text\": \"Electrical and Electronic Repair Shops, N.E.C\"\n },\n {\n \"value\": \"00110\",\n \"text\": \"Construction of other civil engineering projects (specialised)\"\n },\n {\n \"value\": \"0111\",\n \"text\": \"Building Construction\"\n },\n {\n \"value\": \"00111\",\n \"text\": \"Construction of other civil engineering projects (not specialised)\"\n },\n {\n \"value\": \"00112\",\n \"text\": \"Electrical, Installation and plumbing\"\n },\n {\n \"value\": \"00113\",\n \"text\": \"Demolition and site preparation\"\n },\n {\n \"value\": \"00114\",\n \"text\": \"Construction of utility projects\"\n },\n {\n \"value\": \"0114\",\n \"text\": \"Construction of Residential house (landed property)\"\n },\n {\n \"value\": \"00115\",\n \"text\": \"Other specialized construction activities\"\n },\n {\n \"value\": \"0115\",\n \"text\": \"Construction of other residentials\"\n },\n {\n \"value\": \"00116\",\n \"text\": \"Roofing, Siding, and Sheet Metal Work\"\n },\n {\n \"value\": \"0116\",\n \"text\": \"Construction of industrial building & factories\"\n },\n {\n \"value\": \"00117\",\n \"text\": \"Water, Sewer, Pipeline, and Communications and Power Line Construction\"\n },\n {\n \"value\": \"0117\",\n \"text\": \"Construction of office buildings\"\n },\n {\n \"value\": \"00118\",\n \"text\": \"Assembly and erection of prefabricated constructions on the site\"\n },\n {\n \"value\": \"0118\",\n \"text\": \"Construction of commercial complex\"\n },\n {\n \"value\": \"0119\",\n \"text\": \"Construction of infrastructure\"\n },\n {\n \"value\": \"00119\",\n \"text\": \"Construction of hotels\"\n },\n {\n \"value\": \"00120\",\n \"text\": \"Construction of condominiums/apartments\"\n },\n {\n \"value\": \"0121\",\n \"text\": \"Creative / Graphics\"\n },\n {\n \"value\": \"0131\",\n \"text\": \"Customer Service\"\n },\n {\n \"value\": \"0141\",\n \"text\": \"Higher Education with significant reliance on foreign/international students\"\n },\n {\n \"value\": \"0142\",\n \"text\": \"Higher Education with no significant reliance on foreign students\"\n },\n {\n \"value\": \"0143\",\n \"text\": \"Administration of the State and the economic and social policy of the community\"\n },\n {\n \"value\": \"0144\",\n \"text\": \"Public - Pre school, primary and secondary level education\"\n },\n {\n \"value\": \"0145\",\n \"text\": \"Private - Pre school, primary and secondary level education\"\n },\n {\n \"value\": \"0151\",\n \"text\": \"O&G - Upstream i.e. drilling, extraction, exploration and field services\"\n },\n {\n \"value\": \"0152\",\n \"text\": \"O&G - Other than Upstream\"\n },\n {\n \"value\": \"0153\",\n \"text\": \"Mining of iron ores and other non-ferrous metal ores\"\n },\n {\n \"value\": \"0154\",\n \"text\": \"Stonequarrying, clay & sand pits\"\n },\n {\n \"value\": \"155\",\n \"text\": \"Chemical & fertilizer mining\"\n },\n {\n \"value\": \"0155\",\n \"text\": \"Chemical & fertiliser mining\"\n },\n {\n \"value\": \"156\",\n \"text\": \"Other than oil and gas\"\n },\n {\n \"value\": \"0156\",\n \"text\": \"Other than oil and gas\"\n },\n {\n \"value\": \"161\",\n \"text\": \"Engineering Services & Engineering Technical Services\"\n },\n {\n \"value\": \"0161\",\n \"text\": \"Engineering Services & Engineering Technical Services\"\n },\n {\n \"value\": \"171\",\n \"text\": \"Banking services\"\n },\n {\n \"value\": \"0171\",\n \"text\": \"Banking services\"\n },\n {\n \"value\": \"172\",\n \"text\": \"Finance services\"\n },\n {\n \"value\": \"0172\",\n \"text\": \"Finance services\"\n },\n {\n \"value\": \"0173\",\n \"text\": \"Insurance services\"\n },\n {\n \"value\": \"173\",\n \"text\": \"Insurance services\"\n },\n {\n \"value\": \"0174\",\n \"text\": \"Money lenders / Money Changers/ Remittance Services/ Money Transmitter/ Check Cashing Business/ Currency Exchange\"\n },\n {\n \"value\": \"0175\",\n \"text\": \"Pawnshop\"\n },\n {\n \"value\": \"0176\",\n \"text\": \"Activity of holding companies\"\n },\n {\n \"value\": \"0177\",\n \"text\": \"Financial leasing activities\"\n },\n {\n \"value\": \"0178\",\n \"text\": \"Finance - credit card services\"\n },\n {\n \"value\": \"0179\",\n \"text\": \"Consultancy services\"\n },\n {\n \"value\": \"0181\",\n \"text\": \"Freight Forwarding Services\"\n },\n {\n \"value\": \"0191\",\n \"text\": \"Government\"\n },\n {\n \"value\": \"0192\",\n \"text\": \"Public Service\"\n },\n {\n \"value\": \"0193\",\n \"text\": \"Military\"\n },\n {\n \"value\": \"0201\",\n \"text\": \"Tourism & Hospitality\"\n },\n {\n \"value\": \"0202\",\n \"text\": \"Recreational related services / activities\"\n },\n {\n \"value\": \"0211\",\n \"text\": \"Food Service Activities\"\n },\n {\n \"value\": \"0212\",\n \"text\": \"Organization Hotel, Lodging Houses, chalet, rest house, homestay, Inn, motels, rooming sporting, and recreational camp\"\n },\n {\n \"value\": \"0213\",\n \"text\": \"Other short term accommodation not mentioned above\"\n },\n {\n \"value\": \"0214\",\n \"text\": \"Restaurants, bars and canteens\"\n },\n {\n \"value\": \"0215\",\n \"text\": \"Restaurant, bar (other discretionary items and significant reliance on dine-in)\"\n },\n {\n \"value\": \"0216\",\n \"text\": \"Event catering and other food service activities\"\n },\n {\n \"value\": \"0217\",\n \"text\": \"Eating Places, Except Food Service, Institutional\"\n },\n {\n \"value\": \"0221\",\n \"text\": \"Human Resources\"\n },\n {\n \"value\": \"0231\",\n \"text\": \"Investment advisory services\"\n },\n {\n \"value\": \"0241\",\n \"text\": \"Journalist / Editor\"\n },\n {\n \"value\": \"0251\",\n \"text\": \"Motion picture, video and television programme production, sound recording and music publishing activities\"\n },\n {\n \"value\": \"0252\",\n \"text\": \"Programming and broadcasting activities\"\n },\n {\n \"value\": \"0253\",\n \"text\": \"News agency activities\"\n },\n {\n \"value\": \"0254\",\n \"text\": \"Media, culture and recreational activities\"\n },\n {\n \"value\": \"0261\",\n \"text\": \"Medical / Health Services\"\n },\n {\n \"value\": \"0262\",\n \"text\": \"Kidney Dialysis Centers\"\n },\n {\n \"value\": \"0263\",\n \"text\": \"Intermediate Care Facilities\"\n },\n {\n \"value\": \"0264\",\n \"text\": \"Home Health Care Services Facilities\"\n },\n {\n \"value\": \"0271\",\n \"text\": \"Non-Profit Organization\"\n },\n {\n \"value\": \"0281\",\n \"text\": \"Geology\"\n },\n {\n \"value\": \"0291\",\n \"text\": \"Pharmaceuticals products\"\n },\n {\n \"value\": \"0301\",\n \"text\": \"Real estate operations - shopping complex\"\n },\n {\n \"value\": \"0302\",\n \"text\": \"Appraisal services for real estate\"\n },\n {\n \"value\": \"0303\",\n \"text\": \"Real estate activities on a fee or contract basis\"\n },\n {\n \"value\": \"0304\",\n \"text\": \"Buying, selling, renting and operating of residential buildings or land\"\n },\n {\n \"value\": \"0305\",\n \"text\": \"Real estate operations - shophouse\"\n },\n {\n \"value\": \"0306\",\n \"text\": \"Real estate Operation - Industrial building & factories\"\n },\n {\n \"value\": \"0307\",\n \"text\": \"Real estate Operation - office building\"\n },\n {\n \"value\": \"0308\",\n \"text\": \"Real estate Operation - other commercial building\"\n },\n {\n \"value\": \"0309\",\n \"text\": \"Real estate operation not related above\"\n },\n {\n \"value\": \"0311\",\n \"text\": \"Administrative and Support Service Activities\"\n },\n {\n \"value\": \"0321\",\n \"text\": \"Social Work Activites\"\n },\n {\n \"value\": \"0331\",\n \"text\": \"Wired / Wireless telecommunications activities\"\n },\n {\n \"value\": \"0341\",\n \"text\": \"Tour operators\"\n },\n {\n \"value\": \"0342\",\n \"text\": \"Travel Agencies\"\n },\n {\n \"value\": \"0351\",\n \"text\": \"Rail transport\"\n },\n {\n \"value\": \"0352\",\n \"text\": \"Transportation Services, N.E.C.\"\n },\n {\n \"value\": \"0353\",\n \"text\": \"Service activities incidental to land / road transportation\"\n },\n {\n \"value\": \"0354\",\n \"text\": \"Scheduled and Non-Scheduled Air Transport (Transport of passengers by air over regular routes and on regular schedules)\"\n },\n {\n \"value\": \"0355\",\n \"text\": \"Aircrafts, Aircraft engine / parts, space vehicles\"\n },\n {\n \"value\": \"0356\",\n \"text\": \"Tanks and Tank components\"\n },\n {\n \"value\": \"0357\",\n \"text\": \"Warehousing and storage\"\n },\n {\n \"value\": \"0358\",\n \"text\": \"Water transport\"\n },\n {\n \"value\": \"0359\",\n \"text\": \"Other transportation support activities n.e.c. (e.g. arranging transportation services, terminal maintenance services, etc)\"\n },\n {\n \"value\": \"0361\",\n \"text\": \"Casinos including Junket Operators\"\n },\n {\n \"value\": \"0362\",\n \"text\": \"Karaoke lounges, internet cafe or video arcade\"\n },\n {\n \"value\": \"0363\",\n \"text\": \"Amusement and Recreation Services\"\n },\n {\n \"value\": \"0364\",\n \"text\": \"Membership Sports and Recreation Clubs\"\n },\n {\n \"value\": \"0365\",\n \"text\": \"Entertainment services\"\n },\n {\n \"value\": \"0366\",\n \"text\": \"Arts & Theatrical\"\n },\n {\n \"value\": \"0371\",\n \"text\": \"Electricty power generation\"\n },\n {\n \"value\": \"0372\",\n \"text\": \"Steam and air conditioning supply\"\n },\n {\n \"value\": \"0373\",\n \"text\": \"Water collection, treatment and supply\"\n },\n {\n \"value\": \"0381\",\n \"text\": \"Water Supply\"\n },\n {\n \"value\": \"0382\",\n \"text\": \"Sewerage\"\n },\n {\n \"value\": \"0383\",\n \"text\": \"Waste Management and Remediation Activities\"\n },\n {\n \"value\": \"0384\",\n \"text\": \"Recycling of non-metal (including rubber & textile fibre)\"\n },\n {\n \"value\": \"0385\",\n \"text\": \"Recycling of tin and other metal waste and scrap\"\n },\n {\n \"value\": \"0391\",\n \"text\": \"Activities of Households as Employers; Undifferentiated Goods and Services Producing Activities of Households for Own Use\"\n },\n {\n \"value\": \"0401\",\n \"text\": \"Activities of Extraterritorial Organisations and Bodies\"\n },\n {\n \"value\": \"0411\",\n \"text\": \"Unemployed/ Outside Labour Force\"\n },\n {\n \"value\": \"0421\",\n \"text\": \"Activities of membership organisations (Political/Religious/Trade Union)\"\n },\n {\n \"value\": \"0422\",\n \"text\": \"International Business Corporations and other similar entities\"\n },\n {\n \"value\": \"0423\",\n \"text\": \"Business Activities - Intermediary activities - trustee/ nominee/ agent OR Shell Companies\"\n },\n {\n \"value\": \"0424\",\n \"text\": \"Other Services\"\n },\n {\n \"value\": \"0425\",\n \"text\": \"Offshore Corporations (or their subsidiaries) and bank set up in tax and/or secrecy havens\"\n },\n {\n \"value\": \"0426\",\n \"text\": \"Building Cleaning and Maintenance Services, N.E.C.\"\n },\n {\n \"value\": \"0427\",\n \"text\": \"Detective, Guard, and Armored Car Services\"\n },\n {\n \"value\": \"0428\",\n \"text\": \"Rental, Leasing and Packaging ( tour operator, reservation services and related activities, Organisation of conventions and trade shows)\"\n },\n {\n \"value\": \"0429\",\n \"text\": \"Funeral Service and Crematories\"\n },\n {\n \"value\": \"0431\",\n \"text\": \"Legal Services\"\n },\n {\n \"value\": \"0441\",\n \"text\": \"Research & Experiemental Development Services\"\n },\n {\n \"value\": \"0451\",\n \"text\": \"Other Professional, scientific and Technical activities\"\n },\n {\n \"value\": \"00510\",\n \"text\": \"Hunting, trapping and related service activities\"\n },\n {\n \"value\": \"00511\",\n \"text\": \"Logging\"\n },\n {\n \"value\": \"00710\",\n \"text\": \"Manufacture of watches and clocks\"\n },\n {\n \"value\": \"0711\",\n \"text\": \"Manufacture of others\"\n },\n {\n \"value\": \"00711\",\n \"text\": \"Manufacture of others\"\n },\n {\n \"value\": \"0712\",\n \"text\": \"Maintenance and repair of motor vehicles\"\n },\n {\n \"value\": \"00712\",\n \"text\": \"Maintenance and repair of motor vehicles\"\n },\n {\n \"value\": \"0713\",\n \"text\": \"Manufacture of furniture\"\n },\n {\n \"value\": \"00713\",\n \"text\": \"Manufacture of furniture\"\n },\n {\n \"value\": \"0714\",\n \"text\": \"Manufacture of packaging and stretch film\"\n },\n {\n \"value\": \"00714\",\n \"text\": \"Manufacture of packaging and stretch film\"\n },\n {\n \"value\": \"0715\",\n \"text\": \"Manufacture of plastic product\"\n },\n {\n \"value\": \"00715\",\n \"text\": \"Manufacture of plastic product\"\n },\n {\n \"value\": \"0716\",\n \"text\": \"Manufacture of rubber product\"\n },\n {\n \"value\": \"00716\",\n \"text\": \"Manufacture of rubber product\"\n },\n {\n \"value\": \"00717\",\n \"text\": \"Manufacture of processed food or beverages products\"\n },\n {\n \"value\": \"0717\",\n \"text\": \"Manufacture of processed food or beverages products\"\n },\n {\n \"value\": \"00718\",\n \"text\": \"Manufacture of wood product except furniture\"\n },\n {\n \"value\": \"0718\",\n \"text\": \"Manufacture of wood product except furniture\"\n },\n {\n \"value\": \"00719\",\n \"text\": \"Manufacture of refined petroleum products\"\n },\n {\n \"value\": \"0719\",\n \"text\": \"Manufacture of refined petroleum products\"\n },\n {\n \"value\": \"00720\",\n \"text\": \"Manufacture of chemicals and chemical products (except for refined petroleum products)\"\n },\n {\n \"value\": \"0720\",\n \"text\": \"Manufacture of chemicals and chemical products (except for refined petroleum products)\"\n },\n {\n \"value\": \"00721\",\n \"text\": \"Manufacture of electrical equipment or components\"\n },\n {\n \"value\": \"00722\",\n \"text\": \"Manufacture of dairy food\"\n },\n {\n \"value\": \"00723\",\n \"text\": \"Manufacture of grain mills\"\n },\n {\n \"value\": \"00724\",\n \"text\": \"Manufacture of other food product (except dairy food and grain mills, starches and starch products)\"\n },\n {\n \"value\": \"00725\",\n \"text\": \"Manufacture of vegetable and animal oils and fats\"\n },\n {\n \"value\": \"00726\",\n \"text\": \"Manufacture of textiles\"\n },\n {\n \"value\": \"00727\",\n \"text\": \"Manufacture of footwear\"\n },\n {\n \"value\": \"00728\",\n \"text\": \"Manufacture of building materials\"\n },\n {\n \"value\": \"00729\",\n \"text\": \"Manufacture of glass and glass products\"\n },\n {\n \"value\": \"00730\",\n \"text\": \"Manufacture of mineral products\"\n },\n {\n \"value\": \"00731\",\n \"text\": \"Manufacture of medical and dental instruments and supplies\"\n },\n {\n \"value\": \"00732\",\n \"text\": \"Manufacturing of automobile or autopart\"\n },\n {\n \"value\": \"00733\",\n \"text\": \"Manufacture of paper and paper products\"\n },\n {\n \"value\": \"00734\",\n \"text\": \"Manufacture of gas and distribution of gaseous fuels through mains\"\n },\n {\n \"value\": \"00735\",\n \"text\": \"Manufacture of fertiliser pesticides\"\n },\n {\n \"value\": \"00736\",\n \"text\": \"Production of natural mineral water and other bottled water\"\n },\n {\n \"value\": \"00901\",\n \"text\": \"Retail trade not in stores, stalls or markets\"\n },\n {\n \"value\": \"00902\",\n \"text\": \"Retail sale via stalls and markets\"\n },\n {\n \"value\": \"00903\",\n \"text\": \"Wholesale of beer, wine and spirits\"\n },\n {\n \"value\": \"00904\",\n \"text\": \"Wholesale of tobacco, cigar, cigarettes\"\n },\n {\n \"value\": \"00905\",\n \"text\": \"Wholesale of construction and civil engineering machinery and equipment\"\n },\n {\n \"value\": \"00906\",\n \"text\": \"Wholesale of other machinery for use in industry, trade and navigation and other services n.e.c.\"\n },\n {\n \"value\": \"00907\",\n \"text\": \"Motor Vehicle dealer (Used)\"\n },\n {\n \"value\": \"00908\",\n \"text\": \"Jewel / Gem / Precious Metal\"\n },\n {\n \"value\": \"00909\",\n \"text\": \"Automobile and autoparts\"\n },\n {\n \"value\": \"00910\",\n \"text\": \"Hardware / construction material\"\n },\n {\n \"value\": \"00911\",\n \"text\": \"Electrical products\"\n },\n {\n \"value\": \"00912\",\n \"text\": \"Chemical / Petrochemical\"\n },\n {\n \"value\": \"00913\",\n \"text\": \"Cosmetics\"\n },\n {\n \"value\": \"00914\",\n \"text\": \"Import / Export\"\n },\n {\n \"value\": \"00915\",\n \"text\": \"Medical related products\"\n },\n {\n \"value\": \"00916\",\n \"text\": \"Automatic Merchandising Machine Operators\"\n },\n {\n \"value\": \"00917\",\n \"text\": \"Direct Selling Establishments\"\n },\n {\n \"value\": \"00918\",\n \"text\": \"Liquefied Petroleum Gas (Bottled Gas) Dealers\"\n },\n {\n \"value\": \"00919\",\n \"text\": \"Motor Vehicle Dealers (New )\"\n },\n {\n \"value\": \"00920\",\n \"text\": \"Office equipment\"\n },\n {\n \"value\": \"00921\",\n \"text\": \"Stationery, books, periodical and newspapers\"\n },\n {\n \"value\": \"00922\",\n \"text\": \"Retail - Petrol Station\"\n },\n {\n \"value\": \"00923\",\n \"text\": \"Retail / wholesaler other than above\"\n },\n {\n \"value\": \"01700\",\n \"text\": \"Other monetary intermediation\"\n },\n {\n \"value\": \"1700\",\n \"text\": \"Other monetary intermediation\"\n },\n {\n \"value\": \"01701\",\n \"text\": \"Research & Experiemental Development Services\"\n },\n {\n \"value\": \"1701\",\n \"text\": \"Research & Experimental Development Services\"\n },\n {\n \"value\": \"01702\",\n \"text\": \"licensed money lending activities, co-operative with credit functions and factoring companies\"\n },\n {\n \"value\": \"1702\",\n \"text\": \"licensed money lending activities, co-operative with credit functions and factoring companies\"\n },\n {\n \"value\": \"03510\",\n \"text\": \"Postal and courier activities\"\n },\n {\n \"value\": \"04201\",\n \"text\": \"Beauty Shops\"\n },\n {\n \"value\": \"04202\",\n \"text\": \"Barber Shops\"\n },\n {\n \"value\": \"04203\",\n \"text\": \"Libraries, archives, museums and other cultural activities\"\n },\n {\n \"value\": \"04204\",\n \"text\": \"Reupholstery and Furniture Repair\"\n },\n {\n \"value\": \"04205\",\n \"text\": \"Armature Rewinding Shops\"\n },\n {\n \"value\": \"04206\",\n \"text\": \"Welding Repair\"\n },\n {\n \"value\": \"04207\",\n \"text\": \"Maintenance and repair of motor vehicles\"\n },\n {\n \"value\": \"04208\",\n \"text\": \"Renting and leasing of motor vehicle, household good, machinery, equipment and tangible goods\"\n },\n {\n \"value\": \"04209\",\n \"text\": \"Business management consultancy services\"\n },\n {\n \"value\": \"04210\",\n \"text\": \"Activties of collection agencies / credit bureaus\"\n },\n {\n \"value\": \"04211\",\n \"text\": \"Repair of bicycles\"\n },\n {\n \"value\": \"04212\",\n \"text\": \"Repair of footwear and other leather goods\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"dateApplied\",\n \"displayName\": \"Date Applied\",\n \"type\": \"text\",\n \"inputType\": \"date\",\n \"category\": \"11\"\n },\n {\n \"name\": \"entity\",\n \"displayName\": \"Entity\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"C\",\n \"text\": \"Conventional\"\n },\n {\n \"value\": \"I\",\n \"text\": \"Islamic\"\n }\n ],\n \"category\": \"10\"\n },\n {\n \"name\": \"facilityPackage\",\n \"displayName\": \"Facility Package\",\n \"type\": \"text\",\n \"category\": \"11\"\n },\n {\n \"name\": \"purposeOfAcquisition\",\n \"displayName\": \"Purpose of Acquisition\",\n \"placeholder\": \"Select your Purpose of Acquisition\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Internal Use\",\n \"text\": \"Internal Use\"\n },\n {\n \"value\": \"Tender\",\n \"text\": \"Tender\"\n },\n {\n \"value\": \"Service\",\n \"text\": \"Service\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"facilityPurpose\",\n \"displayName\": \"Facility Purpose\",\n \"type\": \"dropdown\",\n \"defaultValue\": \"Refinancing of property\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Staff ASB - Untuk Kegunaan Sendiri dalam Pelaburan ASB\"\n },\n {\n \"value\": \"02\",\n \"text\": \"ASB - Untuk Kegunaan Sendiri dalam pelaburan ASB\"\n },\n {\n \"value\": \"002\",\n \"text\": \"Finance purchase of property/land for INVESTMENT.\"\n },\n {\n \"value\": \"03\",\n \"text\": \"ASB2 - Untuk Kegunaan Sendiri dalam Pelaburan ASB2\"\n },\n {\n \"value\": \"003\",\n \"text\": \"Finance purchase of prop/land for own occupation\"\n },\n {\n \"value\": \"04\",\n \"text\": \"Personal Consumption Against ASB/ASM2W Certificate\"\n },\n {\n \"value\": \"05\",\n \"text\": \"ASB/ASM2W for Sole-prop Business\"\n },\n {\n \"value\": \"005\",\n \"text\": \"Personal consumption\"\n },\n {\n \"value\": \"008\",\n \"text\": \"Construction of property\"\n },\n {\n \"value\": \"010\",\n \"text\": \"Purchase of property for INVESTMENT & consumption.\"\n },\n {\n \"value\": \"013\",\n \"text\": \"Purchase of car park\"\n },\n {\n \"value\": \"015\",\n \"text\": \"To finance renovation/upgrading cost\"\n },\n {\n \"value\": \"016\",\n \"text\": \"To part finance Car Park and Renovation Cost\"\n },\n {\n \"value\": \"018\",\n \"text\": \"Staff - Renovation of property under staff rate\"\n },\n {\n \"value\": \"023\",\n \"text\": \"Refinancing of property\"\n },\n {\n \"value\": \"026\",\n \"text\": \"Staff Sundry Loan - Calamities\"\n },\n {\n \"value\": \"027\",\n \"text\": \"Staff-To part finance Medical Expenses\"\n },\n {\n \"value\": \"028\",\n \"text\": \"Staff-To part finance the purchase of a personal computer\"\n },\n {\n \"value\": \"029\",\n \"text\": \"Staff-Purchase of new car\"\n },\n {\n \"value\": \"030\",\n \"text\": \"Staff- study loan\"\n },\n {\n \"value\": \"031\",\n \"text\": \"Staff-Purchase of motorcycle\"\n },\n {\n \"value\": \"036\",\n \"text\": \"Staff-Staff Sundry loan\"\n },\n {\n \"value\": \"037\",\n \"text\": \"Booking Fee - Car\"\n },\n {\n \"value\": \"038\",\n \"text\": \"Debt Consolidation\"\n },\n {\n \"value\": \"039\",\n \"text\": \"Education\"\n },\n {\n \"value\": \"040\",\n \"text\": \"Electrical Goods\"\n },\n {\n \"value\": \"041\",\n \"text\": \"Home Furnishing/Equipment\"\n },\n {\n \"value\": \"042\",\n \"text\": \"Medical Expenses\"\n },\n {\n \"value\": \"043\",\n \"text\": \"Online Financing\"\n },\n {\n \"value\": \"044\",\n \"text\": \"Personal Refinancing\"\n },\n {\n \"value\": \"045\",\n \"text\": \"Property/House Downpayment\"\n },\n {\n \"value\": \"046\",\n \"text\": \"Renovation\"\n },\n {\n \"value\": \"047\",\n \"text\": \"Travel\"\n },\n {\n \"value\": \"048\",\n \"text\": \"Additional Financing for Revival of Abandoned Project\"\n },\n {\n \"value\": \"100\",\n \"text\": \"Purchase of Resident / Non Resident Property for personal purpose\"\n },\n {\n \"value\": \"101\",\n \"text\": \"Purchase of securities quoted on the Bursa Malaysia and/or financing of IPO shares\"\n },\n {\n \"value\": \"102\",\n \"text\": \"Purchase of securities quoted on the Bursa Malaysia and/or financing of IPO shares\"\n },\n {\n \"value\": \"COM01AF\",\n \"text\": \"PURCHASE OF COMMERCIAL VEHICLES\"\n },\n {\n \"value\": \"PRI01AF\",\n \"text\": \"PURCHASE OF PRIVATE VEHICLES\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"facilityType\",\n \"displayName\": \"Facility Type (Personal)\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"PLFT001\",\n \"text\": \"Conventional\"\n },\n {\n \"value\": \"PLFT002\",\n \"text\": \"Private Sector\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"facilityType\",\n \"displayName\": \"Facility Type (Auto)\",\n \"placeholder\": \"Facility Type\",\n \"startWithNewLine\": false,\n \"visible\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"HPFAC04\",\n \"text\": \" Islamic - Variable rate\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"financingTenure\",\n \"displayName\": \"Financing Tenure (Years)\",\n \"placeholder\": \"Financing Tenure (Years)\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 3,\n \"min\": 1,\n \"max\": 7,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid financing tenure from 1 to 7 years.\",\n \"regex\": \"^[1-7]$\"\n }\n ],\n \"inputType\": \"number\",\n \"category\": \"11\"\n },\n {\n \"name\": \"product\",\n \"displayName\": \"Product (Auto)\",\n \"placeholder\": \"Product\",\n \"startWithNewLine\": false,\n \"visible\": false,\n \"isRequired\": true,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"AFI04\",\n \"text\": \"Vehicle Financing-i (Variable Rate SBR)\"\n }\n ],\n \"maxLength\": 40,\n \"category\": \"11\"\n },\n {\n \"name\": \"purposeOfAcctOpen\",\n \"displayName\": \"Purpose of Account Opening\",\n \"type\": \"dropdown\",\n \"defaultValue\": \"Personal Loan/Financing\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Payroll/Salary\"\n },\n {\n \"value\": \"03\",\n \"text\": \"Savings/Fixed/Term Deposits\"\n },\n {\n \"value\": \"04\",\n \"text\": \"Remittance (Local/Foreign)\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Household/Family Expenses\"\n },\n {\n \"value\": \"06\",\n \"text\": \"Investment\"\n },\n {\n \"value\": \"08\",\n \"text\": \"Standing Instruction\"\n },\n {\n \"value\": \"11\",\n \"text\": \"EPF Withdrawals\"\n },\n {\n \"value\": \"12\",\n \"text\": \"Personal Loan/Financing\"\n },\n {\n \"value\": \"14\",\n \"text\": \"Equipment & Machinery Expenses\"\n },\n {\n \"value\": \"15\",\n \"text\": \"Business Operating Account\"\n },\n {\n \"value\": \"16\",\n \"text\": \"Client's Account\"\n },\n {\n \"value\": \"17\",\n \"text\": \"Sales Proceed\"\n },\n {\n \"value\": \"18\",\n \"text\": \"Capital Injection\"\n },\n {\n \"value\": \"19\",\n \"text\": \"Administration of Estate Account\"\n },\n {\n \"value\": \"20\",\n \"text\": \"Liquidation/Disposal of Asset\"\n },\n {\n \"value\": \"21\",\n \"text\": \"Financing Payment/Drawdown\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"sourceOfFund\",\n \"displayName\": \"Source of Fund\",\n \"placeholder\": \"Source of Fund\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Income/Salary\"\n },\n {\n \"value\": \"02\",\n \"text\": \"Own Bank Transfer (within RHB)\"\n },\n {\n \"value\": \"04\",\n \"text\": \"EPF/SOCSO/Pension/Gratuity\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Savings/Investment\"\n },\n {\n \"value\": \"08\",\n \"text\": \"Scholarship/Allowance/Edu Loan\"\n },\n {\n \"value\": \"13\",\n \"text\": \"Trust Funds\"\n },\n {\n \"value\": \"15\",\n \"text\": \"Divorce Sett/Compensation\"\n },\n {\n \"value\": \"17\",\n \"text\": \"Sale of Inves/Shares/Prop/Land\"\n },\n {\n \"value\": \"18\",\n \"text\": \"Dividends/Profits\"\n },\n {\n \"value\": \"20\",\n \"text\": \"Rental Proceeds\"\n },\n {\n \"value\": \"21\",\n \"text\": \"Commission\"\n },\n {\n \"value\": \"22\",\n \"text\": \"Directors Fee/Salary\"\n },\n {\n \"value\": \"23\",\n \"text\": \"Welfare Allowance\"\n },\n {\n \"value\": \"24\",\n \"text\": \"Return on Investment\"\n },\n {\n \"value\": \"25\",\n \"text\": \"FD Placement Roll Over/Renewal\"\n },\n {\n \"value\": \"26\",\n \"text\": \"Insurance Maturity/Surrender\"\n },\n {\n \"value\": \"27\",\n \"text\": \"Legal Settlement\"\n },\n {\n \"value\": \"28\",\n \"text\": \"Credit Facility Approve by FI\"\n },\n {\n \"value\": \"29\",\n \"text\": \"Trf frm Parent/Holding/Subs\"\n },\n {\n \"value\": \"30\",\n \"text\": \"Trf frm Own Acct with Oth FI\"\n },\n {\n \"value\": \"31\",\n \"text\": \"Spouse/Parents/Children\"\n },\n {\n \"value\": \"32\",\n \"text\": \"Financial Aid/Subsidies\"\n },\n {\n \"value\": \"33\",\n \"text\": \"Part-time Income\"\n },\n {\n \"value\": \"34\",\n \"text\": \"Inheritance\"\n },\n {\n \"value\": \"35\",\n \"text\": \"Gift/Donation\"\n },\n {\n \"value\": \"36\",\n \"text\": \"Winning-legal Gambling/Contest\"\n },\n {\n \"value\": \"37\",\n \"text\": \"Business/Sales Proceeds\"\n },\n {\n \"value\": \"38\",\n \"text\": \"Crypto Currency/Digital Asset Investment Proceeds\"\n }\n ],\n \"category\": \"4\"\n },\n {\n \"name\": \"preferredBranch\",\n \"displayName\": \"Preferred Branch\",\n \"placeholder\": \"Select Preferred Branch\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"000\",\n \"text\": \"Head Office (KL)\"\n },\n {\n \"value\": \"002\",\n \"text\": \"JALAN SILANG (WITH KUP)\"\n },\n {\n \"value\": \"003\",\n \"text\": \"Jalan Bukit Bintang (WITH BBI)\"\n },\n {\n \"value\": \"004\",\n \"text\": \"Jln Tun Sambanthan, Ipoh\"\n },\n {\n \"value\": \"005\",\n \"text\": \"Kampar\"\n },\n {\n \"value\": \"006\",\n \"text\": \"Johor Bahru City Square\"\n },\n {\n \"value\": \"007\",\n \"text\": \"Wisma Khoo, Sandakan\"\n },\n {\n \"value\": \"008\",\n \"text\": \"Putra Square, Kuantan\"\n },\n {\n \"value\": \"009\",\n \"text\": \"New Town, Petaling Jaya\"\n },\n {\n \"value\": \"010\",\n \"text\": \"Seri Kembangan\"\n },\n {\n \"value\": \"011\",\n \"text\": \"Kajang\"\n },\n {\n \"value\": \"012\",\n \"text\": \"Lebuh Pantai\"\n },\n {\n \"value\": \"013\",\n \"text\": \"Bentung\"\n },\n {\n \"value\": \"014\",\n \"text\": \"Batu Pahat\"\n },\n {\n \"value\": \"015\",\n \"text\": \"Kepong\"\n },\n {\n \"value\": \"016\",\n \"text\": \"Tanjung Sepat\"\n },\n {\n \"value\": \"017\",\n \"text\": \"Jln Tunku Ibrahim, Alor Setar\"\n },\n {\n \"value\": \"018\",\n \"text\": \"Jln Tok Hakim, Kota Bharu\"\n },\n {\n \"value\": \"019\",\n \"text\": \"Kuala Terengganu\"\n },\n {\n \"value\": \"020\",\n \"text\": \"Air Tawar\"\n },\n {\n \"value\": \"021\",\n \"text\": \"Kulai\"\n },\n {\n \"value\": \"022\",\n \"text\": \"Jln Gaya, Kota Kinabalu\"\n },\n {\n \"value\": \"024\",\n \"text\": \"Setapak\"\n },\n {\n \"value\": \"025\",\n \"text\": \"Jelapang\"\n },\n {\n \"value\": \"026\",\n \"text\": \"Jln Niaga, Shah Alam\"\n },\n {\n \"value\": \"027\",\n \"text\": \"Bukit Baru\"\n },\n {\n \"value\": \"028\",\n \"text\": \"Jln Chain Ferry, Prai\"\n },\n {\n \"value\": \"029\",\n \"text\": \"Yung Kong\"\n },\n {\n \"value\": \"030\",\n \"text\": \"Kenanga Wholesale City\"\n },\n {\n \"value\": \"031\",\n \"text\": \"Tmn Sg. Besi\"\n },\n {\n \"value\": \"032\",\n \"text\": \"Damansara Jaya\"\n },\n {\n \"value\": \"033\",\n \"text\": \"Kluang\"\n },\n {\n \"value\": \"034\",\n \"text\": \"Jerantut\"\n },\n {\n \"value\": \"035\",\n \"text\": \"Kuala Kurau\"\n },\n {\n \"value\": \"036\",\n \"text\": \"Raub\"\n },\n {\n \"value\": \"037\",\n \"text\": \"Port Klang\"\n },\n {\n \"value\": \"038\",\n \"text\": \"Jln Bakar Arang, Sg. Petani\"\n },\n {\n \"value\": \"039\",\n \"text\": \"Kemaman\"\n },\n {\n \"value\": \"040\",\n \"text\": \"Pasir Gudang\"\n },\n {\n \"value\": \"041\",\n \"text\": \"Bandar Baru Sg. Buloh\"\n },\n {\n \"value\": \"042\",\n \"text\": \"Jelutong\"\n },\n {\n \"value\": \"043\",\n \"text\": \"Tmn Suntex\"\n },\n {\n \"value\": \"044\",\n \"text\": \"Tmn Johor Jaya, Johor Bahru\"\n },\n {\n \"value\": \"045\",\n \"text\": \"JALAN TUN RAZAK (WITH PAS)\"\n },\n {\n \"value\": \"046\",\n \"text\": \"Jln Nakhoda Gampar, Miri\"\n },\n {\n \"value\": \"047\",\n \"text\": \"Tawau\"\n },\n {\n \"value\": \"048\",\n \"text\": \"Inanam\"\n },\n {\n \"value\": \"049\",\n \"text\": \"Tmn Pelangi, Johor Bahru\"\n },\n {\n \"value\": \"050\",\n \"text\": \"Tmn Ungku Tun Aminah\"\n },\n {\n \"value\": \"051\",\n \"text\": \"Jln Tunku Osman, Sibu\"\n },\n {\n \"value\": \"052\",\n \"text\": \"BUKIT MERTAJAM 1(WITH BMT)\"\n },\n {\n \"value\": \"053\",\n \"text\": \"Bandar Baru Uda, Tampoi\"\n },\n {\n \"value\": \"054\",\n \"text\": \"Rawang\"\n },\n {\n \"value\": \"055\",\n \"text\": \"Jln SS15 Subang Jaya\"\n },\n {\n \"value\": \"056\",\n \"text\": \"Mid Valley\"\n },\n {\n \"value\": \"057\",\n \"text\": \"Pandan Indah\"\n },\n {\n \"value\": \"058\",\n \"text\": \"Bayan Baru\"\n },\n {\n \"value\": \"059\",\n \"text\": \"Pasar Borong, Selayang\"\n },\n {\n \"value\": \"060\",\n \"text\": \"IOI Boulevard Puchong\"\n },\n {\n \"value\": \"061\",\n \"text\": \"KLCC\"\n },\n {\n \"value\": \"062\",\n \"text\": \"Bandar Baru Ampang\"\n },\n {\n \"value\": \"063\",\n \"text\": \"Tangkak\"\n },\n {\n \"value\": \"064\",\n \"text\": \"Mentakab\"\n },\n {\n \"value\": \"065\",\n \"text\": \"Bandar Baru Klang\"\n },\n {\n \"value\": \"066\",\n \"text\": \"Wisma Mahmud, Kuching\"\n },\n {\n \"value\": \"067\",\n \"text\": \"First Avenue\"\n },\n {\n \"value\": \"068\",\n \"text\": \"Kuala Lumpur Main\"\n },\n {\n \"value\": \"069\",\n \"text\": \"Kuala Kedah\"\n },\n {\n \"value\": \"070\",\n \"text\": \"Kulim\"\n },\n {\n \"value\": \"073\",\n \"text\": \"Lahad Datu\"\n },\n {\n \"value\": \"074\",\n \"text\": \"The Trillium, Lakefields\"\n },\n {\n \"value\": \"075\",\n \"text\": \"Mergong, Alor Setar\"\n },\n {\n \"value\": \"076\",\n \"text\": \"Ampang Point\"\n },\n {\n \"value\": \"077\",\n \"text\": \"Ayer Itam\"\n },\n {\n \"value\": \"078\",\n \"text\": \"Bangsar Shopping Centre\"\n },\n {\n \"value\": \"079\",\n \"text\": \"Bekok\"\n },\n {\n \"value\": \"080\",\n \"text\": \"Butterworth\"\n },\n {\n \"value\": \"081\",\n \"text\": \"Gopeng\"\n },\n {\n \"value\": \"082\",\n \"text\": \"Gunung Rapat, Ipoh\"\n },\n {\n \"value\": \"083\",\n \"text\": \"Ipoh Garden South\"\n },\n {\n \"value\": \"084\",\n \"text\": \"Jln Bukit Bintang\"\n },\n {\n \"value\": \"086\",\n \"text\": \"Jln Ipoh\"\n },\n {\n \"value\": \"087\",\n \"text\": \"Jln Pasar\"\n },\n {\n \"value\": \"088\",\n \"text\": \"JALAN RAJA LAUT(WITH JIP)\"\n },\n {\n \"value\": \"089\",\n \"text\": \"Jln Raja Uda, Butterworth\"\n },\n {\n \"value\": \"091\",\n \"text\": \"Jementah\"\n },\n {\n \"value\": \"092\",\n \"text\": \"Tmn Sentosa, Johor Bahru\"\n },\n {\n \"value\": \"093\",\n \"text\": \"Kangar\"\n },\n {\n \"value\": \"094\",\n \"text\": \"Ketereh\"\n },\n {\n \"value\": \"095\",\n \"text\": \"Persiaran Sultan Ibrahim, Kelang\"\n },\n {\n \"value\": \"096\",\n \"text\": \"Kluang 2 (WITH KLU)\"\n },\n {\n \"value\": \"098\",\n \"text\": \"Jln Tun HS Lee\"\n },\n {\n \"value\": \"101\",\n \"text\": \"Jln Burma\"\n },\n {\n \"value\": \"102\",\n \"text\": \"Jln Hang Tuah\"\n },\n {\n \"value\": \"103\",\n \"text\": \"Plaza OSK, Jln Ampang\"\n },\n {\n \"value\": \"104\",\n \"text\": \"Meru\"\n },\n {\n \"value\": \"106\",\n \"text\": \"Permas Jaya, Johor Bahru\"\n },\n {\n \"value\": \"107\",\n \"text\": \"RHB SOHO IPOH\"\n },\n {\n \"value\": \"110\",\n \"text\": \"Rantau\"\n },\n {\n \"value\": \"111\",\n \"text\": \"Bandar Sri Permaisuri\"\n },\n {\n \"value\": \"112\",\n \"text\": \"Section 14, Petaling Jaya\"\n },\n {\n \"value\": \"113\",\n \"text\": \"Segamat\"\n },\n {\n \"value\": \"115\",\n \"text\": \"Senai\"\n },\n {\n \"value\": \"116\",\n \"text\": \"Seremban\"\n },\n {\n \"value\": \"118\",\n \"text\": \"Jln Tengku Ampuan Zabedah, Shah Alam\"\n },\n {\n \"value\": \"121\",\n \"text\": \"Bandar Sri Damansara\"\n },\n {\n \"value\": \"123\",\n \"text\": \"Sg. Bakap\"\n },\n {\n \"value\": \"124\",\n \"text\": \"Kg. Baru Sg. Buloh\"\n },\n {\n \"value\": \"125\",\n \"text\": \"Sg. Pelek\"\n },\n {\n \"value\": \"126\",\n \"text\": \"Tmn Pekan Baru, Sg. Petani\"\n },\n {\n \"value\": \"128\",\n \"text\": \"Sungkai\"\n },\n {\n \"value\": \"130\",\n \"text\": \"Tmn Indah\"\n },\n {\n \"value\": \"131\",\n \"text\": \"Tmn Megah\"\n },\n {\n \"value\": \"132\",\n \"text\": \"Tmn Molek, Johor Bahru\"\n },\n {\n \"value\": \"133\",\n \"text\": \"Dataran Wangsa\"\n },\n {\n \"value\": \"134\",\n \"text\": \"Tmn Shamelin\"\n },\n {\n \"value\": \"136\",\n \"text\": \"Tmn Taming Jaya\"\n },\n {\n \"value\": \"139\",\n \"text\": \"UEP Subang Jaya\"\n },\n {\n \"value\": \"140\",\n \"text\": \"Ulu Tiram\"\n },\n {\n \"value\": \"142\",\n \"text\": \"Bandar Baru Nilai\"\n },\n {\n \"value\": \"144\",\n \"text\": \"Menglembu\"\n },\n {\n \"value\": \"145\",\n \"text\": \"Bayan Point\"\n },\n {\n \"value\": \"150\",\n \"text\": \"Jln Masjid, Bintulu\"\n },\n {\n \"value\": \"153\",\n \"text\": \"Damansara Utama\"\n },\n {\n \"value\": \"158\",\n \"text\": \"Plentong, Johor Bahru\"\n },\n {\n \"value\": \"161\",\n \"text\": \"Bagan Serai\"\n },\n {\n \"value\": \"163\",\n \"text\": \"Bahau\"\n },\n {\n \"value\": \"165\",\n \"text\": \"Bukit Mertajam\"\n },\n {\n \"value\": \"169\",\n \"text\": \"Simpang Empat, Hutan Melintang\"\n },\n {\n \"value\": \"176\",\n \"text\": \"Jenjarom\"\n },\n {\n \"value\": \"177\",\n \"text\": \"Jinjang Utara\"\n },\n {\n \"value\": \"182\",\n \"text\": \"Kerteh\"\n },\n {\n \"value\": \"183\",\n \"text\": \"Jln Stesen, Kelang\"\n },\n {\n \"value\": \"187\",\n \"text\": \"Kuala Dungun\"\n },\n {\n \"value\": \"188\",\n \"text\": \"Kuala Kangsar\"\n },\n {\n \"value\": \"190\",\n \"text\": \"Kuala Pilah\"\n },\n {\n \"value\": \"195\",\n \"text\": \"Jln Tun Mustapha\"\n },\n {\n \"value\": \"196\",\n \"text\": \"Pulau Langkawi\"\n },\n {\n \"value\": \"198\",\n \"text\": \"LEBUH PANTAI 3 (WITH PNG)\"\n },\n {\n \"value\": \"202\",\n \"text\": \"Jln Abdullah, Muar\"\n },\n {\n \"value\": \"203\",\n \"text\": \"Overseas Union Garden\"\n },\n {\n \"value\": \"204\",\n \"text\": \"Padang Serai\"\n },\n {\n \"value\": \"205\",\n \"text\": \"Parit Buntar\"\n },\n {\n \"value\": \"207\",\n \"text\": \"Pasir Mas\"\n },\n {\n \"value\": \"208\",\n \"text\": \"Pontian Kecil\"\n },\n {\n \"value\": \"213\",\n \"text\": \"Segambut\"\n },\n {\n \"value\": \"216\",\n \"text\": \"SETAPAK 3 (WITH STP)\"\n },\n {\n \"value\": \"218\",\n \"text\": \"Simpang Renggam\"\n },\n {\n \"value\": \"219\",\n \"text\": \"Sitiawan\"\n },\n {\n \"value\": \"223\",\n \"text\": \"Sg. Siput\"\n },\n {\n \"value\": \"224\",\n \"text\": \"SS2 Petaling Jaya\"\n },\n {\n \"value\": \"225\",\n \"text\": \"Taiping\"\n },\n {\n \"value\": \"228\",\n \"text\": \"Tmn Midah\"\n },\n {\n \"value\": \"231\",\n \"text\": \"Tmn Tun Dr Ismail\"\n },\n {\n \"value\": \"232\",\n \"text\": \"Tanjong Karang\"\n },\n {\n \"value\": \"233\",\n \"text\": \"Tasek, Ipoh\"\n },\n {\n \"value\": \"235\",\n \"text\": \"Teluk Intan\"\n },\n {\n \"value\": \"237\",\n \"text\": \"Yong Peng\"\n },\n {\n \"value\": \"239\",\n \"text\": \"Plaza Damas 3\"\n },\n {\n \"value\": \"240\",\n \"text\": \"Putrajaya\"\n },\n {\n \"value\": \"242\",\n \"text\": \"Lawas\"\n },\n {\n \"value\": \"252\",\n \"text\": \"Melaka Raya\"\n },\n {\n \"value\": \"260\",\n \"text\": \"Prima Square, Sandakan\"\n },\n {\n \"value\": \"261\",\n \"text\": \"Jln Kulas, Kuching\"\n },\n {\n \"value\": \"264\",\n \"text\": \"Simpang Tiga, Kuching\"\n },\n {\n \"value\": \"266\",\n \"text\": \"Boulevard Centre, Miri\"\n },\n {\n \"value\": \"268\",\n \"text\": \"Lundu\"\n },\n {\n \"value\": \"269\",\n \"text\": \"Kanowit\"\n },\n {\n \"value\": \"271\",\n \"text\": \"Dalat\"\n },\n {\n \"value\": \"272\",\n \"text\": \"Kota Samarahan, Kuching\"\n },\n {\n \"value\": \"273\",\n \"text\": \"Sarikei\"\n },\n {\n \"value\": \"275\",\n \"text\": \"Tabuan Jaya, Kuching\"\n },\n {\n \"value\": \"276\",\n \"text\": \"Siburan\"\n },\n {\n \"value\": \"278\",\n \"text\": \"Matang Jaya, Kuching\"\n },\n {\n \"value\": \"280\",\n \"text\": \"Batu Kawah, Kuching\"\n },\n {\n \"value\": \"281\",\n \"text\": \"Lintas Station Complex, Kota Kinabalu\"\n },\n {\n \"value\": \"282\",\n \"text\": \"Limbang\"\n },\n {\n \"value\": \"286\",\n \"text\": \"Taipan Senawang\"\n },\n {\n \"value\": \"288\",\n \"text\": \"Kota Damansara\"\n },\n {\n \"value\": \"289\",\n \"text\": \"The Vertical, Bangsar South\"\n },\n {\n \"value\": \"290\",\n \"text\": \"Tmn Mount Austin, Johor Bahru\"\n },\n {\n \"value\": \"291\",\n \"text\": \"Menara Shell\"\n },\n {\n \"value\": \"293\",\n \"text\": \"Paradigm Mall, Kelana Jaya\"\n },\n {\n \"value\": \"294\",\n \"text\": \"Utropolis Mall, Glenmarie\"\n },\n {\n \"value\": \"295\",\n \"text\": \"Bandar Bukit Tinggi\"\n },\n {\n \"value\": \"296\",\n \"text\": \"Jitra\"\n },\n {\n \"value\": \"297\",\n \"text\": \"Air Putih, Kuantan\"\n },\n {\n \"value\": \"298\",\n \"text\": \"Sg. Merah, Sibu\"\n },\n {\n \"value\": \"299\",\n \"text\": \"Tmn Nusa Bestari, Johor Bahru\"\n },\n {\n \"value\": \"300\",\n \"text\": \"Keningau\"\n },\n {\n \"value\": \"301\",\n \"text\": \"1 Lagenda\"\n },\n {\n \"value\": \"302\",\n \"text\": \"Triang\"\n },\n {\n \"value\": \"303\",\n \"text\": \"Tmn Connaught\"\n },\n {\n \"value\": \"304\",\n \"text\": \"MetroTown, Kota Kinabalu\"\n },\n {\n \"value\": \"305\",\n \"text\": \"Kota Kemuning\"\n },\n {\n \"value\": \"306\",\n \"text\": \"Kota Tinggi\"\n },\n {\n \"value\": \"307\",\n \"text\": \"Setia Alam\"\n },\n {\n \"value\": \"308\",\n \"text\": \"Alam Avenue\"\n },\n {\n \"value\": \"309\",\n \"text\": \"Malim\"\n },\n {\n \"value\": \"310\",\n \"text\": \"Mukah\"\n },\n {\n \"value\": \"312\",\n \"text\": \"Bandar Mahkota Cheras\"\n },\n {\n \"value\": \"313\",\n \"text\": \"Seremban 2\"\n },\n {\n \"value\": \"314\",\n \"text\": \"Banting\"\n },\n {\n \"value\": \"315\",\n \"text\": \"IOI Resort City\"\n },\n {\n \"value\": \"316\",\n \"text\": \"Bandar Sri Petaling\"\n },\n {\n \"value\": \"317\",\n \"text\": \"Tanjung Tokong\"\n },\n {\n \"value\": \"319\",\n \"text\": \"Bandar Penawar\"\n },\n {\n \"value\": \"320\",\n \"text\": \"Kelana Jaya\"\n },\n {\n \"value\": \"321\",\n \"text\": \"RHB Bank Jalan Raja Laut, Kuala Lumpur\"\n },\n {\n \"value\": \"322\",\n \"text\": \"Auto City, Juru\"\n },\n {\n \"value\": \"323\",\n \"text\": \"Tmn Setia Tropika, Johor Bahru\"\n },\n {\n \"value\": \"389\",\n \"text\": \"Tmn Flora Utama, Batu Pahat\"\n },\n {\n \"value\": \"399\",\n \"text\": \"Caw. Utama\"\n },\n {\n \"value\": \"400\",\n \"text\": \"Caw. Jln Satok, Kuching\"\n },\n {\n \"value\": \"401\",\n \"text\": \"Caw. Kelana Jaya\"\n },\n {\n \"value\": \"402\",\n \"text\": \"Caw. Tmn Flora Utama, Batu Pahat\"\n },\n {\n \"value\": \"403\",\n \"text\": \"Caw. Kubang Kerian, Kota Bharu\"\n },\n {\n \"value\": \"404\",\n \"text\": \"Caw. Tmn Setia Tropika, Johor Bahru\"\n },\n {\n \"value\": \"405\",\n \"text\": \"Caw. Bandar Baru Bangi\"\n },\n {\n \"value\": \"407\",\n \"text\": \"Caw. Kuala Terengganu\"\n },\n {\n \"value\": \"408\",\n \"text\": \"Caw. Jln Raja Laut\"\n },\n {\n \"value\": \"409\",\n \"text\": \"Caw. Auto City\"\n },\n {\n \"value\": \"411\",\n \"text\": \"Caw. Lagenda Heights, Sg. Petani\"\n },\n {\n \"value\": \"412\",\n \"text\": \"Caw. Laman Seri, Shah Alam\"\n },\n {\n \"value\": \"457\",\n \"text\": \"RHB Bank Sales Centre AEON Taman Equine\"\n },\n {\n \"value\": \"473\",\n \"text\": \"RHB EASY - Kompleks Teruntum\"\n },\n {\n \"value\": \"479\",\n \"text\": \"RHB EASY - Giant Plentong\"\n },\n {\n \"value\": \"491\",\n \"text\": \"RHB EASY - Mydin Mall MITC Melaka\"\n },\n {\n \"value\": \"630\",\n \"text\": \"RHB EASY - Mydin Kubang Kerian\"\n },\n {\n \"value\": \"637\",\n \"text\": \"RHB EASY - Mydin Meru Raya\"\n },\n {\n \"value\": \"710\",\n \"text\": \"RHB EASY - E-Mart Commercial Centre\"\n },\n {\n \"value\": \"712\",\n \"text\": \"RHB EASY - Giant Hypermarket Bayan Baru\"\n },\n {\n \"value\": \"861\",\n \"text\": \"RHB EASY Warisan Square\"\n },\n {\n \"value\": \"931\",\n \"text\": \"CC EMBOSSING\"\n },\n {\n \"value\": \"RD08\",\n \"text\": \"PERAK REGION\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"bdmMoreThan2500kg\",\n \"displayName\": \"BDM More Than 2500kg\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"name\": \"chassisNo\",\n \"displayName\": \"Chassis Number\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"name\": \"engineNo\",\n \"displayName\": \"Engine Number\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"name\": \"marketValue\",\n \"displayName\": \"Market Value\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"12\"\n },\n {\n \"name\": \"modelOfVehicle\",\n \"displayName\": \"Model of Vehicle\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"type\": \"text\",\n \"name\": \"purchasePriceOTR\",\n \"title\": \"carPrice\",\n \"placeholder\": \"car Price (MYR)\",\n \"isRequired\": true,\n \"displayName\": \"Car Price (MYR)\",\n \"maxLength\": 23,\n \"min\": 2000,\n \"max\": 150000,\n \"inputType\": \"number\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a financing amount between 2,000 and 150,000.\",\n \"regex\": \"^(2000|[1-9][0-9]{3}|[1-9][0-9]{4}|150000)$\"\n },\n {\n \"type\": \"regex\",\n \"text\": \"Please enter an amount in increments of 1,000.\",\n \"regex\": \"^([1-9][0-9]*000|150000)$\"\n }\n ],\n \"category\": \"12\"\n },\n {\n \"name\": \"registrationDate\",\n \"displayName\": \"Registration Date\",\n \"type\": \"text\",\n \"inputType\": \"date\",\n \"category\": \"12\"\n },\n {\n \"name\": \"registrationNo\",\n \"displayName\": \"Registration Number\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"name\": \"vehicleCondition\",\n \"displayName\": \"Condition\",\n \"placeholder\": \"Vehicle Condition\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"N\",\n \"text\": \"New\"\n },\n {\n \"value\": \"U\",\n \"text\": \"Used\"\n },\n {\n \"value\": \"UN\",\n \"text\": \"UnRegistered Recon\"\n },\n {\n \"value\": \"UR\",\n \"text\": \"Used Recon\"\n },\n {\n \"value\": \"PR\",\n \"text\": \"Pre-registered\"\n }\n ],\n \"category\": \"12\"\n },\n {\n \"name\": \"yearMake\",\n \"displayName\": \"Year Make\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"startWithNewLine\": false,\n \"placeholder\": \"Year\",\n \"min\": 2014,\n \"max\": 2100,\n \"category\": \"12\"\n },\n {\n \"name\": \"makeOfVehicle\",\n \"displayName\": \"Make of Vehicle\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"name\": \"permanentaddressLine1\",\n \"displayName\": \"Permanent Address Line 1\",\n \"placeholder\": \"Permanent Address Line 1\",\n \"maxLength\": 40,\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"permanentaddressLine2\",\n \"displayName\": \"Permanent Address Line 2\",\n \"placeholder\": \"Permanent Address Line 2 (optional)\",\n \"isRequired\": false,\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"7\"\n },\n {\n \"name\": \"permanentaddressLine3\",\n \"displayName\": \"Permanent Address Line 3\",\n \"maxLength\": 40,\n \"placeholder\": \"Permanent Address Line 3 (optional)\",\n \"isRequired\": false,\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"permanentaddressType\",\n \"displayName\": \"Permanent Address Type\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"permanentcity\",\n \"displayName\": \"Permanent City\",\n \"placeholder\": \"City of the Permanent Address\",\n \"type\": \"text\",\n \"maxLength\": 20,\n \"startWithNewLine\": false,\n \"category\": \"7\"\n },\n {\n \"name\": \"permanentpostcode\",\n \"displayName\": \"Permanent Postcode\",\n \"placeholder\": \"Postcode of the Permanent Address\",\n \"type\": \"text\",\n \"maxLength\": 10,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialaddressLine1\",\n \"displayName\": \"Residential Address Line 1\",\n \"placeholder\": \"Residential Address Line 1\",\n \"visibleIf\": \"{residenceAddress} == false\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialaddressLine2\",\n \"displayName\": \"Residential Address Line 2\",\n \"placeholder\": \"Residential Address Line 2 (optional)\",\n \"isRequired\": false,\n \"visibleIf\": \"{residenceAddress} == false\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialaddressLine3\",\n \"displayName\": \"Residential Address Line 3\",\n \"placeholder\": \"Residential Address Line 3 (optional)\",\n \"isRequired\": false,\n \"startWithNewLine\": false,\n \"visibleIf\": \"{residenceAddress} == false\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialaddressType\",\n \"displayName\": \"Residential Address Type\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialcity\",\n \"displayName\": \"Residential City\",\n \"placeholder\": \"City of the Residential Address\",\n \"visibleIf\": \"{residenceAddress} == false\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 20,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialpostcode\",\n \"displayName\": \"Residential Postcode\",\n \"placeholder\": \"Postcode of the Residential Address\",\n \"visibleIf\": \"{residenceAddress} == false\",\n \"type\": \"text\",\n \"maxLength\": 10,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialstate\",\n \"displayName\": \"Residential State\",\n \"placeholder\": \"Select State Of The Residential Address\",\n \"startWithNewLine\": false,\n \"visibleIf\": \"{residenceAddress} == false\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"A\",\n \"text\": \"PERAK\"\n },\n {\n \"value\": \"B\",\n \"text\": \"SELANGOR\"\n },\n {\n \"value\": \"C\",\n \"text\": \"PAHANG\"\n },\n {\n \"value\": \"D\",\n \"text\": \"KELANTAN\"\n },\n {\n \"value\": \"J\",\n \"text\": \"JOHOR\"\n },\n {\n \"value\": \"K\",\n \"text\": \"KEDAH\"\n },\n {\n \"value\": \"L\",\n \"text\": \"WP LABUAN\"\n },\n {\n \"value\": \"M\",\n \"text\": \"MELAKA\"\n },\n {\n \"value\": \"N\",\n \"text\": \"NEGERI SEMBILAN\"\n },\n {\n \"value\": \"P\",\n \"text\": \"PULAU PINANG\"\n },\n {\n \"value\": \"Q\",\n \"text\": \"SARAWAK\"\n },\n {\n \"value\": \"R\",\n \"text\": \"PERLIS\"\n },\n {\n \"value\": \"S\",\n \"text\": \"SABAH\"\n },\n {\n \"value\": \"T\",\n \"text\": \"TERENGGANU\"\n },\n {\n \"value\": \"U\",\n \"text\": \"WP PUTRAJAYA\"\n },\n {\n \"value\": \"W\",\n \"text\": \"WP KUALA LUMPUR\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"officeaddressLine1\",\n \"displayName\": \"Employer Address Line 1\",\n \"placeholder\": \"Employer Address Line 1\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"category\": \"5\"\n },\n {\n \"name\": \"officeaddressLine2\",\n \"displayName\": \"Employer Address Line 2\",\n \"placeholder\": \"Employer Address Line 2 (optional)\",\n \"isRequired\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"5\"\n },\n {\n \"name\": \"officeaddressLine3\",\n \"displayName\": \"Employer Address Line 3\",\n \"placeholder\": \"Employer Address Line 3 (optional)\",\n \"startWithNewLine\": false,\n \"isRequired\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"5\"\n },\n {\n \"name\": \"officeaddressType\",\n \"displayName\": \"Office Address Type\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"officecity\",\n \"displayName\": \"Employer City\",\n \"placeholder\": \"Employer City\",\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 20,\n \"category\": \"5\"\n },\n {\n \"name\": \"officepostcode\",\n \"displayName\": \"Employer Postcode\",\n \"placeholder\": \"Employer Postcode\",\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"text\",\n \"maxLength\": 10,\n \"inputType\": \"number\",\n \"category\": \"5\"\n },\n {\n \"name\": \"computationMode\",\n \"displayName\": \"Computation Mode\",\n \"type\": \"text\",\n \"category\": \"10\"\n },\n {\n \"name\": \"countryOfPermanentResident\",\n \"displayName\": \"Country of Permanent Resident\",\n \"type\": \"text\",\n \"category\": \"2\"\n },\n {\n \"name\": \"foreignPR\",\n \"displayName\": \"Foreign PR\",\n \"type\": \"text\",\n \"category\": \"2\"\n },\n {\n \"name\": \"internationalExtensionPhoneNo\",\n \"displayName\": \"International Extension Phone No\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"8\"\n },\n {\n \"name\": \"internationalPhoneNo\",\n \"displayName\": \"International Phone No\",\n \"type\": \"text\",\n \"inputType\": \"tel\",\n \"category\": \"8\"\n },\n {\n \"name\": \"internationalPhoneNoAreaCode\",\n \"displayName\": \"International Phone No Area Code\",\n \"type\": \"text\",\n \"inputType\": \"tel\",\n \"category\": \"8\"\n },\n {\n \"name\": \"pRIDNo\",\n \"displayName\": \"PR ID No\",\n \"type\": \"text\",\n \"category\": \"2\"\n },\n {\n \"name\": \"dealerName\",\n \"displayName\": \"Dealer Name\",\n \"type\": \"text\",\n \"category\": \"3\"\n },\n {\n \"name\": \"cashDownpayment\",\n \"displayName\": \"Cash Downpayment\",\n \"placeholder\": \"Cash Downpayment\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 20,\n \"category\": \"11\"\n },\n {\n \"name\": \"downpayment\",\n \"displayName\": \"Down Payment (%)\",\n \"placeholder\": \"Down Payment (%)\",\n \"type\": \"text\",\n \"category\": \"11\"\n },\n {\n \"name\": \"bankName\",\n \"displayName\": \"Bank Name\",\n \"placeholder\": \"Bank Name\",\n \"visible\": false,\n \"type\": \"text\",\n \"startWithNewLine\": false,\n \"category\": \"11\"\n },\n {\n \"name\": \"bankRates\",\n \"displayName\": \"Bank Rate\",\n \"placeholder\": \"Bank Rate\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"startWithNewLine\": false,\n \"category\": \"11\"\n },\n {\n \"name\": \"monthlyRepayment\",\n \"displayName\": \"Monthly Repayment\",\n \"placeholder\": \"Monthly Repayment\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"11\"\n },\n {\n \"name\": \"facilityTenureYears\",\n \"displayName\": \"Repayment Term (Years)\",\n \"placeholder\": \"Payment Term\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid financing tenure from 1 to 7 years.\",\n \"regex\": \"^[1-7]$\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"totalFinancing\",\n \"displayName\": \"Financing Amount (RM)\",\n \"placeholder\": \"How much do you want to borrow?\",\n \"type\": \"text\",\n \"maxLength\": 15,\n \"min\": 2000,\n \"max\": 150000,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a financing amount between 2,000 and 150,000.\",\n \"regex\": \"^(2000|[1-9][0-9]{3}|[1-9][0-9]{4}|150000)$\"\n },\n {\n \"type\": \"regex\",\n \"text\": \"Please enter an amount in increments of 1,000.\",\n \"regex\": \"^([1-9][0-9]*000|150000)$\"\n }\n ],\n \"inputType\": \"number\",\n \"category\": \"11\"\n },\n {\n \"name\": \"myKadOrPassport\",\n \"displayName\": \"MyKad or Passport\",\n \"type\": \"text\",\n \"category\": \"2\"\n },\n {\n \"name\": \"incomeEPF_iakaun\",\n \"displayName\": \"Income EPF i-Akaun\",\n \"type\": \"text\",\n \"category\": \"11\"\n },\n {\n \"name\": \"phoneNumber\",\n \"displayName\": \"Phone Number\",\n \"type\": \"text\",\n \"inputType\": \"tel\",\n \"category\": \"1\"\n },\n {\n \"name\": \"incorporatedDate\",\n \"displayName\": \"Incorporated Date\",\n \"type\": \"text\",\n \"inputType\": \"date\",\n \"category\": \"3\"\n },\n {\n \"name\": \"shareCapital\",\n \"displayName\": \"Share Capital\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"tangibleAssets\",\n \"displayName\": \"Tangible Assets\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"totalCurrentLiabilities\",\n \"displayName\": \"Total Current Liabilities\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"totalCurrentAssets\",\n \"displayName\": \"Total Current Assets\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"endOfYearCash\",\n \"displayName\": \"Cash and Cash Equivalent at end of the Financial Year or Period\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"shortTermLiabilities\",\n \"displayName\": \"Short Term Liabilities\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"ebitda\",\n \"displayName\": \"Earning Before Interest, Tax, Depreciation and Amortization (EBITDA)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"totalAssets\",\n \"displayName\": \"Total Assets\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"netOperatingCashFlow\",\n \"displayName\": \"Net Operating Cash Flow\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"netProfitT1\",\n \"displayName\": \"Net Profit/ Loss and Total Comprehensive Income (year T-1)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"totalEquityT1\",\n \"displayName\": \"Total Equity/Owner equity/Total Net (year T-1)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"netProfitT2\",\n \"displayName\": \"Net Profit/ Loss and Total Comprehensive Income (year T-2)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"totalEquityT2\",\n \"displayName\": \"Total Equity/Owner equity/Total Net (year T-2)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"facilityInterestRate\",\n \"displayName\": \"Interest Rate\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"eppProduct\",\n \"displayName\": \"EPP Product Name\",\n \"type\": \"text\",\n \"category\": \"4\"\n },\n {\n \"name\": \"eppPrice\",\n \"displayName\": \"EPP Price\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"eppNoOfPax\",\n \"displayName\": \"EPP No. of Pax\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"housingLoanMonthlyInstallment\",\n \"displayName\": \"Housing Loan Monthly Installment\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"hirePurchaseMonthlyInstallment\",\n \"displayName\": \"Hire Purchase Monthly Installment\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"personalLoanMonthlyInstallment\",\n \"displayName\": \"Personal Loan Monthly Installment\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"creditCardMonthlyInstallment\",\n \"displayName\": \"Credit Card Monthly Installment\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"otherFinancingMonthlyInstallment\",\n \"displayName\": \"Other Financing Monthly Installment\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"bank_statement_t1\",\n \"displayName\": \"Bank Statement (Month T-1)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT1\",\n \"statementDateT1\",\n \"bankNameT1\",\n \"accountNumberT1\",\n \"totalCreditsT1\",\n \"totalDebitsT1\",\n \"openingBalanceT1\",\n \"bankBalanceT1\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 1,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"bank_statement_t2\",\n \"displayName\": \"Bank Statement (Month T-2)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT2\",\n \"statementDateT2\",\n \"bankNameT2\",\n \"accountNumberT2\",\n \"totalCreditsT2\",\n \"totalDebitsT2\",\n \"openingBalanceT2\",\n \"bankBalanceT2\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 2,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"bank_statement_t3\",\n \"displayName\": \"Bank Statement (Month T-3)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT3\",\n \"statementDateT3\",\n \"bankNameT3\",\n \"accountNumberT3\",\n \"totalCreditsT3\",\n \"totalDebitsT3\",\n \"openingBalanceT3\",\n \"bankBalanceT3\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 3,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"bank_statement_t4\",\n \"displayName\": \"Bank Statement (Month T-4)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT4\",\n \"statementDateT4\",\n \"bankNameT4\",\n \"accountNumberT4\",\n \"totalCreditsT4\",\n \"totalDebitsT4\",\n \"openingBalanceT4\",\n \"bankBalanceT4\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 4,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"bank_statement_t5\",\n \"displayName\": \"Bank Statement (Month T-5)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT5\",\n \"statementDateT5\",\n \"bankNameT5\",\n \"accountNumberT5\",\n \"totalCreditsT5\",\n \"totalDebitsT5\",\n \"openingBalanceT5\",\n \"bankBalanceT5\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 5,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"bank_statement_t6\",\n \"displayName\": \"Bank Statement (Month T-6)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT6\",\n \"statementDateT6\",\n \"bankNameT6\",\n \"accountNumberT6\",\n \"totalCreditsT6\",\n \"totalDebitsT6\",\n \"openingBalanceT6\",\n \"bankBalanceT6\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 6,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"financials\",\n \"displayName\": \"Audited Financial Statement\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"shareCapital\",\n \"totalEquityT1\",\n \"totalEquityT2\",\n \"totalCurrentLiabilities\",\n \"shortTermLiabilities\",\n \"totalAssets\",\n \"totalCurrentAssets\",\n \"tangibleAssets\",\n \"netProfitT1\",\n \"netProfitT2\",\n \"endOfYearCash\",\n \"netOperatingCashFlow\",\n \"ebitda\"\n ],\n \"category\": \"13\",\n \"document_type\": \"financialStatements\",\n \"document_group\": \"financials\",\n \"document_group_label\": \"Audited Financial Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 1,\n \"time_period_unit\": \"year\"\n },\n {\n \"name\": \"financials_fincap_t1\",\n \"displayName\": \"Audited Financial Statement (T-1) (FinCap)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"nonCurrentAssetsSubsidiaryCompaniesT1\",\n \"nonCurrentAssetsAssociatedCompaniesT1\",\n \"nonCurrentAssetsDevelopmentPropertiesOrExpenditureT1\",\n \"nonCurrentAssetInvestmentPropertiesT1\",\n \"nonCurrentAssetsInvestmentsT1\",\n \"nonCurrentAssetInvestmentSecuritiesT1\",\n \"nonCurrentAssetDeferredAssetsT1\",\n \"nonCurrentAssetDepositsT1\",\n \"nonCurrentAssetOwnGoodwillT1\",\n \"nonCurrentAssetGoodwillOnConsolidationT1\",\n \"nonCurrentAssetSinkingFundT1\",\n \"nonCurrentAssetPropertyPlantEquipmentT1\",\n \"nonCurrentAssetInventoriesT1\",\n \"nonCurrentAssetRightOfUseAssetsT1\",\n \"nonCurrentAssetIntangibleAssetsT1\",\n \"nonCurrentAssetPrepaidLeasePaymentsT1\",\n \"nonCurrentAssetFinancialAssetAtFairValueT1\",\n \"nonCurrentAssetLandUseRightT1\",\n \"nonCurrentAssetTradeReceivablesT1\",\n \"nonCurrentAssetOtherReceivablesT1\",\n \"nonCurrentAssetTradeAndOtherReceivablesT1\",\n \"nonCurrentAssetOtherReceivablesDepositsAndPrepaymentsT1\",\n \"totalNonCurrentAssetsT1\",\n \"currentAssetDevelopmentPropertiesOrExpenditureT1\",\n \"currentAssetShortTermInvestmentsT1\",\n \"currentAssetTradeDebtorsT1\",\n \"currentAssetShortTermDepositsT1\",\n \"currentAssetAmountDueFromHoldingCompanyT1\",\n \"currentAssetAmountDueFromSubsidiaryCompaniesT1\",\n \"currentAssetAmountDueFromAssociatedCompaniesT1\",\n \"currentAssetAmountDueFromDirectorT1\",\n \"currentAssetAmountDueFromCustomerT1\",\n \"currentAssetAmountOwingByShareholdersT1\",\n \"currentAssetInventoriesT1\",\n \"currentAssetFinancialAssetAtFairValueT1\",\n \"currentAssetLandUseRightT1\",\n \"currentAssetTaxRecoverableT1\",\n \"currentAssetContractAssetsT1\",\n \"currentAssetCurrentTaxAssetsT1\",\n \"currentAssetPrepaymentsT1\",\n \"currentAssetDerivativeT1\",\n \"currentAssetCashAndBankBalancesT1\",\n \"currentAssetOtherReceivablesT1\",\n \"currentAssetRestrictedCashT1\",\n \"currentAssetCashAndCashEquivalentsT1\",\n \"currentAssetDepositsCashAndBankBalancesT1\",\n \"currentAssetCashAtBanksT1\",\n \"currentAssetCashOnHandT1\",\n \"currentAssetDepositsAndPrepaymentsT1\",\n \"currentAssetTradeAndOtherReceivablesT1\",\n \"currentAssetOtherReceivablesDepositsAndPrepaymentsT1\",\n \"currentAssetOtherReceivablesAndDepositsT1\",\n \"currentAssetOtherReceivablesAndPrepaymentsT1\",\n \"currentAssetCashT1\",\n \"totalCurrentAssetsT1\",\n \"totalAssetsT1\",\n \"currentLiabilitiesTradeCreditorsT1\",\n \"currentLiabilitiesHirePurchasePayablesT1\",\n \"currentLiabilitiesBankOverdraftT1\",\n \"currentLiabilitiesBankAcceptanceT1\",\n \"currentLiabilitiesBorrowingsOrTermLoansT1\",\n \"currentLiabilitiesBankborrowingsT1\",\n \"currentLiabilitiesAmountsOwingToHoldingCompanyT1\",\n \"currentLiabilitiesAmountsOwingToSubsidiaryCompaniesT1\",\n \"currentLiabilitiesAmountOwingToAssociatedCompaniesT1\",\n \"currentLiabilitiesAmountsOwingToDirectorT1\",\n \"currentLiabilitiesProvisionForTaxationT1\",\n \"currentLiabilitiesLeasePayablesT1\",\n \"currentLiabilitiesFinanceLeasePayablesT1\",\n \"currentLiabilitiesOtherPayablesT1\",\n \"currentLiabilitiesDividendPayablesT1\",\n \"currentLiabilitiesTradeAndOtherPayablesT1\",\n \"currentLiabilitiesDepositsFromCustomersT1\",\n \"currentLiabilitiesOtherPayablesAccrualsAndDepositsT1\",\n \"currentLiabilitiesOtherPayablesAndAccrualsT1\",\n \"currentLiabilitiesContractLiabilitiesT1\",\n \"currentLiabilitiesDerivativeT1\",\n \"totalCurrentLiabilitiesT1\",\n \"shortTermLiabilitiesT1\",\n \"nonCurrentLiabilitiesBorrowingsOrTermLoansT1\",\n \"nonCurrentLiabilitiesBankBorrowingsT1\",\n \"nonCurrentLiabilitiesLeaseObligationsT1\",\n \"nonCurrentLiabilitiesFinanceLeaseObligationsT1\",\n \"nonCurrentLiabilitiesDeferredTaxationT1\",\n \"nonCurrentLiabilitiesRetirementBenefitsT1\",\n \"nonCurrentLiabilitiesHirePurchasePayablesT1\",\n \"nonCurrentLiabilitiesDepositsFromCustomersT1\",\n \"nonCurrentLiabilitiesContractLiabilitiesT1\",\n \"totalNonCurrentLiabilitiesT1\",\n \"totalLiabilitiesT1\",\n \"tangibleAssetsT1\",\n \"shareCapitalT1\",\n \"preferenceShareCapitalT1\",\n \"sharePremiumT1\",\n \"reservesT1\",\n \"capitalReservesT1\",\n \"revaluationReservesT1\",\n \"exchangeEqualisationOrFluctuationReservesT1\",\n \"retainedEarningsT1\",\n \"totalEquityT1\",\n \"revenueT1\",\n \"costOfGoodsSoldT1\",\n \"grossProfitT1\",\n \"otherIncomeT1\",\n \"profitFromOperationsT1\",\n \"financeCostT1\",\n \"ebitdaT1\",\n \"taxesT1\",\n \"zakatT1\",\n \"profitAfterTaxT1\",\n \"netProfitT1\",\n \"netOperatingCashFlowT1\",\n \"depreciationT1\",\n \"depreciationOfPropertyPlantEquipmentT1\",\n \"depreciationRightOfUseAssetsT1\",\n \"depreciationOfInvestmentPropertiesT1\",\n \"depreciationOfInvestmentSecuritiesT1\",\n \"endOfYearCashT1\",\n \"nonCurrentAssetsSubsidiaryCompaniesT2\",\n \"nonCurrentAssetsAssociatedCompaniesT2\",\n \"nonCurrentAssetsDevelopmentPropertiesOrExpenditureT2\",\n \"nonCurrentAssetInvestmentPropertiesT2\",\n \"nonCurrentAssetsInvestmentsT2\",\n \"nonCurrentAssetInvestmentSecuritiesT2\",\n \"nonCurrentAssetDeferredAssetsT2\",\n \"nonCurrentAssetDepositsT2\",\n \"nonCurrentAssetOwnGoodwillT2\",\n \"nonCurrentAssetGoodwillOnConsolidationT2\",\n \"nonCurrentAssetSinkingFundT2\",\n \"nonCurrentAssetPropertyPlantEquipmentT2\",\n \"nonCurrentAssetInventoriesT2\",\n \"nonCurrentAssetRightOfUseAssetsT2\",\n \"nonCurrentAssetIntangibleAssetsT2\",\n \"nonCurrentAssetPrepaidLeasePaymentsT2\",\n \"nonCurrentAssetFinancialAssetAtFairValueT2\",\n \"nonCurrentAssetLandUseRightT2\",\n \"nonCurrentAssetTradeReceivablesT2\",\n \"nonCurrentAssetOtherReceivablesT2\",\n \"nonCurrentAssetTradeAndOtherReceivablesT2\",\n \"nonCurrentAssetOtherReceivablesDepositsAndPrepaymentsT2\",\n \"totalNonCurrentAssetsT2\",\n \"currentAssetDevelopmentPropertiesOrExpenditureT2\",\n \"currentAssetShortTermInvestmentsT2\",\n \"currentAssetTradeDebtorsT2\",\n \"currentAssetShortTermDepositsT2\",\n \"currentAssetAmountDueFromHoldingCompanyT2\",\n \"currentAssetAmountDueFromSubsidiaryCompaniesT2\",\n \"currentAssetAmountDueFromAssociatedCompaniesT2\",\n \"currentAssetAmountDueFromDirectorT2\",\n \"currentAssetAmountDueFromCustomerT2\",\n \"currentAssetAmountOwingByShareholdersT2\",\n \"currentAssetInventoriesT2\",\n \"currentAssetFinancialAssetAtFairValueT2\",\n \"currentAssetLandUseRightT2\",\n \"currentAssetTaxRecoverableT2\",\n \"currentAssetContractAssetsT2\",\n \"currentAssetCurrentTaxAssetsT2\",\n \"currentAssetPrepaymentsT2\",\n \"currentAssetDerivativeT2\",\n \"currentAssetCashAndBankBalancesT2\",\n \"currentAssetOtherReceivablesT2\",\n \"currentAssetRestrictedCashT2\",\n \"currentAssetCashAndCashEquivalentsT2\",\n \"currentAssetDepositsCashAndBankBalancesT2\",\n \"currentAssetCashAtBanksT2\",\n \"currentAssetCashOnHandT2\",\n \"currentAssetDepositsAndPrepaymentsT2\",\n \"currentAssetTradeAndOtherReceivablesT2\",\n \"currentAssetOtherReceivablesDepositsAndPrepaymentsT2\",\n \"currentAssetOtherReceivablesAndDepositsT2\",\n \"currentAssetOtherReceivablesAndPrepaymentsT2\",\n \"currentAssetCashT2\",\n \"totalCurrentAssetsT2\",\n \"totalAssetsT2\",\n \"currentLiabilitiesTradeCreditorsT2\",\n \"currentLiabilitiesHirePurchasePayablesT2\",\n \"currentLiabilitiesBankOverdraftT2\",\n \"currentLiabilitiesBankAcceptanceT2\",\n \"currentLiabilitiesBorrowingsOrTermLoansT2\",\n \"currentLiabilitiesBankborrowingsT2\",\n \"currentLiabilitiesAmountsOwingToHoldingCompanyT2\",\n \"currentLiabilitiesAmountsOwingToSubsidiaryCompaniesT2\",\n \"currentLiabilitiesAmountOwingToAssociatedCompaniesT2\",\n \"currentLiabilitiesAmountsOwingToDirectorT2\",\n \"currentLiabilitiesProvisionForTaxationT2\",\n \"currentLiabilitiesLeasePayablesT2\",\n \"currentLiabilitiesFinanceLeasePayablesT2\",\n \"currentLiabilitiesOtherPayablesT2\",\n \"currentLiabilitiesDividendPayablesT2\",\n \"currentLiabilitiesTradeAndOtherPayablesT2\",\n \"currentLiabilitiesDepositsFromCustomersT2\",\n \"currentLiabilitiesOtherPayablesAccrualsAndDepositsT2\",\n \"currentLiabilitiesOtherPayablesAndAccrualsT2\",\n \"currentLiabilitiesContractLiabilitiesT2\",\n \"currentLiabilitiesDerivativeT2\",\n \"totalCurrentLiabilitiesT2\",\n \"shortTermLiabilitiesT2\",\n \"nonCurrentLiabilitiesBorrowingsOrTermLoansT2\",\n \"nonCurrentLiabilitiesBankBorrowingsT2\",\n \"nonCurrentLiabilitiesLeaseObligationsT2\",\n \"nonCurrentLiabilitiesFinanceLeaseObligationsT2\",\n \"nonCurrentLiabilitiesDeferredTaxationT2\",\n \"nonCurrentLiabilitiesRetirementBenefitsT2\",\n \"nonCurrentLiabilitiesHirePurchasePayablesT2\",\n \"nonCurrentLiabilitiesDepositsFromCustomersT2\",\n \"nonCurrentLiabilitiesContractLiabilitiesT2\",\n \"totalNonCurrentLiabilitiesT2\",\n \"totalLiabilitiesT2\",\n \"tangibleAssetsT2\",\n \"shareCapitalT2\",\n \"preferenceShareCapitalT2\",\n \"sharePremiumT2\",\n \"reservesT2\",\n \"capitalReservesT2\",\n \"revaluationReservesT2\",\n \"exchangeEqualisationOrFluctuationReservesT2\",\n \"retainedEarningsT2\",\n \"totalEquityT2\",\n \"revenueT2\",\n \"costOfGoodsSoldT2\",\n \"grossProfitT2\",\n \"otherIncomeT2\",\n \"profitFromOperationsT2\",\n \"financeCostT2\",\n \"ebitdaT2\",\n \"taxesT2\",\n \"zakatT2\",\n \"profitAfterTaxT2\",\n \"netProfitT2\",\n \"netOperatingCashFlowT2\",\n \"depreciationT2\",\n \"depreciationOfPropertyPlantEquipmentT2\",\n \"depreciationRightOfUseAssetsT2\",\n \"depreciationOfInvestmentPropertiesT2\",\n \"depreciationOfInvestmentSecuritiesT2\",\n \"endOfYearCashT2\"\n ],\n \"category\": \"13\",\n \"document_type\": \"financialStatements\",\n \"document_group\": \"financials\",\n \"document_group_label\": \"Audited Financial Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 1,\n \"time_period_unit\": \"year\"\n },\n {\n \"name\": \"financials_fincap_t2\",\n \"displayName\": \"Audited Financial Statement (T-2) (FinCap)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"nonCurrentAssetsSubsidiaryCompaniesT3\",\n \"nonCurrentAssetsAssociatedCompaniesT3\",\n \"nonCurrentAssetsDevelopmentPropertiesOrExpenditureT3\",\n \"nonCurrentAssetInvestmentPropertiesT3\",\n \"nonCurrentAssetsInvestmentsT3\",\n \"nonCurrentAssetInvestmentSecuritiesT3\",\n \"nonCurrentAssetDeferredAssetsT3\",\n \"nonCurrentAssetDepositsT3\",\n \"nonCurrentAssetOwnGoodwillT3\",\n \"nonCurrentAssetGoodwillOnConsolidationT3\",\n \"nonCurrentAssetSinkingFundT3\",\n \"nonCurrentAssetPropertyPlantEquipmentT3\",\n \"nonCurrentAssetInventoriesT3\",\n \"nonCurrentAssetRightOfUseAssetsT3\",\n \"nonCurrentAssetIntangibleAssetsT3\",\n \"nonCurrentAssetPrepaidLeasePaymentsT3\",\n \"nonCurrentAssetFinancialAssetAtFairValueT3\",\n \"nonCurrentAssetLandUseRightT3\",\n \"nonCurrentAssetTradeReceivablesT3\",\n \"nonCurrentAssetOtherReceivablesT3\",\n \"nonCurrentAssetTradeAndOtherReceivablesT3\",\n \"nonCurrentAssetOtherReceivablesDepositsAndPrepaymentsT3\",\n \"totalNonCurrentAssetsT3\",\n \"currentAssetDevelopmentPropertiesOrExpenditureT3\",\n \"currentAssetShortTermInvestmentsT3\",\n \"currentAssetTradeDebtorsT3\",\n \"currentAssetShortTermDepositsT3\",\n \"currentAssetAmountDueFromHoldingCompanyT3\",\n \"currentAssetAmountDueFromSubsidiaryCompaniesT3\",\n \"currentAssetAmountDueFromAssociatedCompaniesT3\",\n \"currentAssetAmountDueFromDirectorT3\",\n \"currentAssetAmountDueFromCustomerT3\",\n \"currentAssetAmountOwingByShareholdersT3\",\n \"currentAssetInventoriesT3\",\n \"currentAssetFinancialAssetAtFairValueT3\",\n \"currentAssetLandUseRightT3\",\n \"currentAssetTaxRecoverableT3\",\n \"currentAssetContractAssetsT3\",\n \"currentAssetCurrentTaxAssetsT3\",\n \"currentAssetPrepaymentsT3\",\n \"currentAssetDerivativeT3\",\n \"currentAssetCashAndBankBalancesT3\",\n \"currentAssetOtherReceivablesT3\",\n \"currentAssetRestrictedCashT3\",\n \"currentAssetCashAndCashEquivalentsT3\",\n \"currentAssetDepositsCashAndBankBalancesT3\",\n \"currentAssetCashAtBanksT3\",\n \"currentAssetCashOnHandT3\",\n \"currentAssetDepositsAndPrepaymentsT3\",\n \"currentAssetTradeAndOtherReceivablesT3\",\n \"currentAssetOtherReceivablesDepositsAndPrepaymentsT3\",\n \"currentAssetOtherReceivablesAndDepositsT3\",\n \"currentAssetOtherReceivablesAndPrepaymentsT3\",\n \"currentAssetCashT3\",\n \"totalCurrentAssetsT3\",\n \"totalAssetsT3\",\n \"currentLiabilitiesTradeCreditorsT3\",\n \"currentLiabilitiesHirePurchasePayablesT3\",\n \"currentLiabilitiesBankOverdraftT3\",\n \"currentLiabilitiesBankAcceptanceT3\",\n \"currentLiabilitiesBorrowingsOrTermLoansT3\",\n \"currentLiabilitiesBankborrowingsT3\",\n \"currentLiabilitiesAmountsOwingToHoldingCompanyT3\",\n \"currentLiabilitiesAmountsOwingToSubsidiaryCompaniesT3\",\n \"currentLiabilitiesAmountOwingToAssociatedCompaniesT3\",\n \"currentLiabilitiesAmountsOwingToDirectorT3\",\n \"currentLiabilitiesProvisionForTaxationT3\",\n \"currentLiabilitiesLeasePayablesT3\",\n \"currentLiabilitiesFinanceLeasePayablesT3\",\n \"currentLiabilitiesOtherPayablesT3\",\n \"currentLiabilitiesDividendPayablesT3\",\n \"currentLiabilitiesTradeAndOtherPayablesT3\",\n \"currentLiabilitiesDepositsFromCustomersT3\",\n \"currentLiabilitiesOtherPayablesAccrualsAndDepositsT3\",\n \"currentLiabilitiesOtherPayablesAndAccrualsT3\",\n \"currentLiabilitiesContractLiabilitiesT3\",\n \"currentLiabilitiesDerivativeT3\",\n \"totalCurrentLiabilitiesT3\",\n \"shortTermLiabilitiesT3\",\n \"nonCurrentLiabilitiesBorrowingsOrTermLoansT3\",\n \"nonCurrentLiabilitiesBankBorrowingsT3\",\n \"nonCurrentLiabilitiesLeaseObligationsT3\",\n \"nonCurrentLiabilitiesFinanceLeaseObligationsT3\",\n \"nonCurrentLiabilitiesDeferredTaxationT3\",\n \"nonCurrentLiabilitiesRetirementBenefitsT3\",\n \"nonCurrentLiabilitiesHirePurchasePayablesT3\",\n \"nonCurrentLiabilitiesDepositsFromCustomersT3\",\n \"nonCurrentLiabilitiesContractLiabilitiesT3\",\n \"totalNonCurrentLiabilitiesT3\",\n \"totalLiabilitiesT3\",\n \"tangibleAssetsT3\",\n \"shareCapitalT3\",\n \"preferenceShareCapitalT3\",\n \"sharePremiumT3\",\n \"reservesT3\",\n \"capitalReservesT3\",\n \"revaluationReservesT3\",\n \"exchangeEqualisationOrFluctuationReservesT3\",\n \"retainedEarningsT3\",\n \"totalEquityT3\",\n \"revenueT3\",\n \"costOfGoodsSoldT3\",\n \"grossProfitT3\",\n \"otherIncomeT3\",\n \"profitFromOperationsT3\",\n \"financeCostT3\",\n \"ebitdaT3\",\n \"taxesT3\",\n \"zakatT3\",\n \"profitAfterTaxT3\",\n \"netProfitT3\",\n \"netOperatingCashFlowT3\",\n \"depreciationT3\",\n \"depreciationOfPropertyPlantEquipmentT3\",\n \"depreciationRightOfUseAssetsT3\",\n \"depreciationOfInvestmentPropertiesT3\",\n \"depreciationOfInvestmentSecuritiesT3\",\n \"endOfYearCashT3\"\n ],\n \"category\": \"13\",\n \"document_type\": \"financialStatements\",\n \"document_group\": \"financials\",\n \"document_group_label\": \"Audited Financial Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 2,\n \"time_period_unit\": \"year\"\n },\n {\n \"name\": \"form9\",\n \"displayName\": \"Form 9 / Section 17 / Form D\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"incorporatedDate\",\n \"companyName\",\n \"companyRegNo\"\n ],\n \"category\": \"13\",\n \"document_type\": \"form9\",\n \"document_group\": \"form9\",\n \"document_group_label\": \"Form 9 / Section 17 / Form D\",\n \"wire_format\": \"url_string\"\n },\n {\n \"name\": \"ssm\",\n \"displayName\": \"SSM Company Profile\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"ssmCompanyName\",\n \"ssmCompanyRegNo\",\n \"incorporatedDate\",\n \"businessCommencementDate\",\n \"businessNature\",\n \"ssmCompanyEntityType\",\n \"ssmPaidUpCapital\",\n \"companyStatus\",\n \"shareholders\",\n \"directors\",\n \"previousDirectors\",\n \"totalShareIssued\",\n \"companyLastOldName\",\n \"companyNameDateOfChange\",\n \"businessOrigin\",\n \"registeredAddress\"\n ],\n \"category\": \"13\",\n \"document_type\": \"ssm\",\n \"document_group\": \"ssm_documents\",\n \"document_group_label\": \"SSM Company Information\",\n \"wire_format\": \"url_string\"\n },\n {\n \"name\": \"ic\",\n \"displayName\": \"Identification Card (Front)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"icNumber\",\n \"icName\",\n \"icAddress\",\n \"icGender\",\n \"icReligion\",\n \"icDateOfBirth\",\n \"icPlaceOfBirth\",\n \"icNationality\",\n \"icRace\"\n ],\n \"category\": \"13\",\n \"document_type\": \"ic\",\n \"document_group\": \"ic_documents\",\n \"document_group_label\": \"Identification Card\",\n \"wire_format\": \"url_string\"\n },\n {\n \"name\": \"epf_statement_t1\",\n \"displayName\": \"Employees' Provident Fund (T-1)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"epfAccountHolderNameT1\",\n \"epfAccountHolderAddressT1\",\n \"epfStatementYearT1\",\n \"epfKwspMemberNumberT1\",\n \"epfIcNumberT1\",\n \"epfEmployerNumberT1\",\n \"epfDateOfStatementT1\",\n \"epfTotalContributionT1\",\n \"epfTotalCurrentContributionT1\"\n ],\n \"category\": \"13\",\n \"document_type\": \"epfStatements\",\n \"document_group\": \"epf_statements\",\n \"document_group_label\": \"EPF Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 1,\n \"time_period_unit\": \"year\"\n },\n {\n \"name\": \"epf_statement_t2\",\n \"displayName\": \"Employees' Provident Fund (T-2)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"epfAccountHolderNameT2\",\n \"epfAccountHolderAddressT2\",\n \"epfStatementYearT2\",\n \"epfKwspMemberNumberT2\",\n \"epfIcNumberT2\",\n \"epfEmployerNumberT2\",\n \"epfDateOfStatementT2\",\n \"epfTotalContributionT2\",\n \"epfTotalCurrentContributionT2\"\n ],\n \"category\": \"13\",\n \"document_type\": \"epfStatements\",\n \"document_group\": \"epf_statements\",\n \"document_group_label\": \"EPF Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 2,\n \"time_period_unit\": \"year\"\n },\n {\n \"name\": \"payslip_statement_t1\",\n \"displayName\": \"Payslip Statement (Month T-1)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT1\",\n \"payslipEmployeeNameT1\",\n \"payslipPayPeriodT1\",\n \"payslipPayDateT1\",\n \"payslipGrossPayT1\",\n \"payslipDeductionT1\",\n \"payslipEmployeeEpfContributionT1\",\n \"payslipEmployeeSocsoContributionT1\",\n \"payslipNetPayT1\",\n \"payslipBasicPayT1\",\n \"payslipFixedAllowancesT1\",\n \"payslipVariableIncomeT1\",\n \"payslipEmployeeEisContributionT1\",\n \"payslipEmployeeTaxT1\",\n \"payslipOtherDeductionT1\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 1,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"payslip_statement_t2\",\n \"displayName\": \"Payslip Statement (Month T-2)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT2\",\n \"payslipEmployeeNameT2\",\n \"payslipPayPeriodT2\",\n \"payslipPayDateT2\",\n \"payslipGrossPayT2\",\n \"payslipDeductionT2\",\n \"payslipEmployeeEpfContributionT2\",\n \"payslipEmployeeSocsoContributionT2\",\n \"payslipNetPayT2\",\n \"payslipBasicPayT2\",\n \"payslipFixedAllowancesT2\",\n \"payslipVariableIncomeT2\",\n \"payslipEmployeeEisContributionT2\",\n \"payslipEmployeeTaxT2\",\n \"payslipOtherDeductionT2\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 2,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"payslip_statement_t3\",\n \"displayName\": \"Payslip Statement (Month T-3)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT3\",\n \"payslipEmployeeNameT3\",\n \"payslipPayPeriodT3\",\n \"payslipPayDateT3\",\n \"payslipGrossPayT3\",\n \"payslipDeductionT3\",\n \"payslipEmployeeEpfContributionT3\",\n \"payslipEmployeeSocsoContributionT3\",\n \"payslipNetPayT3\",\n \"payslipBasicPayT3\",\n \"payslipFixedAllowancesT3\",\n \"payslipVariableIncomeT3\",\n \"payslipEmployeeEisContributionT3\",\n \"payslipEmployeeTaxT3\",\n \"payslipOtherDeductionT3\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 3,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"payslip_statement_t4\",\n \"displayName\": \"Payslip Statement (Month T-4)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT4\",\n \"payslipEmployeeNameT4\",\n \"payslipPayPeriodT4\",\n \"payslipPayDateT4\",\n \"payslipGrossPayT4\",\n \"payslipDeductionT4\",\n \"payslipEmployeeEpfContributionT4\",\n \"payslipEmployeeSocsoContributionT4\",\n \"payslipNetPayT4\",\n \"payslipBasicPayT4\",\n \"payslipFixedAllowancesT4\",\n \"payslipVariableIncomeT4\",\n \"payslipEmployeeEisContributionT4\",\n \"payslipEmployeeTaxT4\",\n \"payslipOtherDeductionT4\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 4,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"payslip_statement_t5\",\n \"displayName\": \"Payslip Statement (Month T-5)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT5\",\n \"payslipEmployeeNameT5\",\n \"payslipPayPeriodT5\",\n \"payslipPayDateT5\",\n \"payslipGrossPayT5\",\n \"payslipDeductionT5\",\n \"payslipEmployeeEpfContributionT5\",\n \"payslipEmployeeSocsoContributionT5\",\n \"payslipNetPayT5\",\n \"payslipBasicPayT5\",\n \"payslipFixedAllowancesT5\",\n \"payslipVariableIncomeT5\",\n \"payslipEmployeeEisContributionT5\",\n \"payslipEmployeeTaxT5\",\n \"payslipOtherDeductionT5\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 5,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"payslip_statement_t6\",\n \"displayName\": \"Payslip Statement (Month T-6)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT6\",\n \"payslipEmployeeNameT6\",\n \"payslipPayPeriodT6\",\n \"payslipPayDateT6\",\n \"payslipGrossPayT6\",\n \"payslipDeductionT6\",\n \"payslipEmployeeEpfContributionT6\",\n \"payslipEmployeeSocsoContributionT6\",\n \"payslipNetPayT6\",\n \"payslipBasicPayT6\",\n \"payslipFixedAllowancesT6\",\n \"payslipVariableIncomeT6\",\n \"payslipEmployeeEisContributionT6\",\n \"payslipEmployeeTaxT6\",\n \"payslipOtherDeductionT6\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 6,\n \"time_period_unit\": \"month\"\n }\n ]\n}\n","{\n \"version\": 2,\n \"types\": [\n {\n \"displayName\": \"Text\",\n \"name\": \"text\"\n },\n {\n \"displayName\": \"Number\",\n \"name\": \"number\"\n },\n {\n \"displayName\": \"Email\",\n \"name\": \"email\"\n },\n {\n \"displayName\": \"Dropdown\",\n \"name\": \"dropdown\"\n },\n {\n \"displayName\": \"Checkbox\",\n \"name\": \"checkbox\"\n },\n {\n \"displayName\": \"Radio Group\",\n \"name\": \"radiogroup\"\n },\n {\n \"displayName\": \"Boolean\",\n \"name\": \"boolean\"\n },\n {\n \"displayName\": \"File\",\n \"name\": \"file\"\n },\n {\n \"displayName\": \"Slider\",\n \"name\": \"slider\"\n },\n {\n \"displayName\": \"Range\",\n \"name\": \"range\"\n },\n {\n \"displayName\": \"Long Text (Comment)\",\n \"name\": \"comment\"\n },\n {\n \"displayName\": \"HTML Content\",\n \"name\": \"html\"\n }\n ],\n \"input_types\": [\n {\n \"displayName\": \"Text\",\n \"name\": \"text\"\n },\n {\n \"displayName\": \"Number\",\n \"name\": \"number\"\n },\n {\n \"displayName\": \"Email\",\n \"name\": \"email\"\n },\n {\n \"displayName\": \"Tel\",\n \"name\": \"tel\"\n },\n {\n \"displayName\": \"Date\",\n \"name\": \"date\"\n },\n {\n \"displayName\": \"Password\",\n \"name\": \"password\"\n },\n {\n \"displayName\": \"URL\",\n \"name\": \"url\"\n }\n ]\n}\n","{\n \"version\": 1,\n \"options\": [\n {\n \"id\": 1,\n \"displayName\": \"Numeric Validator\",\n \"class\": \"NumericValidator\",\n \"description\": \"Ensures the answer is a number within the specified range of minValue and maxValue.\",\n \"isRequired\": true,\n \"validators\": [\n {\n \"type\": \"numeric\",\n \"text\": \"Value must be within the range of 0 to 100\",\n \"minValue\": 0,\n \"maxValue\": 100\n }\n ]\n },\n {\n \"id\": 2,\n \"displayName\": \"Text Length Validator\",\n \"class\": \"TextValidator\",\n \"description\": \"Confirms the length of entered text is between minLength and maxLength.\",\n \"isRequired\": true,\n \"validators\": [\n {\n \"type\": \"text\",\n \"minLength\": 10,\n \"maxLength\": 280\n }\n ]\n },\n {\n \"id\": 3,\n \"displayName\": \"Regex Validator\",\n \"class\": \"RegexValidator\",\n \"description\": \"Throws an error if an entered value does not match a regular expression defined in the regex property.\",\n \"isRequired\": true,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"The value must match the required pattern.\",\n \"regex\": \"your-regex-pattern-here\"\n }\n ]\n },\n {\n \"id\": 4,\n \"displayName\": \"Email Validator\",\n \"class\": \"EmailValidator\",\n \"description\": \"Confirms that the entered value is a valid e-mail address.\",\n \"isRequired\": true,\n \"validators\": [\n {\n \"type\": \"email\",\n \"text\": \"Value must be a valid email\"\n }\n ]\n },\n {\n \"id\": 5,\n \"displayName\": \"Expression Validator\",\n \"class\": \"ExpressionValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures that the field's expression always evaluates to true.\",\n \"validators\": [\n {\n \"type\": \"expression\",\n \"expression\": \"{fields} = true\",\n \"text\": \"The value must be true and cannot be false.\"\n }\n ]\n },\n {\n \"id\": 6,\n \"displayName\": \"Answer Count Validator\",\n \"class\": \"AnswerCountValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures selection of an appropriate number of choices, keeping responses within the minCount and maxCount range.\",\n \"validators\": [\n {\n \"type\": \"answercount\",\n \"minCount\": 2,\n \"maxCount\": 4\n }\n ]\n },\n {\n \"id\": 7,\n \"displayName\": \"Full Name Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures that the entered value is a valid full name.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please make sure the name doesn't include extra spaces, numbers, or invalid symbols\",\n \"regex\": \"^[A-Za-z'-]+(?:\\\\s[A-Za-z'-]+)*\\\\s?[A-Za-z'-]+$\"\n }\n ]\n },\n {\n \"id\": 8,\n \"displayName\": \"Mobile Phone No Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures valid Malaysia phone number is entered.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"A valid Malaysia phone number is required.\",\n \"regex\": \"^(011[0-9]{8}|01[2346789][0-9]{7}|[2-9][0-9]{0,8})$\"\n }\n ]\n },\n {\n \"id\": 9,\n \"displayName\": \"IC Number Total Digits Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures exactly 12 digits are entered for the IC number.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d{12}$\",\n \"text\": \"Please enter exactly 12 digits numbers\"\n }\n ]\n },\n {\n \"id\": 10,\n \"displayName\": \"IC Number Valid Birth Year, Month, and Date Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures valid birth year, month, and day are entered for the IC number.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^(\\\\d{2})(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])\\\\d{6}$\",\n \"text\": \"First 6 digits must be valid birth year (00-99), month (01-12), and day (01-31)\"\n }\n ]\n },\n {\n \"id\": 11,\n \"displayName\": \"Duration in Current Residence (Months) Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures duration includes a number between 0-11.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^([0-9]|10|11)$\",\n \"text\": \"Value must be a number between 0-11.\"\n }\n ]\n },\n {\n \"id\": 12,\n \"displayName\": \"Duration in Current Residence (Years) Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures duration includes a number between 0-99.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^([0-9]|[1-9][0-9])$\",\n \"text\": \"Value must be a number between 0-99.\"\n }\n ]\n },\n {\n \"id\": 13,\n \"displayName\": \"Office Phone No. Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures office phone number is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"The phone number must be a valid Malaysian number\",\n \"regex\": \"^(011[0-9]{8}|(60[4-7]|004|005|006|007|009|609|012|013|014|016|017|019)[0-9]{7})$\"\n }\n ]\n },\n {\n \"id\": 14,\n \"displayName\": \"Age Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures age entered is between 21-55.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid whole number age between 21 and 55.\",\n \"regex\": \"^(2[1-9]|[3-4][0-9]|55)$\"\n }\n ]\n },\n {\n \"id\": 15,\n \"displayName\": \"Consent(s) Expression Validator\",\n \"class\": \"ExpressionValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures that the field's expression always evaluates to true.\",\n \"validators\": [\n {\n \"type\": \"expression\",\n \"expression\": \"{consentCrossSelling} = true\",\n \"text\": \"You must provide consent to Consent Cross-Selling.\"\n }\n ]\n },\n {\n \"id\": 16,\n \"displayName\": \"Date Joined Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures date joined is in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\",\n \"text\": \"Date must be in YYYY-MM-DD format\"\n }\n ]\n },\n {\n \"id\": 17,\n \"displayName\": \"Date Joined Custom Validator\",\n \"class\": \"CustomValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures date joined is not in the future.\",\n \"validators\": [\n {\n \"type\": \"custom\",\n \"validator\": \"validateNotFutureDate\",\n \"text\": \"Date of joining cannot be in the future\"\n }\n ]\n },\n {\n \"id\": 18,\n \"displayName\": \"Emergency Contact No. Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures emergency contact number is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"A valid Malaysia phone number is required.\",\n \"regex\": \"^((60[4-79]|0[4-79])[0-9]{7}|011[0-9]{8}|01[2346789][0-9]{7})$\"\n }\n ]\n },\n {\n \"id\": 19,\n \"displayName\": \"Monthly Gross Income Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures monthly gross income is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d+(\\\\.\\\\d+)?$\",\n \"text\": \"Please enter a valid non-negative number.\"\n }\n ]\n },\n {\n \"id\": 20,\n \"displayName\": \"Monthly Gross Income Expression Validator\",\n \"class\": \"ExpressionValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures monthly gross income is at least RM 2000.\",\n \"validators\": [\n {\n \"type\": \"expression\",\n \"expression\": \"{monthlyGrossIncome} >= 2000\",\n \"text\": \"Income must be at least RM 2000.\"\n }\n ]\n },\n {\n \"id\": 21,\n \"displayName\": \"No of Dependants Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures number of dependants is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid whole number between 0 and 99.\",\n \"regex\": \"^[0-9][0-9]?$\"\n }\n ]\n },\n {\n \"id\": 22,\n \"displayName\": \"Financing Tenure (Years) Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures financing tenure is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid financing tenure from 1 to 7 years.\",\n \"regex\": \"^[1-7]$\"\n }\n ]\n },\n {\n \"id\": 23,\n \"displayName\": \"Financing Amount Range Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures financing amount is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a financing amount between 2,000 and 150,000.\",\n \"regex\": \"^(2000|[1-9][0-9]{3}|[1-9][0-9]{4}|150000)$\"\n }\n ]\n },\n {\n \"id\": 24,\n \"displayName\": \"Financing Amount Incrementals Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures financing amount is entered incrementally in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter an amount in increments of 1,000.\",\n \"regex\": \"^([1-9][0-9]*000|150000)$\"\n }\n ]\n }\n ]\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { FieldData, Category } from \"./survey-generator.js\";\nimport type { FormFieldTypeDefinitions, EditorValidator } from \"./form-field.js\";\nimport type { FormValidatorDefinitions } from \"./form-field-validator.js\";\nimport FormField from \"./form-field.js\";\nimport baseSpecsData from \"./data/form-field-base-specs.json\" with { type: \"json\" };\nimport typeDefsData from \"./data/form-field-types.json\" with { type: \"json\" };\nimport validatorDefsData from \"./data/form-field-validators.json\" with { type: \"json\" };\n\nexport const BASE_FIELD_SPECS: {\n schemaVersion: string;\n categories: Category[];\n fields: FieldData[];\n} = baseSpecsData as any;\n\nexport const FIELD_TYPE_DEFINITIONS: FormFieldTypeDefinitions = typeDefsData as FormFieldTypeDefinitions;\n\nexport const DEFAULT_VALIDATOR_DEFINITIONS: FormValidatorDefinitions = {\n version: (validatorDefsData as any).version,\n options: (validatorDefsData as any).options as EditorValidator[],\n};\n\nexport function getBaseFieldSpecs(): FieldData[] {\n return BASE_FIELD_SPECS.fields;\n}\n\nexport function getBaseCategories(): Category[] {\n return BASE_FIELD_SPECS.categories;\n}\n\nlet cachedFieldSpecMap: Map<string, FieldData> | null = null;\n\n/**\n * Returns a cached Map of base field name → FieldData.\n * Keyed by each field's `name` property from the base specs.\n */\nexport function getBaseFieldSpecMap(): Map<string, FieldData> {\n if (cachedFieldSpecMap) {\n return cachedFieldSpecMap;\n }\n\n const map = new Map<string, FieldData>();\n for (const field of BASE_FIELD_SPECS.fields) {\n if (field.name) {\n map.set(field.name, field);\n }\n }\n\n cachedFieldSpecMap = map;\n return cachedFieldSpecMap;\n}\n\nlet cachedFieldNames: string[] | null = null;\n\nexport function getBaseFieldNames(): string[] {\n if (cachedFieldNames) {\n return cachedFieldNames;\n }\n\n const fields = BASE_FIELD_SPECS.fields;\n const names: string[] = [];\n\n for (const field of fields) {\n try {\n const formField = FormField.fromObject(field);\n names.push(...formField.getFieldNames());\n } catch {\n // Skip fields that fail to parse\n }\n }\n\n cachedFieldNames = [...new Set(names)];\n return cachedFieldNames;\n}\n","/*\n * IHS data processing types.\n * Used by finsys-client and finhub-adonisjs to render application details.\n */\n\nexport enum IhsValueFormat {\n STRING = 'string',\n CURRENCY = 'currency',\n NUMBER = 'number',\n PERCENTAGE = 'percentage',\n DATE = 'date',\n TABLE = 'table',\n}\n\nexport interface IhsFieldDetail {\n name: string\n displayName: string\n category: string\n value: unknown\n valueFormat: IhsValueFormat\n}\n\nexport interface IhsDetailCategory {\n category: string\n items: { name: string; displayName: string; value: unknown; valueFormat: IhsValueFormat }[]\n}\n\nexport enum FileFieldTableType {\n TIME_SERIES = 'timeSeries',\n KEY_VALUE = 'keyValue',\n}\n\n/**\n * Per-field extraction provenance (SYS-2737/SYS-2741). The single canonical\n * envelope — finsys-api writes it (ihs_field_metadata), finsys-core surfaces it\n * onto detail cells, both consumers render it. Vocabulary mirrors adapter_runs\n * (SYS-2441) so FinXtract + adapter provenance converge at SYS-2499 Phase 5.\n *\n * source — who produced the value, e.g. \"finxtract:ssm\"\n * confidence — normalized 0..1; null when derived/computed (no score)\n * observedAt — ISO wall-clock of the extraction run\n * sourceRunId — the extraction run/job id that wrote it\n * origin — \"extracted\" (a real {value,confidence} leaf) vs \"derived\"\n * (computed / no-confidence path) vs \"manual\" (SYS-2806, a\n * lender-entered correction, committed once its edit overlay\n * is approved). A \"derived\" field must render as \"no\n * confidence available\", never a fabricated low score; a\n * \"manual\" field must render as an edit indicator, not a\n * confidence dot — confidence is always null for it too.\n */\n/**\n * Canonical origin values, single source of truth (Gemini-review finding:\n * avoids duplicating the literal strings between the type and the runtime\n * guard) -- mirrors the IhsStatus/IHS_VALID_STATUSES pattern in\n * ihs-status.ts.\n */\nexport const IHS_FIELD_ORIGINS = ['extracted', 'derived', 'manual'] as const\nexport type IhsFieldOrigin = (typeof IHS_FIELD_ORIGINS)[number]\n\nexport interface IhsFieldProvenance {\n source: string\n confidence: number | null\n observedAt: string\n sourceRunId: string | null\n origin: IhsFieldOrigin\n}\n\n/**\n * Type guard: narrows an unknown value to `IhsFieldOrigin` iff it is one of\n * the three canonical origin strings. `origin` was previously validated\n * only by the TS union — this is the first runtime check.\n */\nexport function isValidIhsFieldOrigin(origin: unknown): origin is IhsFieldOrigin {\n return typeof origin === 'string' && (IHS_FIELD_ORIGINS as readonly string[]).includes(origin)\n}\n\nexport interface FileFieldTableItem {\n displayName: string\n timePeriods: string[]\n data: Record<string, unknown>\n formattedData: Record<string, string>\n type: FileFieldTableType\n isNumeric: boolean\n /**\n * SYS-2741: per-cell extraction provenance, keyed exactly like `data` (period\n * key for TIME_SERIES, `'value'` for KEY_VALUE). `confidence` carries only\n * scored (origin 'extracted') cells so a numeric dot never renders for a\n * derived value; `provenance` carries the full envelope for every known cell.\n */\n confidence?: Record<string, number>\n provenance?: Record<string, IhsFieldProvenance>\n}\n\nexport interface FileFieldTableData {\n name: string\n displayName: string\n type: FileFieldTableType\n items: FileFieldTableItem[]\n hasData: boolean\n}\n\n/**\n * One sibling-table row as finsys-api's `docInstanceStorageService` writes\n * it (SYS-2842) -- the unbounded counterpart to a T{n}-suffixed wide-table\n * slot. `instanceKey` is the real, collision-free per-document key;\n * `sourceLabel` is a human label when the doc type has one (e.g. a bank\n * name); `timePeriod` is the same descriptive value column the legacy\n * T{n} scheme used, kept for period-labeling and legacy provenance lookup\n * (SYS-2886 Phase 5) -- no longer the row's key. Metric fields are the\n * category's own base (unsuffixed) column names.\n */\nexport interface InstanceRow {\n instanceKey: string\n sourceLabel?: string | null\n timePeriod?: string | null\n [metricKey: string]: unknown\n}\n\n// ── Documents table (SYS-2765 / SYS-2766) ──────────────────────\n\n/**\n * Per-document File metadata attached by finsys-api `getIhsDetailsById` as the\n * `documentMetadata` sibling map (SYS-2765), keyed by the document's raw stored\n * path. The single source for the documents table's Type / Size / Uploaded\n * columns — the IHS doc fields themselves carry only the path.\n */\nexport interface DocumentFileMetadata {\n fileName: string | null\n fileType: string | null\n fileSize: number | null\n createdAt: string | null\n}\n\n/**\n * Intrinsic, data-derived capability eligibility for a document row. Reflects\n * ONLY what the IHS payload implies (doc type + a resolvable file); the consumer\n * ANDs in its own runtime gates (readOnly, allowReupload, and — for viewJson —\n * whether extraction has actually completed) before showing a control.\n */\nexport interface DocumentRowCapabilities {\n /** A downloadable original exists (a resolvable documentId). */\n download: boolean\n /** The doc type produces extracted JSON (consumer still gates on \"Extracted\"). */\n viewJson: boolean\n /** The doc type can be re-extracted. */\n reExtract: boolean\n /** The doc type accepts a replacement upload (finsys-api /ihs/client/update/document). */\n reUpload: boolean\n}\n\n/**\n * One uploaded document, presentation-agnostic — built by `buildDocumentRows`\n * from the IHS payload + its `documentMetadata` map. Rendered identically by\n * FinHub (React) and finsys-client (Edge). Live extraction status + confidence\n * are NOT payload-derived; the consumer overlays them by matching\n * `(docType, timePeriod)`.\n */\nexport interface DocumentRow {\n /** IHS field key, e.g. 'bankStatements'. */\n docType: string\n /** Human label for the doc-type group, e.g. 'Bank Statements'. */\n label: string\n /** 0-based position within the docType group. */\n index: number\n /** Best display name (resolved file name, or a label + period/index fallback). */\n displayName: string\n /** Id for the download link; null when no file path is resolvable. */\n documentId: string | null\n /** Raw stored path — the join key back to `documentMetadata`. */\n path: string | null\n /** Extraction time-period token: 'T{month|year}' or 'ALL'. */\n timePeriod: string\n /** Human period label ('Jan 2026' / 'Year 2024') or null. */\n periodLabel: string | null\n /** Resolved file name; null when the stored name looks like an opaque id. */\n fileName: string | null\n /** File type label (extension → MIME subtype, upper-cased) or null. */\n fileType: string | null\n /** File size in bytes, or null when unknown. */\n fileSize: number | null\n /** ISO upload timestamp (File.createdAt) or null. */\n uploadedAt: string | null\n /** Intrinsic capability eligibility (consumer overlays its runtime gates). */\n capabilities: DocumentRowCapabilities\n}\n","/*\n * Document type registry.\n *\n * Single source of truth for \"which FinXtract document types exist,\"\n * derived directly from the field-spec catalog (form-field-base-specs.json)\n * instead of hand-synchronized code. This replaces four previously-separate\n * structures that had to be edited together by hand:\n * - extraction.ts's closed ExtractionFileType enum\n * - extraction-status.ts's FILE_TYPE_TO_GROUP map\n * - ihs-processing.ts's FIELD_GROUP_PREFIXES + GROUP_DISPLAY_NAMES\n *\n * Adding a new document type (e.g. invoices) is now a data-only edit to\n * form-field-base-specs.json -- tag its `type: 'file'` entries with\n * document_type/document_group/document_group_label/wire_format, no\n * TypeScript union to edit, no exhaustive map to keep in sync by hand.\n *\n * Six distinct properties, because real consumer code depends on each\n * independently (confirmed by direct trace, not assumed):\n * - document_type: the wire/dispatch value (e.g. \"bankStatements\") --\n * what File.type, processIhsUpdate's switch, and ocrValidator's\n * allowlist key on.\n * - document_group: the render/table grouping key (e.g. \"ssm_documents\")\n * -- what buildFileFieldTables's output is keyed by. finsys-client's\n * ihs_controller.ts specifically special-cases the literal string\n * \"ssm_documents\" (skips it in favor of a dedicated partial), so this\n * must stay a distinct, stable value from document_type, not merged.\n * - document_group_label: human-friendly table/status display label.\n * - wire_format: reserved for a future @finsys/borrower-client\n * consolidation of its own payload-transfer.ts registry (not consumed\n * by anything in this package yet) -- 'path_array' | 'url_string' |\n * 'path_only', mirroring the shapes borrower-client already uses.\n * - document_slot: which UPLOAD position this field represents (1st\n * document, 2nd, etc.) -- known at upload time, before extraction\n * ever runs. Distinct from a \"time period slot\" (which final\n * displayed period the EXTRACTED DATA populates): for bank\n * statements/EPF/payslips these are always 1:1 (one document, one\n * period), but for financial statements one document can supply TWO\n * periods' worth of data (audited financials show two comparative\n * years per document) -- that reconciliation is genuinely\n * extraction-time behavior, not catalog data, and is NOT captured\n * by document_slot. document_slot is exactly what\n * @finsys/borrower-client's payload-transfer.ts currently has to\n * regex-capture out of the field name (e.g. `bank_statement_t(\\d+)`)\n * -- reserved here for that future consolidation, not consumed by\n * anything in this package yet. `financials` (slot 1) and\n * `financials_fincap_t1` (also slot 1) are NOT a duplicate-slot bug:\n * they're alternate catalog entries for different form variants\n * (confirmed by direct read -- both share document_group \"financials\"\n * but represent mutually exclusive form paths, never populated\n * together on one IHS), so both correctly describe \"the first\n * physical document uploaded\" for their respective variant.\n * - time_period_unit: what unit document_slot's number measures for\n * this field -- 'month' | 'year'. Confirmed by the actual catalog\n * data, not assumed: bank statements and payslips are monthly,\n * financial statements and EPF statements are annual (EPF's own\n * column names literally contain \"Year\", e.g. epfStatementYearT1).\n *\n * Mirrors the AdapterCategory pattern (SYS-2500): runtime lookup/grouping\n * derived from JSON data, no compile-time exhaustiveness. Same trade-off\n * applies -- no autocomplete on a document-type string; a wrong one is\n * caught by isDocumentType/assertDocumentType at the trust boundary\n * instead of by the compiler.\n */\n\nimport { getBaseFieldSpecs } from './catalogs.js'\nimport type { FieldData } from './survey-generator.js'\n\nexport type WireFormat = 'path_array' | 'url_string' | 'path_only'\nexport type TimePeriodUnit = 'month' | 'year'\n\nexport interface DocumentTypeGroup {\n /** Wire/dispatch value, e.g. \"bankStatements\". */\n readonly documentType: string\n /** Render/table grouping key, e.g. \"ssm_documents\". Distinct from documentType -- see module doc. */\n readonly documentGroup: string\n /** Human-friendly label, e.g. \"Bank Statements\". */\n readonly label: string\n /** Reserved for a future borrower-client payload-routing consolidation. Taken from the group's first entry; not enforced consistent across entries (all groups agree today, but a future mixed-format group would silently inherit the first entry's value). */\n readonly wireFormat?: WireFormat\n /**\n * The catalog's own `type: 'file'` entries belonging to this group, in\n * catalog order. Each entry may carry its own document_slot/\n * time_period_unit -- see TaggedFieldData and the module doc.\n */\n readonly fields: readonly TaggedFieldData[]\n}\n\nexport interface TaggedFieldData extends FieldData {\n document_type?: string\n document_group?: string\n document_group_label?: string\n wire_format?: WireFormat\n /** Which upload position this field represents (1st document, 2nd, etc). See module doc for why this is distinct from a \"time period\". */\n document_slot?: number\n /** What unit document_slot's number measures for this field. */\n time_period_unit?: TimePeriodUnit\n}\n\nlet cached: readonly DocumentTypeGroup[] | null = null\n\nfunction buildDocumentTypeGroups(): readonly DocumentTypeGroup[] {\n const fileFields = getBaseFieldSpecs().filter(\n (f): f is TaggedFieldData => f.type === 'file' && !!f.name,\n )\n\n const order: string[] = []\n const byDocumentType = new Map<\n string,\n {\n documentGroup: string\n label: string\n wireFormat: WireFormat | undefined\n fields: TaggedFieldData[]\n }\n >()\n\n for (const f of fileFields) {\n // Untagged entries (none exist today, but future-proofed): fall back\n // to the entry's own name/displayName as a single-entry group.\n const documentType = f.document_type ?? f.name!\n const documentGroup = f.document_group ?? documentType\n const label = f.document_group_label ?? f.displayName ?? documentType\n\n if (!byDocumentType.has(documentType)) {\n order.push(documentType)\n byDocumentType.set(documentType, {\n documentGroup,\n label,\n wireFormat: f.wire_format,\n fields: [],\n })\n }\n byDocumentType.get(documentType)!.fields.push(f)\n }\n\n return order.map((documentType) => {\n const entry = byDocumentType.get(documentType)!\n return {\n documentType,\n documentGroup: entry.documentGroup,\n label: entry.label,\n wireFormat: entry.wireFormat,\n fields: entry.fields,\n }\n })\n}\n\n/** Every registered document type, in catalog declaration order. */\nexport function getDocumentTypeGroups(): readonly DocumentTypeGroup[] {\n if (!cached) cached = buildDocumentTypeGroups()\n return cached\n}\n\n/** True if `id` is a registered document type (the wire/dispatch value). */\nexport function isDocumentType(id: string): boolean {\n return getDocumentTypeGroups().some((g) => g.documentType === id)\n}\n\n/** Returns `id` if it's a registered document type, otherwise throws. */\nexport function assertDocumentType(id: string): string {\n if (!isDocumentType(id)) {\n const known = getDocumentTypeGroups().map((g) => g.documentType)\n throw new Error(`Unknown document type: \"${id}\". Available: ${known.join(', ')}`)\n }\n return id\n}\n","{\n \"accountHolderName\": \"Account Holder Name\",\n \"statementDate\": \"Statement Date\",\n \"bankName\": \"Bank Name\",\n \"accountNumber\": \"Account Number\",\n \"totalCredits\": \"Total Credits\",\n \"totalDebits\": \"Total Debits\",\n \"openingBalance\": \"Opening Balance\",\n \"bankBalance\": \"Bank Balance\",\n \"nonCurrentAssetsSubsidiaryCompanies\": \"Subsidiary Companies (Non-Current Assets)\",\n \"nonCurrentAssetsAssociatedCompanies\": \"Associated Companies (Non-Current Assets)\",\n \"nonCurrentAssetsDevelopmentPropertiesOrExpenditure\": \"Development Properties/Expenditure (Non-Current Assets)\",\n \"nonCurrentAssetInvestmentProperties\": \"Investment Properties (Non-Current Assets)\",\n \"nonCurrentAssetsInvestments\": \"Investments (Non-Current Assets)\",\n \"nonCurrentAssetInvestmentSecurities\": \"Investment Securities (Non-Current Assets)\",\n \"nonCurrentAssetDeferredAssets\": \"Deferred Assets (Non-Current Assets)\",\n \"nonCurrentAssetDeposits\": \"Deposits (Non-Current Assets)\",\n \"nonCurrentAssetOwnGoodwill\": \"Own Goodwill (Non-Current Assets)\",\n \"nonCurrentAssetGoodwillOnConsolidation\": \"Goodwill on Consolidation (Non-Current Assets)\",\n \"nonCurrentAssetSinkingFund\": \"Sinking Fund (Non-Current Assets)\",\n \"nonCurrentAssetPropertyPlantEquipment\": \"Property, Plant & Equipment (Non-Current Assets)\",\n \"nonCurrentAssetInventories\": \"Inventories (Non-Current Assets)\",\n \"nonCurrentAssetRightOfUseAssets\": \"Right of Use Assets (Non-Current Assets)\",\n \"nonCurrentAssetIntangibleAssets\": \"Intangible Assets (Non-Current Assets)\",\n \"nonCurrentAssetPrepaidLeasePayments\": \"Prepaid Lease Payments (Non-Current Assets)\",\n \"nonCurrentAssetFinancialAssetAtFairValue\": \"Financial Assets at Fair Value (Non-Current Assets)\",\n \"nonCurrentAssetLandUseRight\": \"Land Use Rights (Non-Current Assets)\",\n \"nonCurrentAssetTradeReceivables\": \"Trade Receivables (Non-Current Assets)\",\n \"nonCurrentAssetOtherReceivables\": \"Other Receivables (Non-Current Assets)\",\n \"nonCurrentAssetTradeAndOtherReceivables\": \"Trade and Other Receivables (Non-Current Assets)\",\n \"nonCurrentAssetOtherReceivablesDepositsAndPrepayments\": \"Other Receivables, Deposits and Prepayments (Non-Current Assets)\",\n \"totalNonCurrentAssets\": \"Total Non-Current Assets\",\n \"currentAssetDevelopmentPropertiesOrExpenditure\": \"Development Properties/Expenditure (Current Assets)\",\n \"currentAssetShortTermInvestments\": \"Short Term Investments (Current Assets)\",\n \"currentAssetTradeDebtors\": \"Trade Debtors (Current Assets)\",\n \"currentAssetShortTermDeposits\": \"Short Term Deposits (Current Assets)\",\n \"currentAssetAmountDueFromHoldingCompany\": \"Amount Due from Holding Company (Current Assets)\",\n \"currentAssetAmountDueFromSubsidiaryCompanies\": \"Amount Due from Subsidiary Companies (Current Assets)\",\n \"currentAssetAmountDueFromAssociatedCompanies\": \"Amount Due from Associated Companies (Current Assets)\",\n \"currentAssetAmountDueFromDirector\": \"Amount Due from Director (Current Assets)\",\n \"currentAssetAmountDueFromCustomer\": \"Amount Due from Customer (Current Assets)\",\n \"currentAssetAmountOwingByShareholders\": \"Amount Owing by Shareholders (Current Assets)\",\n \"currentAssetInventories\": \"Inventories (Current Assets)\",\n \"currentAssetFinancialAssetAtFairValue\": \"Financial Assets at Fair Value (Current Assets)\",\n \"currentAssetLandUseRight\": \"Land Use Rights (Current Assets)\",\n \"currentAssetTaxRecoverable\": \"Tax Recoverable (Current Assets)\",\n \"currentAssetContractAssets\": \"Contract Assets (Current Assets)\",\n \"currentAssetCurrentTaxAssets\": \"Current Tax Assets (Current Assets)\",\n \"currentAssetPrepayments\": \"Prepayments (Current Assets)\",\n \"currentAssetDerivative\": \"Derivatives (Current Assets)\",\n \"currentAssetCashAndBankBalances\": \"Cash and Bank Balances (Current Assets)\",\n \"currentAssetOtherReceivables\": \"Other Receivables (Current Assets)\",\n \"currentAssetRestrictedCash\": \"Restricted Cash (Current Assets)\",\n \"currentAssetCashAndCashEquivalents\": \"Cash and Cash Equivalents (Current Assets)\",\n \"currentAssetDepositsCashAndBankBalances\": \"Deposits, Cash and Bank Balances (Current Assets)\",\n \"currentAssetCashAtBanks\": \"Cash at Banks (Current Assets)\",\n \"currentAssetCashOnHand\": \"Cash on Hand (Current Assets)\",\n \"currentAssetDepositsAndPrepayments\": \"Deposits and Prepayments (Current Assets)\",\n \"currentAssetTradeAndOtherReceivables\": \"Trade and Other Receivables (Current Assets)\",\n \"currentAssetOtherReceivablesDepositsAndPrepayments\": \"Other Receivables, Deposits and Prepayments (Current Assets)\",\n \"currentAssetOtherReceivablesAndDeposits\": \"Other Receivables and Deposits (Current Assets)\",\n \"currentAssetOtherReceivablesAndPrepayments\": \"Other Receivables and Prepayments (Current Assets)\",\n \"currentAssetCash\": \"Cash (Current Assets)\",\n \"totalCurrentAssets\": \"Total Current Assets\",\n \"totalAssets\": \"Total Assets\",\n \"currentLiabilitiesTradeCreditors\": \"Trade Creditors (Current Liabilities)\",\n \"currentLiabilitiesHirePurchasePayables\": \"Hire Purchase Payables (Current Liabilities)\",\n \"currentLiabilitiesBankOverdraft\": \"Bank Overdraft (Current Liabilities)\",\n \"currentLiabilitiesBankAcceptance\": \"Bank Acceptance (Current Liabilities)\",\n \"currentLiabilitiesBorrowingsOrTermLoans\": \"Borrowings/Term Loans (Current Liabilities)\",\n \"currentLiabilitiesBankborrowings\": \"Bank Borrowings (Current Liabilities)\",\n \"currentLiabilitiesAmountsOwingToHoldingCompany\": \"Amounts Owing to Holding Company (Current Liabilities)\",\n \"currentLiabilitiesAmountsOwingToSubsidiaryCompanies\": \"Amounts Owing to Subsidiary Companies (Current Liabilities)\",\n \"currentLiabilitiesAmountOwingToAssociatedCompanies\": \"Amount Owing to Associated Companies (Current Liabilities)\",\n \"currentLiabilitiesAmountsOwingToDirector\": \"Amounts Owing to Director (Current Liabilities)\",\n \"currentLiabilitiesProvisionForTaxation\": \"Provision for Taxation (Current Liabilities)\",\n \"currentLiabilitiesLeasePayables\": \"Lease Payables (Current Liabilities)\",\n \"currentLiabilitiesFinanceLeasePayables\": \"Finance Lease Payables (Current Liabilities)\",\n \"currentLiabilitiesOtherPayables\": \"Other Payables (Current Liabilities)\",\n \"currentLiabilitiesDividendPayables\": \"Dividend Payables (Current Liabilities)\",\n \"currentLiabilitiesTradeAndOtherPayables\": \"Trade and Other Payables (Current Liabilities)\",\n \"currentLiabilitiesDepositsFromCustomers\": \"Deposits from Customers (Current Liabilities)\",\n \"currentLiabilitiesOtherPayablesAccrualsAndDeposits\": \"Other Payables, Accruals and Deposits (Current Liabilities)\",\n \"currentLiabilitiesOtherPayablesAndAccruals\": \"Other Payables and Accruals (Current Liabilities)\",\n \"currentLiabilitiesContractLiabilities\": \"Contract Liabilities (Current Liabilities)\",\n \"currentLiabilitiesDerivative\": \"Derivative Liabilities (Current Liabilities)\",\n \"totalCurrentLiabilities\": \"Total Current Liabilities\",\n \"shortTermLiabilities\": \"Short Term Liabilities\",\n \"nonCurrentLiabilitiesBorrowingsOrTermLoans\": \"Borrowings/Term Loans (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesBankBorrowings\": \"Bank Borrowings (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesLeaseObligations\": \"Lease Obligations (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesFinanceLeaseObligations\": \"Finance Lease Obligations (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesDeferredTaxation\": \"Deferred Taxation (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesRetirementBenefits\": \"Retirement Benefits (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesHirePurchasePayables\": \"Hire Purchase Payables (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesDepositsFromCustomers\": \"Deposits from Customers (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesContractLiabilities\": \"Contract Liabilities (Non-Current Liabilities)\",\n \"totalNonCurrentLiabilities\": \"Total Non-Current Liabilities\",\n \"totalLiabilities\": \"Total Liabilities\",\n \"tangibleAssets\": \"Tangible Assets\",\n \"shareCapital\": \"Share Capital\",\n \"preferenceShareCapital\": \"Preference Share Capital\",\n \"sharePremium\": \"Share Premium\",\n \"reserves\": \"Reserves\",\n \"capitalReserves\": \"Capital Reserves\",\n \"revaluationReserves\": \"Revaluation Reserves\",\n \"exchangeEqualisationOrFluctuationReserves\": \"Exchange Equalisation/Fluctuation Reserves\",\n \"retainedEarnings\": \"Retained Earnings\",\n \"totalEquity\": \"Total Equity\",\n \"revenue\": \"Revenue\",\n \"costOfGoodsSold\": \"Cost of Goods Sold\",\n \"grossProfit\": \"Gross Profit\",\n \"otherIncome\": \"Other Income\",\n \"profitFromOperations\": \"Profit from Operations\",\n \"financeCost\": \"Finance Cost\",\n \"ebitda\": \"Profit Before Tax\",\n \"taxes\": \"Taxes\",\n \"zakat\": \"Zakat\",\n \"profitAfterTax\": \"Profit After Tax\",\n \"netProfit\": \"Net Profit\",\n \"netOperatingCashFlow\": \"Net Operating Cash Flow\",\n \"depreciation\": \"Depreciation\",\n \"depreciationOfPropertyPlantEquipment\": \"Depreciation of Property, Plant & Equipment\",\n \"depreciationRightOfUseAssets\": \"Depreciation of Right of Use Assets\",\n \"depreciationOfInvestmentProperties\": \"Depreciation of Investment Properties\",\n \"depreciationOfInvestmentSecurities\": \"Depreciation of Investment Securities\",\n \"endOfYearCash\": \"End of Year Cash\",\n \"epfAccountHolderName\": \"Account Holder Name\",\n \"epfAccountHolderAddress\": \"Account Holder Address\",\n \"epfStatementYear\": \"Statement Year\",\n \"epfKwspMemberNumber\": \"KWSP Member Number\",\n \"epfIcNumber\": \"IC No.\",\n \"epfEmployerNumber\": \"Employer Number\",\n \"epfDateOfStatement\": \"Date Of Statement\",\n \"epfTotalContribution\": \"Total Contribution\",\n \"epfTotalCurrentContribution\": \"Total Current Contribution\",\n \"payslipEmployerName\": \"Employer Name\",\n \"payslipEmployeeName\": \"Employee Name\",\n \"payslipPayPeriod\": \"Pay Period\",\n \"payslipPayDate\": \"Pay Date\",\n \"payslipGrossPay\": \"Gross Pay\",\n \"payslipDeduction\": \"Deduction\",\n \"payslipEmployeeEpfContribution\": \"Employee EPF Contribution\",\n \"payslipEmployeeSocsoContribution\": \"Employee SOCSO Contribution\",\n \"payslipNetPay\": \"Net Pay\",\n \"incorporatedDate\": \"Incorporated Date\",\n \"companyName\": \"Company Name\",\n \"companyRegNo\": \"Company Registration No.\",\n \"ssmCompanyName\": \"Company Name (SSM)\",\n \"ssmCompanyRegNo\": \"Registration No. (SSM)\",\n \"ssmCompanyEntityType\": \"Entity Type (SSM)\",\n \"ssmPaidUpCapital\": \"Paid-Up Capital (SSM)\",\n \"businessCommencementDate\": \"Business Commencement Date\",\n \"businessNature\": \"Business Nature\",\n \"companyStatus\": \"Company Status\",\n \"shareholders\": \"Shareholders\",\n \"directors\": \"Directors\",\n \"previousDirectors\": \"Previous Directors\",\n \"totalShareIssued\": \"Total Shares Issued\",\n \"companyLastOldName\": \"Previous Company Name\",\n \"companyNameDateOfChange\": \"Company Name Change Date\",\n \"businessOrigin\": \"Business Origin\",\n \"registeredAddress\": \"Registered Address\",\n \"icName\": \"Name (IC)\",\n \"icNumber\": \"IC Number\",\n \"icAddress\": \"Address (IC)\",\n \"icGender\": \"Gender (IC)\",\n \"icReligion\": \"Religion (IC)\",\n \"icDateOfBirth\": \"Date of Birth (IC)\",\n \"icPlaceOfBirth\": \"Place of Birth (IC)\",\n \"icNationality\": \"Nationality (IC)\",\n \"icRace\": \"Race (IC)\"\n}\n","/*\n * IHS data processing functions.\n *\n * Pure data transformations for extracting structured detail and\n * file-field table data from raw IHS API responses. Used by both\n * finsys-client and finhub-adonisjs.\n */\n\nimport type { FieldData } from './survey-generator.js'\nimport {\n IhsValueFormat,\n FileFieldTableType,\n} from './ihs-types.js'\nimport type {\n IhsFieldDetail,\n IhsDetailCategory,\n FileFieldTableData,\n FileFieldTableItem,\n IhsFieldProvenance,\n DocumentRow,\n DocumentFileMetadata,\n InstanceRow,\n} from './ihs-types.js'\nimport { getBaseFieldSpecs, getBaseCategories, getBaseFieldSpecMap } from './catalogs.js'\nimport { getDocumentTypeGroups } from './document-types.js'\nimport type { TaggedFieldData } from './document-types.js'\nimport displayNamesData from './data/form-field-display-names.json' with { type: 'json' }\n\n// ── Display names ──────────────────────────────────────────────\n\nconst displayNames: Record<string, string> = displayNamesData as Record<string, string>\n\n/** Returns the full display name registry (extraction column → human label). */\nexport function getDisplayNames(): Record<string, string> {\n return displayNames\n}\n\n/** Looks up a display name. Falls back to camelCase → Title Case conversion. */\nexport function getDisplayName(fieldName: string): string {\n if (displayNames[fieldName]) return displayNames[fieldName]\n return fieldName\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (s) => s.toUpperCase())\n .trim()\n}\n\n// ── Time-period utilities ──────────────────────────────────────\n\nconst TIME_PERIOD_REGEX = /T(\\d+)$/\n\nexport function extractTimePeriods(columnNames: string[]): string[] {\n const periods = new Set<string>()\n for (const col of columnNames) {\n const match = TIME_PERIOD_REGEX.exec(col)\n if (match) periods.add(`T${match[1]}`)\n }\n return [...periods].sort((a, b) => {\n const numA = parseInt(a.slice(1), 10)\n const numB = parseInt(b.slice(1), 10)\n return numA - numB\n })\n}\n\nexport function groupColumnsByTimePeriod(\n columnNames: string[]\n): Record<string, Record<string, string>> {\n const groups: Record<string, Record<string, string>> = {}\n for (const col of columnNames) {\n const match = /^(.+?)(T\\d+)$/.exec(col)\n if (!match) continue\n const [, baseName, period] = match\n if (!groups[baseName]) groups[baseName] = {}\n groups[baseName][period] = col\n }\n return groups\n}\n\n// ── Field grouping ─────────────────────────────────────────────\n\n/**\n * Groups fields by their catalog-declared document_group (falling back to\n * the field's own name for anything untagged). Was a hardcoded, closed\n * prefix-matching table (FIELD_GROUP_PREFIXES) requiring a code edit for\n * every new document type; now reads the same document_group tag the\n * catalog already carries for document-types.ts, so adding a document\n * type is a catalog-only data change.\n */\nexport function groupFieldsByPattern(fields: FieldData[]): Record<string, FieldData[]> {\n const groups: Record<string, FieldData[]> = {}\n for (const field of fields) {\n if (!field.name) continue\n const groupName = (field as TaggedFieldData).document_group ?? field.name\n if (!groups[groupName]) groups[groupName] = []\n groups[groupName].push(field)\n }\n return groups\n}\n\n/**\n * Human-friendly display names for field groups (when a group combines\n * multiple fields), derived from document-types.ts's catalog-backed\n * registry instead of a hardcoded map.\n */\nlet cachedGroupDisplayNames: Record<string, string> | null = null\n\nexport function getGroupDisplayNames(): Record<string, string> {\n if (!cachedGroupDisplayNames) {\n const names: Record<string, string> = {}\n for (const group of getDocumentTypeGroups()) {\n names[group.documentGroup] = group.label\n }\n cachedGroupDisplayNames = names\n }\n return cachedGroupDisplayNames\n}\n\n// ── File-field table building ──────────────────────────────────\n\nfunction isNumericField(fieldName: string): boolean {\n const patterns = [\n 'balance',\n 'amount',\n 'credit',\n 'debit',\n 'total',\n 'revenue',\n 'cost',\n 'income',\n 'expense',\n 'liability',\n 'asset',\n 'equity',\n 'profit',\n 'loss',\n 'cash',\n 'tax',\n 'interest',\n ]\n const lower = fieldName.toLowerCase()\n return patterns.some((p) => lower.includes(p))\n}\n\nfunction formatValue(value: unknown, numeric: boolean): string {\n if (value === null || value === undefined || value === '') return '-'\n if (numeric) {\n const num = Number(value)\n if (!isNaN(num))\n return num.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })\n }\n return String(value)\n}\n\nfunction buildTableForGroup(\n groupName: string,\n fields: FieldData[],\n ihsData: Record<string, unknown>,\n fieldProvenance?: Record<string, IhsFieldProvenance>\n): FileFieldTableData | null {\n const allColumns: string[] = []\n for (const field of fields) {\n if (field.ihs_column_names) {\n allColumns.push(...field.ihs_column_names)\n }\n }\n if (allColumns.length === 0) return null\n\n const periods = extractTimePeriods(allColumns)\n const isTimeSeries = periods.length > 0\n const tableType = isTimeSeries ? FileFieldTableType.TIME_SERIES : FileFieldTableType.KEY_VALUE\n const groupDisplayName =\n getGroupDisplayNames()[groupName] || fields[0]?.displayName || getDisplayName(groupName)\n\n if (isTimeSeries) {\n const columnGroups = groupColumnsByTimePeriod(allColumns)\n const items: FileFieldTableItem[] = []\n\n for (const [baseName, periodMap] of Object.entries(columnGroups)) {\n const numeric = isNumericField(baseName)\n const data: Record<string, unknown> = {}\n const formattedData: Record<string, string> = {}\n const confidence: Record<string, number> = {}\n const provenance: Record<string, IhsFieldProvenance> = {}\n\n for (const period of periods) {\n const colName = periodMap[period]\n const value = colName ? (ihsData[colName] ?? null) : null\n data[period] = value\n formattedData[period] = formatValue(value, numeric)\n // SYS-2741: colName is the exact ihs_field_metadata key (incl. T{n} suffix).\n const prov = colName ? fieldProvenance?.[colName] : undefined\n if (prov) {\n provenance[period] = prov\n if (\n prov.origin === 'extracted' &&\n typeof prov.confidence === 'number' &&\n !Number.isNaN(prov.confidence)\n ) {\n confidence[period] = prov.confidence\n }\n }\n }\n\n items.push({\n displayName: getDisplayName(baseName),\n timePeriods: periods,\n data,\n formattedData,\n type: tableType,\n isNumeric: numeric,\n ...(Object.keys(confidence).length ? { confidence } : {}),\n ...(Object.keys(provenance).length ? { provenance } : {}),\n })\n }\n\n const hasData = items.some((item) =>\n Object.values(item.data).some((v) => v !== null && v !== undefined && v !== '')\n )\n return { name: groupName, displayName: groupDisplayName, type: tableType, items, hasData }\n } else {\n const items: FileFieldTableItem[] = []\n for (const colName of allColumns) {\n const value = ihsData[colName] ?? null\n const numeric = isNumericField(colName)\n // SYS-2741: single-doc columns (ssmCompanyName, companyName, icName, …) are\n // keyed directly in ihs_field_metadata — lit up here (the value-match interim\n // had to skip these because filename-based OCR lookup was unreliable).\n const prov = fieldProvenance?.[colName]\n items.push({\n displayName: getDisplayName(colName),\n timePeriods: [],\n data: { value },\n formattedData: { value: formatValue(value, numeric) },\n type: tableType,\n isNumeric: numeric,\n ...(prov &&\n prov.origin === 'extracted' &&\n typeof prov.confidence === 'number' &&\n !Number.isNaN(prov.confidence)\n ? { confidence: { value: prov.confidence } }\n : {}),\n ...(prov ? { provenance: { value: prov } } : {}),\n })\n }\n const hasData = items.some((item) => {\n const v = item.data['value']\n return v !== null && v !== undefined && v !== ''\n })\n return { name: groupName, displayName: groupDisplayName, type: tableType, items, hasData }\n }\n}\n\nexport function buildFileFieldTables(\n ihsData: Record<string, unknown>,\n fieldProvenance?: Record<string, IhsFieldProvenance>\n): Record<string, FileFieldTableData> {\n const specs = getBaseFieldSpecs()\n const fileFields = specs.filter((f) => f.type === 'file' && f.ihs_column_names?.length)\n const grouped = groupFieldsByPattern(fileFields)\n\n const tables: Record<string, FileFieldTableData> = {}\n for (const [groupName, fields] of Object.entries(grouped)) {\n const table = buildTableForGroup(groupName, fields, ihsData, fieldProvenance)\n if (table && table.hasData) {\n tables[groupName] = table\n }\n }\n return tables\n}\n\n// ── Instance-based field grouping (SYS-2886 / Phase 5) ──────────\n//\n// The catalog's T{n}-suffixed columns (bankBalanceT1..T6) declare a FIXED\n// cardinality per category -- at most 6 bank statements, 3 financial-year\n// slots, etc (buildFileFieldTables/groupColumnsByTimePeriod above are\n// bound to that fixed declaration). groupColumnsByInstance is the\n// unbounded counterpart: it takes the RAW sibling-table rows finsys-api\n// now exposes per category (SYS-2842's docInstanceStorageService -- one\n// row per uploaded document, keyed by a real instanceKey, not a\n// pre-declared T{n} slot) and groups them by base metric name, with one\n// column per ROW rather than per pre-declared period.\n//\n// Deliberately requires NO new catalog entries: every T{n} slot for a\n// given category declares the identical base column names (verified\n// across bank_statement_t1..t6 and the analogous financial/epf/payslip\n// entries), so the base names are derived by stripping the existing\n// suffixed specs' ihs_column_names rather than duplicating them in the\n// catalog. The 129 T{n}-suffixed wide-table columns and their catalog\n// entries stay exactly as they are (frozen, not migrated, per the\n// epic's Phase 6 scope) -- this is purely additive.\n\n/**\n * Human label for one instance column: \"Mar 2026 · Maybank\" when a\n * sourceLabel is known, else the bare period/instanceKey.\n */\nfunction instanceColumnLabel(row: InstanceRow): string {\n const period = row.timePeriod || row.instanceKey\n return row.sourceLabel ? `${period} · ${row.sourceLabel}` : period\n}\n\n/**\n * Adversarial-review finding (Phase 5): instanceColumnLabel is NOT\n * collision-free -- two distinct rows (distinct instanceKey) can share\n * the same timePeriod + sourceLabel (e.g. two same-bank, same-month\n * statements, or any row lacking sourceLabel that shares a period).\n * Since every consumer keys data/confidence/provenance BY this label\n * (matching FileFieldTableItem's existing contract, where timePeriods'\n * entries are literal object keys into `data`), an undisambiguated\n * collision doesn't just look wrong -- it silently drops one row's\n * value entirely (last-write-wins into the same object key) while\n * `timePeriods` keeps a duplicate entry pointing at the SURVIVING row's\n * value twice. Disambiguates by appending \"(2)\", \"(3)\", ... to every\n * occurrence after the first, keeping the common (non-colliding) case's\n * label exactly as before. Both groupColumnsByInstance and\n * buildInstanceTable call this SAME function on the SAME instanceRows\n * array (never the raw per-row instanceColumnLabel directly), so the\n * two independently-computed label lists always agree with each other.\n */\nfunction instanceColumnLabels(rows: InstanceRow[]): string[] {\n const seenCounts = new Map<string, number>()\n return rows.map((row) => {\n const raw = instanceColumnLabel(row)\n const occurrence = (seenCounts.get(raw) ?? 0) + 1\n seenCounts.set(raw, occurrence)\n return occurrence === 1 ? raw : `${raw} (${occurrence})`\n })\n}\n\n/**\n * Groups instance rows by base metric name -- the unbounded analog of\n * groupColumnsByTimePeriod. `baseColumnNames` is the category's base\n * (unsuffixed) field list; each returned group maps instance column\n * label -> that metric's value on that row. Labels are disambiguated\n * (see instanceColumnLabels) so two rows can never collide into the\n * same key.\n */\nexport function groupColumnsByInstance(\n baseColumnNames: string[],\n instanceRows: InstanceRow[]\n): Record<string, Record<string, unknown>> {\n const groups: Record<string, Record<string, unknown>> = {}\n for (const baseName of baseColumnNames) {\n groups[baseName] = {}\n }\n if (!instanceRows?.length) return groups\n const labels = instanceColumnLabels(instanceRows)\n instanceRows.forEach((row, i) => {\n const label = labels[i]\n for (const baseName of baseColumnNames) {\n if (Object.prototype.hasOwnProperty.call(row, baseName)) {\n groups[baseName][label] = row[baseName]\n }\n }\n })\n return groups\n}\n\n/**\n * Instance-based counterpart to buildFileFieldTables: builds one table\n * per category present in `instancesByCategory`, with one column per\n * instance row (unbounded) instead of one column per pre-declared T{n}\n * slot. Categories absent from `instancesByCategory` are simply skipped\n * -- callers merge this output with buildFileFieldTables' own (or use it\n * standalone once a category has fully cut over).\n *\n * Provenance stays keyed the legacy way (`${baseName}${timePeriod}`, per\n * the epic's established SYS-2842 rule that @finsys/core's exact-string\n * lookup can't change format without a coordinated release) -- so only\n * instances whose timePeriod maps onto a legacy T{n} slot carry a\n * confidence dot; instances beyond that (the very capability this\n * function exists for) simply render with no confidence, same limitation\n * buildFileFieldTables already has today for anything past T6.\n */\nfunction buildInstanceTable(\n groupName: string,\n baseNames: string[],\n groupDisplayName: string,\n instanceRows: InstanceRow[],\n fieldProvenance?: Record<string, IhsFieldProvenance>\n): FileFieldTableData | null {\n const columnGroups = groupColumnsByInstance(baseNames, instanceRows)\n const instanceLabels = instanceColumnLabels(instanceRows)\n\n const items: FileFieldTableItem[] = []\n for (const [baseName, labelMap] of Object.entries(columnGroups)) {\n const hasAny = Object.values(labelMap).some((v) => v !== null && v !== undefined && v !== '')\n if (!hasAny) continue\n\n const numeric = isNumericField(baseName)\n const data: Record<string, unknown> = {}\n const formattedData: Record<string, string> = {}\n const confidence: Record<string, number> = {}\n const provenance: Record<string, IhsFieldProvenance> = {}\n\n for (const [i, row] of instanceRows.entries()) {\n const label = instanceLabels[i]\n const value = labelMap[label] ?? null\n data[label] = value\n formattedData[label] = formatValue(value, numeric)\n\n const legacyKey = row.timePeriod ? `${baseName}${row.timePeriod}` : undefined\n const prov = legacyKey ? fieldProvenance?.[legacyKey] : undefined\n if (prov) {\n provenance[label] = prov\n if (\n prov.origin === 'extracted' &&\n typeof prov.confidence === 'number' &&\n !Number.isNaN(prov.confidence)\n ) {\n confidence[label] = prov.confidence\n }\n }\n }\n\n items.push({\n displayName: getDisplayName(baseName),\n timePeriods: instanceLabels,\n data,\n formattedData,\n type: FileFieldTableType.TIME_SERIES,\n isNumeric: numeric,\n ...(Object.keys(confidence).length ? { confidence } : {}),\n ...(Object.keys(provenance).length ? { provenance } : {}),\n })\n }\n\n const hasData = items.some((item) =>\n Object.values(item.data).some((v) => v !== null && v !== undefined && v !== '')\n )\n if (!items.length || !hasData) return null\n\n return {\n name: groupName,\n displayName: groupDisplayName,\n type: FileFieldTableType.TIME_SERIES,\n items,\n hasData,\n }\n}\n\n/**\n * Explicit base-column declaration for a category with NO catalog `file`\n * spec -- e.g. invoice (SYS-2842 Phase 3), which was deliberately never\n * registered in form-field-base-specs.json because getDocumentTypeGroups()\n * is shared with resolveExtractionStatus, which assumes a category's wide-\n * table columns exist to check \"is this populated\" against -- invoice has\n * none (sibling-table only, no wideTableMirror). Registering it there would\n * silently break resolveExtractionStatus's invoice status reporting. This\n * override lets a category be instance-rendered without entering that\n * shared registry at all.\n */\nexport interface CategorySpec {\n displayName: string\n baseColumnNames: string[]\n}\n\nexport function buildFileFieldTablesFromInstances(\n instancesByCategory: Record<string, InstanceRow[]> = {},\n fieldProvenance?: Record<string, IhsFieldProvenance>,\n categoryOverrides?: Record<string, CategorySpec>\n): Record<string, FileFieldTableData> {\n const specs = getBaseFieldSpecs()\n const fileFields = specs.filter((f) => f.type === 'file' && f.ihs_column_names?.length)\n const grouped = groupFieldsByPattern(fileFields)\n\n const tables: Record<string, FileFieldTableData> = {}\n\n for (const [groupName, fields] of Object.entries(grouped)) {\n const instanceRows = instancesByCategory[groupName]\n if (!instanceRows?.length) continue\n\n const baseNames = new Set<string>()\n for (const field of fields) {\n for (const col of field.ihs_column_names ?? []) {\n baseNames.add(col.replace(TIME_PERIOD_REGEX, ''))\n }\n }\n const groupDisplayName =\n getGroupDisplayNames()[groupName] || fields[0]?.displayName || getDisplayName(groupName)\n\n const table = buildInstanceTable(\n groupName, [...baseNames], groupDisplayName, instanceRows, fieldProvenance\n )\n if (table) tables[groupName] = table\n }\n\n for (const [groupName, spec] of Object.entries(categoryOverrides ?? {})) {\n if (Object.prototype.hasOwnProperty.call(tables, groupName)) continue // catalog-derived takes precedence\n const instanceRows = instancesByCategory[groupName]\n if (!instanceRows?.length) continue\n\n const table = buildInstanceTable(\n groupName, spec.baseColumnNames, spec.displayName, instanceRows, fieldProvenance\n )\n if (table) tables[groupName] = table\n }\n\n return tables\n}\n\n// ── Documents table (SYS-2766) ─────────────────────────────────\n//\n// Presentation-agnostic model of the per-document table on the IHS detail page.\n// Absorbs the doc-type maps/rules FinHub used to own inline so FinHub and\n// finsys-client render the SAME table. Pure transform: file metadata is attached\n// upstream by finsys-api (the `documentMetadata` sibling map, SYS-2765).\n\n/** IHS doc-field key → human label. Its keys drive which fields become sections. */\nconst DOC_DISPLAY_NAMES: Record<string, string> = {\n bankStatements: 'Bank Statements',\n financialStatements: 'Financial Statements',\n form9: 'Form 9',\n epfStatements: 'EPF Statements',\n payslips: 'Payslips',\n ssm: 'SSM Company Profile',\n ic: 'Identity Card',\n ssm_registration_documents: 'Form 9',\n ic_documents: 'Identity Documents (Supplementary)',\n consentForm: 'Consent Form',\n supplementaryDoc: 'Supplementary Documents',\n coreIncomeDoc: 'Core Income Document',\n incomeSupportingDoc: 'Income Supporting Document',\n incomeEPF_iakaun: 'EPF i-Akaun',\n photocopyRegistrationCard: 'Registration Card',\n bankStatementOrSavingPassbook: 'Bank Passbook',\n tnbBills: 'TNB Bills',\n}\n\n/** Doc types finsys-api can run extraction on (→ re-extract / view-JSON eligible). */\nconst EXTRACTABLE_DOC_TYPES = new Set<string>([\n 'bankStatements',\n 'financialStatements',\n 'form9',\n 'epfStatements',\n 'payslips',\n 'ssm',\n 'ic',\n 'ssm_registration_documents',\n 'ic_documents',\n])\n\n/** Doc types that accept a replacement upload (SYS-2229 — finsys-api ignores the rest). */\nconst REUPLOADABLE_DOC_TYPES = new Set<string>(['bankStatements', 'financialStatements'])\n\n/** IHS doc-field key → human label (the fields that become document sections). */\nexport function getDocDisplayNames(): Record<string, string> {\n return DOC_DISPLAY_NAMES\n}\n\n/** Doc types eligible for extraction (re-extract / view-JSON). */\nexport function getExtractableDocTypes(): Set<string> {\n return EXTRACTABLE_DOC_TYPES\n}\n\n/** Doc types eligible for a replacement upload. */\nexport function getReuploadableDocTypes(): Set<string> {\n return REUPLOADABLE_DOC_TYPES\n}\n\n/** Heuristic: does a string look like an opaque id (UUID / long hex), not a real name? */\nfunction isProbablyId(str?: string | null): boolean {\n if (!str) return false\n const clean = str.split('.')[0] // ignore extension\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(clean)) return true\n if (/^[0-9a-f]{32,128}$/i.test(clean)) return true\n return false\n}\n\ninterface ParsedDocFile {\n path?: string\n fileName?: string\n documentId?: string\n fileSize?: number | string\n fileType?: string\n createdAt?: string\n month?: number\n year?: number\n}\n\n/**\n * Parse one IHS doc field into file entries. Handles the shapes the field takes:\n * a JSON-array string (bank/financial/…, possibly inline-enriched like\n * supplementaryDoc), an already-parsed array, or a bare URL string (ssm/form9/ic).\n */\nexport function parseFileField(value: unknown): ParsedDocFile[] {\n if (!value) return []\n if (Array.isArray(value)) return value as ParsedDocFile[]\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? (parsed as ParsedDocFile[]) : []\n } catch {\n // Plain URL string (form9, ssm, ic) — wrap as a single entry.\n if (value.startsWith('http')) {\n return [{ path: value, documentId: value.split('/').pop() || undefined }]\n }\n return []\n }\n }\n return []\n}\n\nfunction toBytes(value: unknown): number | null {\n if (typeof value === 'number') return Number.isNaN(value) ? null : value\n if (typeof value === 'string') {\n const n = parseInt(value, 10)\n return Number.isNaN(n) ? null : n\n }\n return null\n}\n\n/**\n * Build the presentation-agnostic document rows for an IHS. Reads the doc fields\n * named in DOC_DISPLAY_NAMES + the `documentMetadata` sibling map (SYS-2765) and\n * emits a flat DocumentRow[] (all sections, in DOC_DISPLAY_NAMES order). Metadata\n * is taken inline off the entry first (supplementaryDoc is enriched inline), then\n * from `documentMetadata[path]`.\n */\nexport function buildDocumentRows(ihsData: Record<string, unknown>): DocumentRow[] {\n const metaMap = (ihsData.documentMetadata ?? {}) as Record<string, DocumentFileMetadata>\n const rows: DocumentRow[] = []\n\n for (const docType of Object.keys(DOC_DISPLAY_NAMES)) {\n const files = parseFileField(ihsData[docType])\n if (files.length === 0) continue\n\n const label = DOC_DISPLAY_NAMES[docType]\n const extractable = EXTRACTABLE_DOC_TYPES.has(docType)\n const reUploadable = extractable && REUPLOADABLE_DOC_TYPES.has(docType)\n\n files.forEach((file, index) => {\n const path = file.path ?? null\n const meta = path ? metaMap[path] : undefined\n\n const documentId = file.documentId || (path ? path.split('/').pop() || null : null)\n const timePeriod = file.month ? `T${file.month}` : file.year ? `T${file.year}` : 'ALL'\n\n const rawName = file.fileName ?? meta?.fileName ?? undefined\n const fileName = rawName && !isProbablyId(rawName) ? rawName : null\n\n const rawExt = (rawName ?? '').split('.').pop()\n const ext =\n rawExt && rawExt.length <= 5 && !isProbablyId(rawExt) ? rawExt.toUpperCase() : null\n const mime = file.fileType ?? meta?.fileType\n const fileType = ext || (mime?.split('/').pop()?.toUpperCase() ?? null)\n\n const fileSize = toBytes(file.fileSize) ?? meta?.fileSize ?? null\n const uploadedAt = file.createdAt ?? meta?.createdAt ?? null\n\n const periodLabel =\n file.month && file.year\n ? new Date(file.year, file.month - 1).toLocaleDateString('en-MY', {\n year: 'numeric',\n month: 'short',\n })\n : file.year\n ? `Year ${file.year}`\n : null\n\n const displayName =\n fileName ||\n (periodLabel\n ? `${label} — ${periodLabel}`\n : files.length > 1\n ? `${label} ${index + 1}`\n : label)\n\n rows.push({\n docType,\n label,\n index,\n displayName,\n documentId,\n path,\n timePeriod,\n periodLabel,\n fileName,\n fileType,\n fileSize,\n uploadedAt,\n capabilities: {\n download: !!documentId,\n viewJson: extractable,\n reExtract: extractable,\n reUpload: reUploadable,\n },\n })\n })\n }\n\n return rows\n}\n\n// ── Documents-table cell formatters (empty-state rules live here) ──\n// Single source for the Type / Size / Uploaded strings so FinHub + finsys-client\n// render identical cells (em-dash on unknown).\n\nconst EM_DASH = '—'\n\n/** Type column: the resolved type label, or em-dash. */\nexport function formatDocumentType(row: Pick<DocumentRow, 'fileType'>): string {\n return row.fileType ?? EM_DASH\n}\n\n/** Size column: human bytes (B / KB / MB), or em-dash when unknown. */\nexport function formatDocumentSize(bytes: number | null | undefined): string {\n if (!bytes || Number.isNaN(bytes)) return EM_DASH\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\n/** Uploaded column: the upload date, else the period label, else em-dash. */\nexport function formatDocumentUploaded(\n row: Pick<DocumentRow, 'uploadedAt' | 'periodLabel'>\n): string {\n if (row.uploadedAt) {\n const d = new Date(row.uploadedAt)\n if (!Number.isNaN(d.getTime())) {\n return d.toLocaleDateString('en-MY', { year: 'numeric', month: 'short', day: 'numeric' })\n }\n }\n return row.periodLabel ?? EM_DASH\n}\n\n// ── IHS detail processing ──────────────────────────────────────\n\nfunction isFileOrFinancialColumn(fieldName: string, fileColumnSet: Set<string>): boolean {\n return (\n fileColumnSet.has(fieldName) ||\n fieldName.startsWith('financials') ||\n fieldName.startsWith('bank_statement')\n )\n}\n\n\nfunction inferValueFormat(fieldName: string, value: unknown): IhsValueFormat {\n const currencyFields = new Set([\n 'totalFinancing',\n 'monthlyGrossIncome',\n 'approvedAmount',\n 'monthlyInstallment',\n ])\n if (currencyFields.has(fieldName)) return IhsValueFormat.CURRENCY\n\n const numberFields = new Set([\n 'age',\n 'noOfDependants',\n 'financingTenure',\n 'ihsId',\n 'programId',\n 'borrowerAgentId',\n ])\n if (numberFields.has(fieldName)) return IhsValueFormat.NUMBER\n\n const tableFields = new Set(['shareholders', 'directors', 'previousDirectors'])\n if (tableFields.has(fieldName)) return IhsValueFormat.TABLE\n\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) return IhsValueFormat.DATE\n\n return IhsValueFormat.STRING\n}\n\nconst EXCLUDED_FIELDS = new Set([\n 'updatedAt',\n 'programIds',\n 'borrowerAgentId',\n 'programId',\n '__v',\n '_id',\n 'id',\n])\n\nexport function processIhsDetails(ihsData: Record<string, unknown>): IhsFieldDetail[] {\n const specs = getBaseFieldSpecs()\n const fileColumnSet = new Set<string>()\n for (const field of specs) {\n if (field.type === 'file') {\n if (field.name) fileColumnSet.add(field.name)\n if (field.ihs_column_names) {\n for (const col of field.ihs_column_names) {\n fileColumnSet.add(col)\n }\n }\n }\n }\n\n const specMap = getBaseFieldSpecMap()\n const categories = getBaseCategories()\n const categoryNameMap: Record<string, string> = {}\n for (const cat of categories) {\n categoryNameMap[String(cat.id)] = cat.name\n }\n\n const details: IhsFieldDetail[] = []\n\n for (const [key, value] of Object.entries(ihsData)) {\n if (value === null || value === undefined || value === '' || value === 'Not Specified') continue\n if (value === false) continue\n if (EXCLUDED_FIELDS.has(key)) continue\n if (isFileOrFinancialColumn(key, fileColumnSet)) continue\n\n const spec = specMap.get(key)\n const categoryId = spec?.category ? String(spec.category) : '0'\n const category = categoryNameMap[categoryId] || 'General'\n\n details.push({\n name: key,\n displayName: getDisplayName(key),\n category,\n value,\n valueFormat: inferValueFormat(key, value),\n })\n }\n\n return details\n}\n\nexport function groupDetailsByCategory(details: IhsFieldDetail[]): IhsDetailCategory[] {\n const groups: Record<string, IhsFieldDetail[]> = {}\n for (const detail of details) {\n if (!groups[detail.category]) groups[detail.category] = []\n groups[detail.category].push(detail)\n }\n\n return Object.entries(groups)\n .filter(([cat]) => cat !== 'Default Category' && cat !== 'General')\n .map(([category, items]) => ({\n category,\n items: items.map((d) => ({\n name: d.name,\n displayName: d.displayName,\n value: d.value,\n valueFormat: d.valueFormat,\n })),\n }))\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Program access roles — shared across finsys-api and finhub-adonisjs.\n * Values must match the database enum column in the `programaccess` table.\n */\nexport enum Role {\n ADMIN = 'Admin',\n BORROWER_AGENT = 'Borrower Agent',\n LENDER_AGENT = 'Lender Agent',\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Status of a document extraction job.\n * Used by finsys-api (writes) and finhub/finsys-client (reads/displays).\n */\nexport enum ExtractionJobStatus {\n Queued = 'queued',\n Processing = 'processing',\n Succeeded = 'succeeded',\n Failed = 'failed',\n}\n\n/**\n * Document types that go through FinXtract extraction. Values must match\n * the `type` field on finsys-api's File entity and the config keys in\n * finXtractApi.api.\n *\n * Was a closed enum (FinancialStatement/BankStatement/Epf/Payslip/Ssm/\n * Form9/Ic) requiring a core release to add a new document type, even\n * though nothing outside finsys-api's own request validation actually\n * needed it to be a closed set (confirmed: zero external consumers\n * import a specific member by name). Now an open string, matching the\n * AdapterCategory precedent (SYS-2500) -- the authoritative set of valid\n * values lives in document-types.ts, derived from the field-spec catalog.\n * Use isDocumentType()/assertDocumentType() from document-types.ts for\n * the runtime validation that used to be the enum's job.\n */\nexport type ExtractionFileType = string\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * IHS application status — canonical source of truth, mirroring finsys-api's\n * `IHS_STATUS` enum and `allowedIhsStatus` list in src/utils/appHelper.ts.\n *\n * finsys-api originates these values (it writes them to the `ihs.status`\n * column). Consumer apps (finhub-adonisjs, finsys-client) read them off the\n * wire and use them for validation and display.\n *\n * Lender rejection is not represented by a distinct status: when a lender\n * rejects an application, finsys-api transitions the record back to\n * `APPLICATION_FINALIZED` from `LENDER_EVALUATION`.\n *\n * `EditingApplication` (SYS-2806) is a lender-scoped detour off\n * `LenderEvaluation` for manually editing extracted field values — not\n * reachable from `ApplicationFinalized`. A lender toggles into it and back\n * out to `LenderEvaluation`; it never appears on a record no lender has\n * claimed. See finsys-api's `updateIhsStatusByLender` for the transition\n * guard.\n */\nexport enum IhsStatus {\n CreatingApplication = 'CREATING_APPLICATION',\n ApplicationFinalized = 'APPLICATION_FINALIZED',\n LenderEvaluation = 'LENDER_EVALUATION',\n EditingApplication = 'EDITING_APPLICATION',\n Approved = 'APPROVED',\n LouDelivered = 'LOU_DELIVERED',\n AwaitingDisbursement = 'AWAITING_DISBURSEMENT',\n Disbursement = 'DISBURSEMENT',\n Declined = 'DECLINED',\n Expired = 'EXPIRED',\n Canceled = 'CANCELED',\n}\n\n/**\n * All valid IHS status values, in display order (earliest lifecycle stage\n * first, terminal states last).\n */\nexport const IHS_VALID_STATUSES: readonly IhsStatus[] = [\n IhsStatus.CreatingApplication,\n IhsStatus.ApplicationFinalized,\n IhsStatus.LenderEvaluation,\n IhsStatus.EditingApplication,\n IhsStatus.Approved,\n IhsStatus.LouDelivered,\n IhsStatus.AwaitingDisbursement,\n IhsStatus.Disbursement,\n IhsStatus.Declined,\n IhsStatus.Expired,\n IhsStatus.Canceled,\n] as const\n\n/**\n * Terminal statuses — the application lifecycle has completed and no further\n * transitions are expected. Useful for suppressing action UI (e.g. re-extract,\n * status update controls) on the application detail view.\n */\nexport const IHS_TERMINAL_STATUSES: readonly IhsStatus[] = [\n IhsStatus.Disbursement,\n IhsStatus.Declined,\n IhsStatus.Expired,\n IhsStatus.Canceled,\n] as const\n\n/**\n * Failure statuses — a subset of terminal statuses that represent an\n * unsuccessful outcome. Useful for badge colour / messaging.\n */\nexport const IHS_FAILURE_STATUSES: readonly IhsStatus[] = [\n IhsStatus.Declined,\n IhsStatus.Expired,\n IhsStatus.Canceled,\n] as const\n\n/**\n * Type guard: narrows an unknown value to `IhsStatus` iff it is one of the\n * canonical status strings.\n */\nexport function isValidIhsStatus(status: unknown): status is IhsStatus {\n return (\n typeof status === 'string' &&\n (IHS_VALID_STATUSES as readonly string[]).includes(status)\n )\n}\n\n/**\n * Type guard: terminal (no further transitions expected).\n */\nexport function isTerminalIhsStatus(status: unknown): status is IhsStatus {\n return (\n typeof status === 'string' &&\n (IHS_TERMINAL_STATUSES as readonly string[]).includes(status)\n )\n}\n\n/**\n * Type guard: terminal and unsuccessful.\n */\nexport function isFailureIhsStatus(status: unknown): status is IhsStatus {\n return (\n typeof status === 'string' &&\n (IHS_FAILURE_STATUSES as readonly string[]).includes(status)\n )\n}\n","/*\n * Extraction status resolution.\n *\n * Determines per-document extraction status from IHS record data\n * and optional extraction job records. Pure synchronous function —\n * no HTTP, no async, trivially testable.\n *\n * For multi-file document types (bank statements, financial statements,\n * EPF, payslips), produces one result per time period (T1, T2, …).\n * For single-file types (SSM, Form 9, IC), produces one result.\n */\n\nimport { ExtractionFileType, ExtractionJobStatus } from './extraction.js'\nimport { getDocumentTypeGroups } from './document-types.js'\nimport type { FieldData } from './survey-generator.js'\n\n// ── Types ──────────────────────────────────────────────────\n\nexport enum DocExtractionStatus {\n NotUploaded = 'not_uploaded',\n Uploaded = 'uploaded',\n Queued = 'queued',\n Processing = 'processing',\n Extracted = 'extracted',\n Failed = 'failed',\n Unknown = 'unknown',\n}\n\nexport interface ExtractionJobRecord {\n fileType: string\n status: string\n errorMessage?: string | null\n}\n\nexport interface DocExtractionResult {\n fileType: ExtractionFileType\n status: DocExtractionStatus\n displayName: string\n populatedColumns: string[]\n totalColumns: number\n errorMessage?: string | null\n}\n\nexport interface ExtractionStatusResult {\n documents: DocExtractionResult[]\n summary: {\n total: number\n extracted: number\n failed: number\n pending: number\n notUploaded: number\n }\n}\n\n// ── Helpers ────────────────────────────────────────────────\n\nfunction isPopulated(value: unknown): boolean {\n if (value === null || value === undefined || value === '') return false\n if (value === 'Not Specified') return false\n return true\n}\n\nfunction countUploadedFiles(ihsRecord: Record<string, unknown>, aggregateKey: string): number {\n const raw = ihsRecord[aggregateKey]\n if (!raw) return 0\n\n // JSON array string (multi-file types like bankStatements)\n if (typeof raw === 'string') {\n try {\n const parsed = JSON.parse(raw)\n if (Array.isArray(parsed)) return parsed.length\n } catch {\n // Plain URL string (single-file type) — count as 1\n return 1\n }\n }\n\n if (Array.isArray(raw)) return raw.length\n\n // Single object or URL string\n return 1\n}\n\nfunction hasUploadedFile(\n fields: FieldData[],\n ihsRecord: Record<string, unknown>,\n aggregateKey: string\n): boolean {\n if (countUploadedFiles(ihsRecord, aggregateKey) > 0) return true\n\n // Fall back to individual field names for single-file types (ssm, form9, ic)\n return fields.some((field) => {\n if (!field.name) return false\n return isPopulated(ihsRecord[field.name])\n })\n}\n\nfunction getPopulatedColumns(\n columns: string[],\n ihsRecord: Record<string, unknown>\n): string[] {\n return columns.filter((col) => isPopulated(ihsRecord[col]))\n}\n\n/**\n * Resolve status for a single document (one field / one time period).\n */\nfunction resolveDocStatus(\n columns: string[],\n ihsRecord: Record<string, unknown>,\n uploaded: boolean,\n jobRecord: ExtractionJobRecord | undefined,\n hasJobRecords: boolean\n): { status: DocExtractionStatus; errorMessage?: string | null } {\n const populated = getPopulatedColumns(columns, ihsRecord)\n const hasExtractedData = populated.length > 0\n\n let status: DocExtractionStatus\n let errorMessage: string | null | undefined\n\n if (!uploaded) {\n status = DocExtractionStatus.NotUploaded\n } else if (hasJobRecords) {\n if (jobRecord) {\n if (jobRecord.status === ExtractionJobStatus.Queued) {\n status = DocExtractionStatus.Queued\n } else if (jobRecord.status === ExtractionJobStatus.Processing) {\n status = DocExtractionStatus.Processing\n } else if (jobRecord.status === ExtractionJobStatus.Failed) {\n if (hasExtractedData) {\n status = DocExtractionStatus.Extracted\n errorMessage = jobRecord.errorMessage\n } else {\n status = DocExtractionStatus.Failed\n errorMessage = jobRecord.errorMessage\n }\n } else if (jobRecord.status === ExtractionJobStatus.Succeeded || hasExtractedData) {\n status = DocExtractionStatus.Extracted\n } else {\n status = DocExtractionStatus.Uploaded\n }\n } else if (hasExtractedData) {\n status = DocExtractionStatus.Extracted\n } else {\n status = DocExtractionStatus.Uploaded\n }\n } else if (hasExtractedData) {\n status = DocExtractionStatus.Extracted\n } else {\n status = DocExtractionStatus.Unknown\n }\n\n return { status, errorMessage }\n}\n\n// ── Main function ──────────────────────────────────────────\n\n/**\n * Determines per-document extraction status from IHS record data.\n *\n * For multi-file document types (bank statements, financial statements, EPF,\n * payslips) the result contains one entry per uploaded file, indexed in the\n * same order as the files appear in the IHS record's aggregate array.\n * For single-file types (SSM, Form 9, IC) there is one entry.\n *\n * @param ihsRecord - The IHS application record (any shape satisfying Record<string, unknown>)\n * @param jobRecords - Extraction job records for this IHS. Pass the array (even if empty)\n * when job records were fetched. Omit or pass undefined when job records are unavailable;\n * this produces `Unknown` status for uploaded-but-unextracted documents rather than `Uploaded`.\n */\nexport function resolveExtractionStatus(\n ihsRecord: Record<string, unknown>,\n jobRecords?: ExtractionJobRecord[]\n): ExtractionStatusResult {\n const documents: DocExtractionResult[] = []\n const hasJobRecords = jobRecords !== undefined\n\n for (const group of getDocumentTypeGroups()) {\n const fileType = group.documentType\n const fields = group.fields\n const displayName = group.label\n\n const uploadedCount = countUploadedFiles(ihsRecord, fileType)\n const isUploaded = uploadedCount > 0 || fields.some((f) => f.name && isPopulated(ihsRecord[f.name]))\n\n // For multi-file types, match job records by fileType (there can be multiple)\n const matchingJobs = jobRecords?.filter((j) => j.fileType === fileType) ?? []\n\n if (fields.length <= 1) {\n // Single-file type (ssm, form9, ic): one result\n const field = fields[0]\n const columns = field?.ihs_column_names ?? []\n const populated = getPopulatedColumns(columns, ihsRecord)\n const { status, errorMessage } = resolveDocStatus(\n columns, ihsRecord, isUploaded, matchingJobs[0], hasJobRecords\n )\n\n documents.push({\n fileType,\n status,\n displayName,\n populatedColumns: populated,\n totalColumns: columns.length,\n errorMessage,\n })\n } else {\n // Multi-file type (bank statements T1-T6, etc.): one result per uploaded file.\n // Fields are sorted by name (bank_statement_t1, t2, …) so idx aligns with\n // the file array order in the IHS record.\n const count = Math.max(uploadedCount, 1)\n for (let idx = 0; idx < count; idx++) {\n const field = fields[idx]\n const columns = field?.ihs_column_names ?? []\n const populated = getPopulatedColumns(columns, ihsRecord)\n const fileUploaded = idx < uploadedCount\n const { status, errorMessage } = resolveDocStatus(\n columns, ihsRecord, fileUploaded, matchingJobs[idx], hasJobRecords\n )\n\n documents.push({\n fileType,\n status,\n displayName,\n populatedColumns: populated,\n totalColumns: columns.length,\n errorMessage,\n })\n }\n }\n }\n\n const summary = documents.reduce(\n (acc, d) => {\n if (d.status === DocExtractionStatus.Extracted) acc.extracted++\n else if (d.status === DocExtractionStatus.Failed) acc.failed++\n else if (d.status === DocExtractionStatus.NotUploaded) acc.notUploaded++\n else acc.pending++\n return acc\n },\n { total: documents.length, extracted: 0, failed: 0, pending: 0, notUploaded: 0 }\n )\n\n return { documents, summary }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Source Adapter contract — the framework for ingesting unstructured\n * or partner-specific inputs and producing canonical field values that\n * the eval engine + CRA report consume.\n *\n * The contract has no vendor-specific knowledge. Generic categories\n * (telco-carrier, payment-network, document-extractor, social-presence,\n * …) are declared here; specific vendor implementations live OUTSIDE\n * this open-source package, in private extension directories loaded\n * by the host app at runtime (see SYS-2444 plugin discovery).\n *\n * Design notes:\n * - extract() is async — every real adapter does I/O (HTTP, OCR, LLM).\n * - Errors are thrown as `AdapterError` instances. We DELIBERATELY\n * don't use a Result<> type — the rest of finsys-core uses throw/\n * catch, and bringing a Result idiom in for one subsystem creates\n * dialect inconsistency.\n * - The contract makes no statement about persistence. The host app's\n * adapter runner catches the return value, persists canonical fields\n * + raw payload to the storage tables (SYS-2441), and writes\n * provenance to `ihs_extraction_runs`. Adapters are pure functions\n * of (raw payload) → (canonical fields). This separation lets\n * adapters be swapped, replayed, and tested without DB state.\n */\n\nimport type { AdapterCategory, CanonicalFieldName } from \"./adapter-categories.js\";\n\n/**\n * An adapter receives a raw payload — opaque to the framework. The\n * shape is whatever the vendor's source produces: a JSON object from a\n * partner API, a base64 PDF blob, a web-scrape result. Vendor adapters\n * narrow this type internally. The host app's adapter runner is\n * responsible for putting the bytes/structure in front of the adapter;\n * what those bytes are is the adapter's problem.\n */\nexport type RawPayload = unknown;\n\n/**\n * Canonical field values produced by an adapter for ONE instance.\n * Keys MUST be drawn from the field set declared by the adapter's\n * category (see `categoryFieldsOf` in adapter-categories.ts). Values\n * are typed narrowly per field by the category schema; this loose TS\n * type is runtime-validated against the category schema by the host\n * app at registration time, AND at every extract() call result.\n *\n * The framework rejects:\n * - Field names not declared by the adapter's category\n * - Values whose runtime type doesn't match the category schema\n *\n * Adapters MAY return a partial set — not every category field has to\n * be produced on every applicant (telco fields may be absent if the\n * borrower didn't opt in, for instance). Missing fields are aggregated\n * as zero / null in the eval engine; that's a feature, not a defect.\n */\nexport type CanonicalFieldValues = Partial<Record<CanonicalFieldName, CanonicalFieldValue>>;\n\n/**\n * One extraction \"instance\" — the framework supports multi-instance\n * per applicant per adapter. Examples:\n * - 6 bank statements from one bank (one adapter call, 6 instances)\n * - 12 monthly payment-summary snapshots from one payment network\n * - 3 mobile lines from one telco carrier\n *\n * For multi-VENDOR cases (3 different telco carriers), use separate\n * adapter registrations — each vendor is its own SourceAdapter with\n * its own id. For multi-INSTANCE-from-one-vendor (6 statements from\n * one bank), the adapter returns multiple AdapterExtraction entries\n * in a single extract() call.\n *\n * `instanceKey` is the within-adapter discriminator: free-form, but\n * MUST be stable across re-extractions so the storage layer can\n * replace-in-place rather than accumulating duplicates. Conventions:\n * - For periodic data: encode the period (`'2026-Q1'`, `'2026-03'`)\n * - For per-line data: encode the line id (`'msisdn-60123456789'`,\n * `'card-last4-1234'`)\n * - For natively single-instance adapters: use the empty string `''`\n * (the framework treats `''` as \"this adapter only ever has one\n * instance per applicant\").\n */\nexport interface AdapterExtraction {\n /**\n * Stable within-adapter instance discriminator. Empty string for\n * adapters that only ever produce one instance per applicant.\n */\n readonly instanceKey: string;\n\n /**\n * The canonical field values for this instance.\n */\n readonly values: CanonicalFieldValues;\n}\n\n/**\n * Allowed value shapes for canonical fields. Per-field type narrowing\n * happens at the category schema level — telcoOnTimePaymentRatio24m is\n * a number 0..1; telcoHandsetFinancingActive is a boolean; etc.\n * Numbers + booleans + strings cover everything we expect from credit\n * signals; nested objects are intentionally excluded to keep canonical\n * fields atomic + queryable.\n */\nexport type CanonicalFieldValue = number | string | boolean | null;\n\n/**\n * The interface every adapter implements. Adapters are loaded by the\n * host app's discovery mechanism (SYS-2444); the host app constructs\n * the adapter from its manifest + extract module, then registers it\n * against the registry by `id`.\n *\n * Type parameter `E` lets adapter authors declare the partner-specific\n * extension shape on ApplicantIdentity. v2.7.0+ — defaults to `{}` so\n * v2.6.0 adapters (which didn't have fetch and never read identity)\n * stay assignment-compatible. A telco adapter that needs an MSISDN\n * declares it once at the interface level:\n *\n * interface CelcomExt { msisdn: string }\n * const celcomTelco: SourceAdapter<CelcomExt> = {\n * async fetch(identity) {\n * identity.msisdn // string (typed via E)\n * identity.ic // string (core)\n * },\n * ...\n * }\n *\n * The generic flows from interface → method, so implementations\n * don't have to redeclare it on fetch.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface SourceAdapter<E extends Record<string, unknown> = {}> {\n /**\n * Globally unique id for this adapter instance. By convention:\n * `<vendor>-<category-short>-v<n>` — e.g. `celcom-telco-v1`. Vendor\n * names appear here in deployment-specific code, NEVER in\n * finsys-core. The id is what the registry uses to dedupe + what\n * provenance records pin to.\n */\n readonly id: string;\n\n /**\n * Which generic category this adapter implements. Determines which\n * canonical fields the adapter MAY produce + how its output is\n * persisted (each category has its own canonical sibling table —\n * `ihs_alt_data_telco`, `ihs_alt_data_payments`, etc.).\n */\n readonly category: AdapterCategory;\n\n /**\n * Monotonic version per adapter. Bumped whenever the adapter's\n * payload shape, field-mapping logic, or output semantics change.\n * Versions are stored alongside each extraction run for replay /\n * audit; the framework allows multiple versions of the same adapter\n * to coexist in the registry (deployment-controlled).\n */\n readonly version: number;\n\n /**\n * Subset of the adapter's category fields that this adapter promises\n * to produce. Used by the host app at boot to log adapter capability\n * + by the CRA report to render \"provided by adapter X\" badges.\n * MUST be a subset of `categoryFieldsOf(category)`; the host app\n * validates this at registration time and refuses to load adapters\n * that promise fields outside their category.\n */\n readonly produces: ReadonlyArray<CanonicalFieldName>;\n\n /**\n * Transform a raw payload into canonical field values. The host app\n * calls this once per applicant per adapter, passes the result to\n * the persistence layer (one row per AdapterExtraction in the\n * canonical sibling table), and writes provenance.\n *\n * The return is ALWAYS a list, even when the adapter produces only\n * one instance per applicant — return a one-element array in that\n * case with `instanceKey: ''`. The list shape exists to support\n * inherently multi-instance sources (6 bank statements, 12 monthly\n * payment snapshots, 3 mobile lines) without forcing adapters to\n * batch their own calls.\n *\n * Throw `AdapterError` for any failure path — network timeout,\n * schema mismatch, partner API rate limit, malformed payload. The\n * host's adapter runner catches AdapterError + records the failure\n * on `ihs_extraction_runs` so the operator sees what happened\n * without losing the applicant.\n *\n * Adapters MUST NOT throw plain `Error` or unknown types — the\n * runner will treat those as adapter implementation bugs and surface\n * them to logs separately. Stick to AdapterError for the\n * expected-failure path.\n */\n extract(raw: RawPayload): Promise<AdapterExtraction[]>;\n\n /**\n * Optional partner-data fetch path. v2.7.0+ — adapters that own their\n * partner-API integration declare this method; the host invokes it\n * before extract() and passes the result through. Adapters that\n * receive raw payload from elsewhere (e.g., bank-statement adapters\n * reading FinXtract OCR output, or webhook-driven push ingest) omit\n * fetch() entirely and the host treats raw as already-staged.\n *\n * The host builds `identity` from the IHS row (ic, fullName, etc.)\n * plus any partner-specific fields the adapter declared via the\n * manifest's `requiredIdentityFields`. If a required field is missing\n * from the IHS, the host logs + skips this adapter for the run\n * (no extract call, no canonical rows).\n *\n * Implementations should:\n * - Throw AdapterError('source_unavailable') ONLY on transient,\n * retryable upstream failures (timeouts, 5xx, rate limits). The\n * host runner is free to retry these; misclassifying a permanent\n * failure here will burn retry budget for nothing.\n * - Throw AdapterError('not_applicable') on permanent\n * no-relationship signals — 404 (\"applicant unknown to partner\"),\n * 410, an explicit \"not a subscriber\" response. Communicates\n * 'we asked and they said no' so the host records the run + skips\n * retry. This is the correct reason for most non-retryable\n * upstream conditions.\n * - Throw AdapterError('payload_invalid') if the partner returned\n * a malformed response (200 with garbage body, schema violation).\n * - Return a RawPayload that extract() will translate. The same\n * adapter's extract() is the only consumer; the host doesn't\n * inspect the shape.\n *\n * Strict additive — v2.6.0 read-only adapters that omit fetch()\n * keep working without change.\n *\n * @example WRONG — recurses into the adapter method:\n * ```ts\n * const adapter: SourceAdapter = {\n * async fetch(identity) {\n * const res = await fetch(`/api/lookup/${identity.ic}`) // infinite recursion\n * return res.json()\n * },\n * ...\n * }\n * ```\n *\n * @example RIGHT — explicit globalThis access:\n * ```ts\n * const adapter: SourceAdapter = {\n * async fetch(identity) {\n * const res = await globalThis.fetch(`/api/lookup/${identity.ic}`)\n * return res.json()\n * },\n * ...\n * }\n * ```\n *\n * Implementation note: this method is named `fetch` which shadows\n * the global `fetch()` inside the method body — see the @example\n * blocks above. The fake-* reference adapters in\n * @finsys/adapter-toolkit use the explicit-globalThis pattern.\n * Partner repos can also pin this with the lint rule\n * `no-restricted-syntax`: `CallExpression[callee.name='fetch']`\n * inside any method literal named `fetch`.\n */\n fetch?(identity: ApplicantIdentity<E>): Promise<RawPayload>;\n}\n\n/**\n * Identity payload the host hands to fetch() so adapters can call\n * partner APIs with the right per-applicant identifiers.\n *\n * The shape is an intersection of three pieces:\n * - Core fields (`ihsId`, `ic`, `fullName`) — always present, the\n * host populates them from the IHS row before invoking fetch().\n * - Partner extensions (`E`) — typed declaratively per adapter.\n * Defaults to `{}` (no extra typed fields) for adapters that only\n * need the core trio.\n * - Open index signature (`[k: string]: unknown`) — catches any\n * ad-hoc field a host might pass through; reads land on `unknown`\n * so partners must validate before use.\n *\n * Narrowing example (the ergonomics win this type is designed to deliver):\n *\n * interface CelcomExt { msisdn: string; accountRef: string }\n *\n * // declare adapter with the extension shape baked in:\n * const celcom: SourceAdapter<CelcomExt> = {\n * async fetch(identity) {\n * identity.ic // string\n * identity.msisdn // string (NOT unknown — narrowed by E)\n * identity.foo // unknown (falls through to index signature)\n * // ...\n * },\n * // ...\n * }\n *\n * The intersection puts narrowed members at the root, so partners get\n * `identity.msisdn` (not `identity.extensions?.msisdn`) — matching the\n * pattern the host actually uses (it spreads partner-required fields\n * onto the root identity object, no nested 'extensions' envelope).\n *\n * Examples:\n * - Telco adapter declares `requiredIdentityFields: ['msisdn']`.\n * Identity arrives with msisdn populated; adapter calls partner API.\n * (Don't include 'ihsId', 'ic', or 'fullName' in\n * `requiredIdentityFields` — those are core fields. `ic` in\n * particular can be legitimately empty for non-MY scope, so\n * declaring it required would cause the host to skip every applicant.)\n * - Payment-network adapter declares `requiredIdentityFields:\n * ['businessRegistrationNumber']`. Adapter looks it up + calls.\n * - An adapter that only needs the IHS id declares no extra\n * fields; identity has just the core trio.\n */\nexport type ApplicantIdentity<\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n E extends Record<string, unknown> = {},\n> = {\n /** Internal IHS id — always present. */\n readonly ihsId: number;\n /** Malaysian IC (or analogous national id). May be empty for non-MY scope. */\n readonly ic: string;\n /** Applicant full legal name. */\n readonly fullName: string;\n} & E & {\n /** Catch-all for ad-hoc reads (typed `unknown` — validate before use). */\n readonly [key: string]: unknown;\n};\n\n/**\n * Typed error thrown by adapters on expected failure paths. The\n * `reason` discriminator lets the host app's adapter runner classify\n * failures (transient vs permanent, partner-side vs schema-side)\n * without parsing strings.\n */\nexport class AdapterError extends Error {\n public readonly reason: AdapterErrorReason;\n public readonly cause?: unknown;\n\n constructor(reason: AdapterErrorReason, message: string, cause?: unknown) {\n super(message);\n this.name = \"AdapterError\";\n this.reason = reason;\n this.cause = cause;\n }\n}\n\n/**\n * Discriminator for adapter failure modes. The runner uses this to\n * decide whether to retry, surface to the operator, or write off the\n * extraction run.\n *\n * payload_invalid — the raw payload didn't conform to the\n * adapter's expected source shape. Permanent;\n * re-running won't help. Likely a partner-side\n * schema change → bump adapter version.\n *\n * source_unavailable — the upstream source was unreachable or\n * returned a transient error (timeout, 5xx,\n * rate limit). Transient; safe to retry.\n *\n * mapping_failed — extraction logic raised a domain-specific\n * failure (e.g. value out of expected range).\n * Permanent for this payload; surface to the\n * operator.\n *\n * not_applicable — the applicant doesn't have data for this\n * adapter (e.g. no telco opt-in). Not a\n * failure per se — the runner records a\n * no-op extraction run, eval engine sees no\n * canonical fields, components score zero.\n */\nexport type AdapterErrorReason =\n | \"payload_invalid\"\n | \"source_unavailable\"\n | \"mapping_failed\"\n | \"not_applicable\";\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Aggregation operators applied by the eval engine when a scoring\n * component reads a canonical field that has multiple instances\n * persisted for the same applicant.\n *\n * Multi-instance is the framework's first-class shape — an adapter\n * may produce 6 bank-statement instances, 12 monthly payment\n * snapshots, 3 mobile lines, etc., per applicant. Eval components\n * must declare HOW they want those instances collapsed into a single\n * scoring value. This module declares the operator set + the runtime\n * helper that applies one to a value list.\n *\n * Consumer is the eval engine (today: finsys-client + FinSim sim-\n * runner; tomorrow: anywhere else evaluating against canonical\n * fields). finsys-core publishes the operator surface so policy\n * fixtures across all consumers reference the same set.\n *\n * v1 operator set, in order of expected use frequency:\n *\n * sum — total across instances. Bank balance sum across t1..tN.\n * mean — arithmetic mean. Average monthly payment volume.\n * latest — the instance with the most recent observed_at. Telco\n * snapshot when only the latest matters.\n * max — maximum value across instances. Worst-case suspension\n * count when multiple telco lines exist.\n * count — number of instances with a non-null value for this\n * field. Useful for \"how many bank statements does this\n * applicant have on file\" as a score input.\n */\n\nimport type { CanonicalFieldValue } from \"./adapter.js\";\n\nexport type AggregationOp = \"sum\" | \"mean\" | \"latest\" | \"max\" | \"count\";\n\n/** Every operator declared in this version of finsys-core. */\nexport const ALL_AGGREGATION_OPS: ReadonlyArray<AggregationOp> = [\n \"sum\",\n \"mean\",\n \"latest\",\n \"max\",\n \"count\",\n] as const;\n\n/**\n * One value contributed by one instance. The eval engine builds a\n * list of these (one per instance, in observed-at order — the\n * persistence layer is the source of truth on ordering) and passes\n * to applyAggregation.\n */\nexport interface InstanceValue {\n readonly value: CanonicalFieldValue;\n /**\n * The instance's observed-at timestamp. MUST be an ISO-8601 UTC\n * string (`Z`-suffixed, e.g. `2026-04-01T00:00:00Z`). The `latest`\n * operator compares these lexicographically, which is only\n * monotonic with wall-time when all timestamps share the UTC\n * offset — mixed offsets (e.g. `+08:00` vs `Z`) can yield\n * incorrect ordering. Other operators ignore this field; pass an\n * empty string if the operator in question doesn't need it.\n */\n readonly observedAt: string;\n}\n\n/**\n * Apply an aggregation operator to a list of instance values.\n *\n * Behaviour for empty + null-only lists:\n * - empty list → `null`\n * - all-null values → `null`\n * - `count` on either of the above → `0`\n *\n * Returns:\n * - `sum`, `mean`, `max`, `count` → `number | null`\n * - `latest` → matches the value type of the most-recent instance\n * (number / boolean / string / null)\n *\n * Throws on operators that don't apply to the value types present\n * (e.g. `sum` of booleans). Eval-policy authors are expected to pair\n * operators with appropriate field types; this is a guardrail against\n * silent garbage rather than an error-recovery mechanism.\n */\nexport function applyAggregation(\n op: AggregationOp,\n instances: ReadonlyArray<InstanceValue>,\n): CanonicalFieldValue {\n if (instances.length === 0) {\n return op === \"count\" ? 0 : null;\n }\n\n if (op === \"count\") {\n // Single-pass count of non-null/undefined values; avoids the\n // intermediate array filter().length would allocate.\n return instances.reduce(\n (acc, i) =>\n i.value !== null && i.value !== undefined ? acc + 1 : acc,\n 0,\n );\n }\n\n if (op === \"latest\") {\n // Newest by observedAt wins. Stable for tied timestamps (first\n // in list — caller controls input ordering).\n let pick = instances[0]!;\n for (let i = 1; i < instances.length; i++) {\n if (instances[i]!.observedAt > pick.observedAt) pick = instances[i]!;\n }\n return pick.value;\n }\n\n // Numeric operators below this point. Filter to numeric values.\n // Null/undefined values are silently dropped (consistent with the\n // contract's \"no usable data → null\" semantics). Non-null,\n // non-numeric values throw — the operator was misused at policy-\n // authoring time and silent zero-coercion would mask the bug.\n const nums: number[] = [];\n for (const i of instances) {\n if (typeof i.value === \"number\" && Number.isFinite(i.value)) {\n nums.push(i.value);\n } else if (i.value !== null && typeof i.value !== \"undefined\") {\n throw new Error(\n `applyAggregation: '${op}' requires numeric values; got ${typeof i.value}`,\n );\n }\n }\n\n if (nums.length === 0) return null;\n\n switch (op) {\n case \"sum\":\n return nums.reduce((a, b) => a + b, 0);\n case \"mean\":\n return nums.reduce((a, b) => a + b, 0) / nums.length;\n case \"max\":\n // `Math.max(...nums)` spreads through the call stack — V8 throws\n // RangeError once `nums.length` crosses the engine's argument\n // limit (~65k on current V8). Reduce form is safe for any size.\n return nums.reduce((a, b) => (a > b ? a : b));\n }\n}\n","{\n \"schemaVersion\": \"1.0.0\",\n \"categories\": [\n {\n \"id\": \"telco-carrier\",\n \"displayName\": \"Telco Carrier\",\n \"description\": \"Mobile carrier bill-payment + account-history signals. Any mobile carrier implementing this category produces the same canonical field set.\",\n \"canonicalTable\": \"ihs_alt_data_telco\",\n \"fields\": [\n {\n \"name\": \"telcoOnTimePaymentRatio24m\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of bills paid on time over the last 24 months. Strongest single telco predictor; ≥0.95 is the clean-history signal.\"\n },\n {\n \"name\": \"telcoTenureMonths\",\n \"type\": \"number\",\n \"unit\": \"months\",\n \"range\": [0, 600],\n \"description\": \"Account age. ≥48 months is the thin-file uplift trigger.\"\n },\n {\n \"name\": \"telcoSuspensionsCount24m\",\n \"type\": \"number\",\n \"unit\": \"count\",\n \"range\": [0, 100],\n \"description\": \"Non-payment-driven account suspensions in the last 24 months. ≥3 is a strong distress signal.\"\n },\n {\n \"name\": \"telcoLateDays24m\",\n \"type\": \"number\",\n \"unit\": \"days\",\n \"range\": [0, 800],\n \"description\": \"Cumulative days late across all bills in the trailing 24-month window.\"\n },\n {\n \"name\": \"telcoHandsetFinancingActive\",\n \"type\": \"boolean\",\n \"description\": \"Has an active handset-EMI account currently. Proxy for financing capacity already extended.\"\n },\n {\n \"name\": \"telcoHandsetFinancingDelinquent\",\n \"type\": \"boolean\",\n \"description\": \"Recent handset-EMI delinquency in the last 24 months. Distress signal even with otherwise clean bill payment.\"\n },\n {\n \"name\": \"telcoArpuMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 10000],\n \"description\": \"Average Revenue Per User (monthly) in Malaysian Ringgit. Coarse spending-capacity proxy.\"\n }\n ]\n },\n {\n \"id\": \"payment-network\",\n \"displayName\": \"Payment Network\",\n \"description\": \"Merchant-side payment-flow signals from POS / payment-gateway networks. Captures actual transaction velocity rather than self-reported revenue.\",\n \"canonicalTable\": \"ihs_alt_data_payments\",\n \"fields\": [\n {\n \"name\": \"paymentsMonthlyVolumeMyrT3\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 100000000],\n \"description\": \"Mean monthly inbound transaction volume (RM) over the trailing 3 months.\"\n },\n {\n \"name\": \"paymentsMonthlyVolumeMyrT12\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 100000000],\n \"description\": \"Mean monthly inbound transaction volume (RM) over the trailing 12 months. Pair with T3 for trend direction.\"\n },\n {\n \"name\": \"paymentsArpuStability12m\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Coefficient-of-variation inverse over monthly ARPU in the trailing 12 months. Closer to 1 = steadier; closer to 0 = volatile.\"\n },\n {\n \"name\": \"paymentsDisputeRate12m\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of transactions disputed or refunded in the trailing 12 months.\"\n },\n {\n \"name\": \"paymentsCustomerConcentrationTop5Pct\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Revenue share from the top-5 recurring customers. Above ~0.7 is concentration risk.\"\n },\n {\n \"name\": \"paymentsActiveTenureMonths\",\n \"type\": \"number\",\n \"unit\": \"months\",\n \"range\": [0, 600],\n \"description\": \"Months since first transaction on the payment network. Establishment / continuity proxy.\"\n }\n ]\n },\n {\n \"id\": \"bank-statement\",\n \"displayName\": \"Bank Statement\",\n \"description\": \"Per-month bank-statement extractions. Naturally multi-instance: one statement per (account, month). Eval components typically aggregate across instances (sum closing balance, max debit, count of bounced transactions).\",\n \"canonicalTable\": \"ihs_alt_data_bank_statements\",\n \"fields\": [\n {\n \"name\": \"bankStatementMonth\",\n \"type\": \"string\",\n \"description\": \"Statement period in YYYY-MM format. Used as the instance_key discriminator + by the `latest` aggregation operator.\"\n },\n {\n \"name\": \"bankClosingBalanceMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [-100000000, 100000000],\n \"description\": \"Closing balance for the statement period.\"\n },\n {\n \"name\": \"bankTotalCreditsMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 100000000],\n \"description\": \"Sum of credit transactions during the period.\"\n },\n {\n \"name\": \"bankTotalDebitsMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 100000000],\n \"description\": \"Sum of debit transactions during the period.\"\n },\n {\n \"name\": \"bankLargestSingleCreditMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 100000000],\n \"description\": \"Largest single inbound transaction in the period. Useful for spotting one-off injections vs steady revenue.\"\n },\n {\n \"name\": \"bankBouncedTransactionsCount\",\n \"type\": \"number\",\n \"unit\": \"count\",\n \"range\": [0, 1000],\n \"description\": \"Bounced / returned transactions in the period. Distress signal at counts > 0.\"\n }\n ]\n },\n {\n \"id\": \"social-media\",\n \"displayName\": \"Social Media Presence\",\n \"description\": \"Public business-presence signals from social / commerce platforms — establishment, reach, engagement authenticity, customer reputation, and account standing. Vendor-agnostic: any platform exposing a public business profile maps its data to this canonical field set. Useful as thin-file corroboration of a borrower's operating reality where formal financials are sparse.\",\n \"canonicalTable\": \"ihs_alt_data_social_media\",\n \"fields\": [\n {\n \"name\": \"socialAccountTenureMonths\",\n \"type\": \"number\",\n \"unit\": \"months\",\n \"range\": [0, 600],\n \"description\": \"Age of the oldest verified public business presence across linked profiles. Establishment / continuity proxy, parallel to telco + payment-network tenure.\"\n },\n {\n \"name\": \"socialFollowerCount\",\n \"type\": \"number\",\n \"unit\": \"count\",\n \"range\": [0, 100000000],\n \"description\": \"Aggregate audience size across linked public profiles. Coarse reach / scale proxy — gameable on its own, so read alongside socialEngagementRate90d.\"\n },\n {\n \"name\": \"socialEngagementRate90d\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Mean interactions per impression over the trailing 90 days. Authenticity signal: a large follower count with near-zero engagement indicates a bought or dormant audience.\"\n },\n {\n \"name\": \"socialPostingConsistency12m\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of weeks in the trailing 12 months with at least one public post. Ongoing-operation signal — distinguishes an active business from a stale listing.\"\n },\n {\n \"name\": \"socialVerifiedBusinessAccount\",\n \"type\": \"boolean\",\n \"description\": \"Has at least one platform-verified business / commerce profile. Legitimacy signal — the platform has performed its own business-identity check.\"\n },\n {\n \"name\": \"socialCustomerRatingAvg\",\n \"type\": \"number\",\n \"unit\": \"rating\",\n \"range\": [0, 5],\n \"description\": \"Mean public customer rating (normalised to a 0–5 scale) across review-bearing profiles. Reputation signal; especially predictive for consumer-facing SMEs.\"\n },\n {\n \"name\": \"socialNegativeSentimentRatio90d\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of public mentions / reviews classified as negative over the trailing 90 days. Reputation-risk / distress signal independent of overall rating volume.\"\n },\n {\n \"name\": \"socialAccountFlags24m\",\n \"type\": \"number\",\n \"unit\": \"count\",\n \"range\": [0, 100],\n \"description\": \"Policy strikes, suspensions, or content takedowns across linked profiles in the last 24 months. Distress signal, parallel to telcoSuspensionsCount24m.\"\n }\n ]\n },\n {\n \"id\": \"trade-credit\",\n \"displayName\": \"Trade Credit (Accounting)\",\n \"description\": \"Accounts-receivable / accounts-payable aging and ledger-derived working-capital signals sourced from a business's accounting / ERP system. Captures how promptly the business collects from its debtors and pays its creditors, the aging profile and concentration of its receivables, and P&L / cash-conversion efficiency. Vendor-agnostic: any accounting or ERP system that exposes an AR/AP aging report plus a P&L summary maps its data to this canonical field set. A direct, high-signal view of trade-obligation behaviour — closer to formal credit history than most alternative data — and the anchor for cross-referencing self-reported accounting figures against bank-statement reality.\",\n \"canonicalTable\": \"ihs_alt_data_trade_credit\",\n \"fields\": [\n {\n \"name\": \"arDaysSalesOutstanding\",\n \"type\": \"number\",\n \"unit\": \"days\",\n \"range\": [0, 400],\n \"description\": \"Days Sales Outstanding — average days to collect a receivable. The headline collection-efficiency metric; lower is healthier, and a rising DSO is an early liquidity-stress signal.\"\n },\n {\n \"name\": \"apDaysPayableOutstanding\",\n \"type\": \"number\",\n \"unit\": \"days\",\n \"range\": [0, 400],\n \"description\": \"Days Payable Outstanding — average days the business takes to pay its suppliers. Context for DSO; a very high DPO can indicate the business is stretching its creditors to fund operations.\"\n },\n {\n \"name\": \"arTotalOutstandingMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 1000000000],\n \"description\": \"Total accounts-receivable balance outstanding (RM). The size of the debtor book the business is carrying.\"\n },\n {\n \"name\": \"arCurrentRatio\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of the receivables book that is current (within payment terms, not yet overdue). Higher is healthier; the complement is the overdue share across all aging buckets.\"\n },\n {\n \"name\": \"arOverdue90PlusRatio\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of the receivables book aged more than 90 days past terms. The key impairment / bad-debt risk signal from the AR aging report; elevated values indicate collection difficulty.\"\n },\n {\n \"name\": \"debtorConcentrationTop5Ratio\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Share of total receivables owed by the top-5 debtors. Above ~0.6 is single-customer concentration risk — one debtor default would materially impair cash flow.\"\n },\n {\n \"name\": \"tradeReferenceDefaults12m\",\n \"type\": \"number\",\n \"unit\": \"count\",\n \"range\": [0, 1000],\n \"description\": \"Count of supplier-reported defaults or dishonoured / returned payments against the business in the trailing 12 months. Direct distress signal, parallel to a bureau default record.\"\n },\n {\n \"name\": \"accountingRevenue12mMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 1000000000],\n \"description\": \"Trailing-12-month turnover per the general ledger (RM). The cross-reference anchor: comparing this self-reported accounting revenue against payment-network volume and bank-statement inflows surfaces book-vs-reality inconsistencies.\"\n },\n {\n \"name\": \"grossMarginPct\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Gross margin from the P&L (gross profit / revenue). Profitability-quality signal; a thin or declining margin constrains debt-service capacity even at healthy revenue.\"\n },\n {\n \"name\": \"cashConversionCycleDays\",\n \"type\": \"number\",\n \"unit\": \"days\",\n \"range\": [-200, 600],\n \"description\": \"Cash Conversion Cycle (DSO + days-inventory-outstanding − DPO). Working-capital efficiency; negative values (collect before paying suppliers) are strongest, very high values indicate cash tied up in operations.\"\n }\n ]\n },\n {\n \"id\": \"geolocation\",\n \"displayName\": \"Geolocation\",\n \"description\": \"Hourly-granularity movement track plus derived mobility signals for an applicant, sourced from any location-capable provider (telco network location, mobile-SDK GPS, GIS / address-verification services). Two instance kinds share this category: point instances (instanceKey 'pt:<ISO-hour>') carry one observed position per hourly bucket, mirroring the bank-statement multi-instance pattern; a single summary instance (instanceKey 'summary') carries adapter-derived behaviour signals — most importantly work-pattern regularity (sustained weekday dwell at a stable work anchor corroborates income reliability), residential stability, vacation windows, and dwell in operator-flagged hotspot zones. Vendor-agnostic: the source classifies or the adapter infers place labels; no provider-specific semantics leak into the field set. Raw coordinates are sensitive personal data — product-plane persistence is gated on PDPA consent + CRA Act 710 s25 retention review.\",\n \"canonicalTable\": \"ihs_alt_data_geolocation\",\n \"fields\": [\n {\n \"name\": \"geoLatitude\",\n \"type\": \"number\",\n \"unit\": \"deg\",\n \"range\": [-90, 90],\n \"description\": \"Observed latitude for this hourly bucket (point instances only).\"\n },\n {\n \"name\": \"geoLongitude\",\n \"type\": \"number\",\n \"unit\": \"deg\",\n \"range\": [-180, 180],\n \"description\": \"Observed longitude for this hourly bucket (point instances only).\"\n },\n {\n \"name\": \"geoAccuracyM\",\n \"type\": \"number\",\n \"unit\": \"meters\",\n \"range\": [0, 100000],\n \"description\": \"Source-reported horizontal accuracy radius of the observation. Cell-tower fixes are typically hundreds of meters; GPS fixes tens.\"\n },\n {\n \"name\": \"geoBucket\",\n \"type\": \"string\",\n \"description\": \"ISO-8601 hour bucket of the observation, e.g. '2026-06-01T08'. Redundant with the instance key (pt:<bucket>) so consumers can query without parsing keys.\"\n },\n {\n \"name\": \"geoPlaceLabel\",\n \"type\": \"string\",\n \"description\": \"Classified place for the bucket: home | work | commute | leisure | travel | hotspot | other. Classified by the source or inferred by the adapter from anchor dwell.\"\n },\n {\n \"name\": \"geoWorkAttendanceRatio30d\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of the last 30 weekdays with >= 6 hours of dwell at the inferred work anchor. The income-reliability headline: regular full-time work patterns corroborate declared employment income (summary instance only).\"\n },\n {\n \"name\": \"geoWorkDailyHoursAvg30d\",\n \"type\": \"number\",\n \"unit\": \"hours\",\n \"range\": [0, 24],\n \"description\": \"Mean daily hours of work-anchor dwell across the last 30 weekdays (summary instance only).\"\n },\n {\n \"name\": \"geoLocationStabilityScore\",\n \"type\": \"number\",\n \"unit\": \"score\",\n \"range\": [0, 1],\n \"description\": \"Residential stability: share of nights spent at the primary home anchor over the observation window. 1 = every night at home (summary instance only).\"\n },\n {\n \"name\": \"geoCommuteRegularityRatio\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Consistency of the weekday home->work->home rhythm: fraction of weekdays matching the dominant commute pattern within an hour's tolerance (summary instance only).\"\n },\n {\n \"name\": \"geoVacationDays90d\",\n \"type\": \"number\",\n \"unit\": \"days\",\n \"range\": [0, 90],\n \"description\": \"Days in the last 90 spent fully away from both home and work anchors (contiguous travel windows; summary instance only).\"\n },\n {\n \"name\": \"geoHotspotDwellRatio\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Share of observed buckets spent inside operator-flagged hotspot zones (known fraud / illicit-activity locations supplied to the adapter). Non-zero values warrant review, not automatic decline (summary instance only).\"\n },\n {\n \"name\": \"geoPrimaryStateCode\",\n \"type\": \"string\",\n \"description\": \"Malaysian state / federal-territory code of the primary home anchor, e.g. PNG, KUL, JHR (summary instance only).\"\n },\n {\n \"name\": \"geoAddressMatchScore\",\n \"type\": \"number\",\n \"unit\": \"score\",\n \"range\": [0, 1],\n \"description\": \"Agreement between the inferred home anchor and the applicant's registered residential address. 1 = same premises, 0 = different state (summary instance only).\"\n }\n ]\n }\n ]\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Generic adapter category catalogue.\n *\n * Each category declares the canonical field set produced by any\n * adapter of that category — regardless of vendor. This is the\n * public, vendor-agnostic vocabulary that clients (finhub views,\n * finsys-client eval engine, CRA report renderer) read so they know\n * what data shape to expect from a given alt-data source TYPE.\n *\n * Specific vendor implementations (e.g. \"Celcom telco v1\", \"iPay88\n * payments v1\") live OUTSIDE this open-source package, in private\n * extension directories loaded by the host app. The category schemas\n * are the publication boundary — vendors map their raw payload to\n * these canonical fields; clients render against these canonical\n * fields. Vendor identity never crosses that boundary.\n *\n * SYS-2500 (extensible categories)\n * --------------------------------\n * The category id set used to be a hardcoded TypeScript union, kept in\n * sync by hand with the data file and the manifest JSON-schema enum\n * (three sources of truth, a drift test, and a deliberate edit in each\n * place to add a category). It is now backed by a single source of\n * truth: this package's `data/adapter-categories.json`, loaded +\n * validated into a runtime registry at module load. Adding a category\n * is a JSON-file edit plus a finsys-core minor bump — no union edit, no\n * schema enum edit. `AdapterCategory` is an open `string`; membership\n * is validated at trust boundaries via `isAdapterCategory()` /\n * `assertAdapterCategory()`.\n */\n\nimport categoriesData from \"./data/adapter-categories.json\" with { type: \"json\" };\n\n/**\n * Adapter category identifier.\n *\n * Open `string` type (SYS-2500). The authoritative set lives in the\n * runtime registry built from `data/adapter-categories.json`; there is\n * no compile-time union to enumerate. The trade-off vs. the old\n * literal union is the loss of autocomplete + exhaustiveness on\n * category ids — validate at boundaries with `isAdapterCategory()` /\n * `assertAdapterCategory()` instead, and read the canonical set from\n * `ADAPTER_CATEGORY_IDS` / `allCategories()`.\n */\nexport type AdapterCategory = string;\n\n/**\n * Union of all canonical field names declared by any category. Loose-\n * typed (string) because the set grows with each category-added minor;\n * the runtime registry narrows against the data file.\n *\n * Adapter `produces` lists are typed as ReadonlyArray<CanonicalFieldName>\n * — the host validates membership against the adapter's category at\n * registration time, refusing adapters that promise fields outside\n * their category.\n */\nexport type CanonicalFieldName = string;\n\n/**\n * Per-field metadata for a canonical field declared by a category.\n * Frozen at module load — the data file is authoritative.\n */\nexport interface CanonicalFieldSpec {\n readonly name: CanonicalFieldName;\n readonly type: \"number\" | \"boolean\" | \"string\";\n readonly unit?: string;\n readonly range?: readonly [number, number];\n readonly description: string;\n}\n\n/**\n * Per-category schema bundle. Used by:\n * - host app: validate adapter `produces` lists at registration\n * - clients (finhub, finsys-client): render UI conditionally on\n * category activation\n * - CRA report: render provenance metadata\n */\nexport interface CategorySchema {\n readonly id: AdapterCategory;\n readonly displayName: string;\n readonly description: string;\n readonly canonicalTable: string;\n readonly fields: ReadonlyArray<CanonicalFieldSpec>;\n}\n\n// ── Raw data shape (as it appears in the JSON file) ──────────────────\n\ninterface RawCategoryField {\n name: string;\n type: \"number\" | \"boolean\" | \"string\";\n unit?: string;\n range?: [number, number];\n description: string;\n}\n\ninterface RawCategory {\n id: string;\n displayName: string;\n description: string;\n canonicalTable: string;\n fields: RawCategoryField[];\n}\n\ninterface RawCategoryData {\n schemaVersion: string;\n categories: RawCategory[];\n}\n\n// ── Registry: load-time validation + indexing ────────────────────────\n\nconst VALID_FIELD_TYPES: ReadonlyArray<CanonicalFieldSpec[\"type\"]> = [\n \"number\",\n \"boolean\",\n \"string\",\n];\n\n/**\n * The validated, indexed, immutable category registry. Built once at\n * module load from the bundled data file (and rebuildable from any\n * conforming data object in tests via `buildCategoryRegistry`).\n */\nexport interface CategoryRegistry {\n /** All category schemas, in data-file order. */\n readonly all: ReadonlyArray<CategorySchema>;\n /** Category ids, in data-file order. */\n readonly ids: ReadonlyArray<AdapterCategory>;\n /** id → schema, O(1) lookup. */\n readonly byId: ReadonlyMap<AdapterCategory, CategorySchema>;\n /** canonical field name → owning category id, O(1) reverse lookup. */\n readonly fieldToCategory: ReadonlyMap<CanonicalFieldName, AdapterCategory>;\n}\n\n/**\n * Validate + index raw category data into an immutable registry.\n *\n * Pure function — exported so the loader can be exercised against\n * fixture data in tests (SYS-2500: prove the registry is genuinely\n * data-driven, not hardcoded). Throws on ANY structural violation so a\n * malformed JSON edit fails loudly at module load rather than producing\n * silent gaps at read time. The invariants enforced here are the ones\n * the old test suite asserted after the fact; making them load-time\n * guarantees is what lets the data file be the single source of truth.\n */\nexport function buildCategoryRegistry(raw: RawCategoryData): CategoryRegistry {\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"adapter category data: expected an object\");\n }\n if (typeof raw.schemaVersion !== \"string\" || raw.schemaVersion.length === 0) {\n throw new Error(\"adapter category data: missing schemaVersion\");\n }\n if (!Array.isArray(raw.categories) || raw.categories.length === 0) {\n throw new Error(\"adapter category data: categories must be a non-empty array\");\n }\n\n const byId = new Map<AdapterCategory, CategorySchema>();\n const fieldToCategory = new Map<CanonicalFieldName, AdapterCategory>();\n const tables = new Set<string>();\n const all: CategorySchema[] = [];\n\n for (const cat of raw.categories) {\n const where = `category \"${cat?.id ?? \"<unknown>\"}\"`;\n\n if (typeof cat.id !== \"string\" || cat.id.length === 0) {\n throw new Error(\"adapter category data: every category needs a non-empty id\");\n }\n if (byId.has(cat.id)) {\n throw new Error(`adapter category data: duplicate category id \"${cat.id}\"`);\n }\n if (typeof cat.displayName !== \"string\" || cat.displayName.length === 0) {\n throw new Error(`adapter category data: ${where} needs a non-empty displayName`);\n }\n if (typeof cat.description !== \"string\" || cat.description.length === 0) {\n throw new Error(`adapter category data: ${where} needs a non-empty description`);\n }\n if (typeof cat.canonicalTable !== \"string\" || !/^ihs_alt_data_/.test(cat.canonicalTable)) {\n throw new Error(\n `adapter category data: ${where} canonicalTable must start with \"ihs_alt_data_\" (got \"${cat.canonicalTable}\")`,\n );\n }\n if (tables.has(cat.canonicalTable)) {\n throw new Error(\n `adapter category data: duplicate canonicalTable \"${cat.canonicalTable}\" (${where})`,\n );\n }\n if (!Array.isArray(cat.fields) || cat.fields.length === 0) {\n throw new Error(`adapter category data: ${where} must declare at least one field`);\n }\n\n const fields: CanonicalFieldSpec[] = [];\n for (const f of cat.fields) {\n if (typeof f.name !== \"string\" || f.name.length === 0) {\n throw new Error(`adapter category data: ${where} has a field with no name`);\n }\n if (fieldToCategory.has(f.name)) {\n throw new Error(\n `adapter category data: canonical field \"${f.name}\" declared by more than one category ` +\n `(${fieldToCategory.get(f.name)} + ${cat.id}) — field names must be globally unique`,\n );\n }\n if (!VALID_FIELD_TYPES.includes(f.type)) {\n throw new Error(\n `adapter category data: field \"${f.name}\" (${where}) has invalid type \"${f.type}\"`,\n );\n }\n if (typeof f.description !== \"string\" || f.description.length === 0) {\n throw new Error(\n `adapter category data: field \"${f.name}\" (${where}) needs a non-empty description`,\n );\n }\n if (f.range !== undefined) {\n // Number.isFinite rejects non-numbers, NaN, and ±Infinity — a\n // typeof check alone would let [NaN, NaN] through (typeof NaN ===\n // \"number\" and NaN > NaN is false), silently corrupting any\n // downstream clamp that reads the range.\n if (\n !Array.isArray(f.range) ||\n f.range.length !== 2 ||\n !Number.isFinite(f.range[0]) ||\n !Number.isFinite(f.range[1]) ||\n f.range[0] > f.range[1]\n ) {\n throw new Error(\n `adapter category data: field \"${f.name}\" (${where}) has an invalid range — expected [lo, hi] with finite lo <= hi`,\n );\n }\n }\n\n const spec: CanonicalFieldSpec = Object.freeze({\n name: f.name,\n type: f.type,\n ...(f.unit !== undefined ? { unit: f.unit } : {}),\n ...(f.range !== undefined ? { range: Object.freeze([f.range[0], f.range[1]]) as readonly [number, number] } : {}),\n description: f.description,\n });\n fields.push(spec);\n fieldToCategory.set(f.name, cat.id);\n }\n\n const schema: CategorySchema = Object.freeze({\n id: cat.id,\n displayName: cat.displayName,\n description: cat.description,\n canonicalTable: cat.canonicalTable,\n fields: Object.freeze(fields) as ReadonlyArray<CanonicalFieldSpec>,\n });\n byId.set(cat.id, schema);\n tables.add(cat.canonicalTable);\n all.push(schema);\n }\n\n return Object.freeze({\n all: Object.freeze(all) as ReadonlyArray<CategorySchema>,\n ids: Object.freeze(all.map((c) => c.id)) as ReadonlyArray<AdapterCategory>,\n byId,\n fieldToCategory,\n });\n}\n\n/**\n * The package's category registry — built + validated once at module\n * load from `data/adapter-categories.json`. A malformed data file\n * throws here, failing the import (and the build/test) loudly.\n */\nconst registry = buildCategoryRegistry(categoriesData as RawCategoryData);\n\n/**\n * Every category id declared by this version of finsys-core, in\n * data-file order. The runtime equivalent of the old hardcoded union —\n * derived from the single source of truth rather than maintained by\n * hand. Treat order as unstable across versions.\n */\nexport const ADAPTER_CATEGORY_IDS: ReadonlyArray<AdapterCategory> = registry.ids;\n\n/**\n * Look up a category schema by id. Throws if the id is unknown.\n */\nexport function categorySchemaOf(id: AdapterCategory): CategorySchema {\n const found = registry.byId.get(id);\n if (!found) {\n throw new Error(\n `Unknown adapter category: ${id}. Available: ${registry.ids.join(\", \")}`,\n );\n }\n return found;\n}\n\n/**\n * The canonical field names a given category produces. Convenience\n * for callers that don't need the full schema — common case in the\n * eval engine (\"does this policy reference any fields from a category\n * that isn't loaded?\").\n */\nexport function categoryFieldsOf(id: AdapterCategory): ReadonlyArray<CanonicalFieldName> {\n return categorySchemaOf(id).fields.map((f) => f.name);\n}\n\n/**\n * Every category currently declared. Order is data-file order; treat\n * as unstable across versions.\n */\nexport function allCategories(): ReadonlyArray<CategorySchema> {\n return registry.all;\n}\n\n/**\n * Reverse lookup: which category declares a given canonical field?\n * Returns null if the field name isn't declared by any category in\n * this version of finsys-core. Useful when the host app is reading\n * canonical field values back from storage + wants to identify the\n * producing category for rendering. O(1).\n */\nexport function categoryForField(field: CanonicalFieldName): AdapterCategory | null {\n return registry.fieldToCategory.get(field) ?? null;\n}\n\n/**\n * Runtime membership check — is `id` a category declared by this\n * version of finsys-core? Use this at trust boundaries (parsing a\n * manifest, validating an API parameter) now that `AdapterCategory` is\n * an open `string` and the compiler can no longer reject unknown ids.\n */\nexport function isAdapterCategory(id: string): boolean {\n return registry.byId.has(id);\n}\n\n/**\n * Assert membership: returns `id` if it names a declared category,\n * throws otherwise. Note this is a RUNTIME guard only — `AdapterCategory`\n * is an open `string`, so there is no type-level narrowing to apply.\n * The companion to `isAdapterCategory` for call sites that want a hard\n * failure (e.g. the host rejecting a manifest whose category isn't in\n * this finsys-core version's catalogue).\n */\nexport function assertAdapterCategory(id: string): AdapterCategory {\n if (!registry.byId.has(id)) {\n throw new Error(\n `Unknown adapter category: ${id}. Available: ${registry.ids.join(\", \")}`,\n );\n }\n return id;\n}\n"],"mappings":"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AAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;A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;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS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AA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,WAAa;AAAA,MACb,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,SAAW;AAAA,QACT;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,SAAW;AAAA,QACT;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,cAAgB;AAAA,MAChB,SAAW;AAAA,QACT;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,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AAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,M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,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAY;AAAA,MACZ,eAAiB;AAAA,MACjB,gBAAkB;AAAA,MAClB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,eAAiB;AAAA,MACjB,kBAAoB;AAAA,IACtB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,kBAAoB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAA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","names":["AjvModule","addFormats","FieldType","semver","IhsValueFormat","FileFieldTableType","Role","ExtractionJobStatus","IhsStatus","DocExtractionStatus"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/survey-generator.ts","../src/rhf-generator.ts","../src/validator.ts","../src/schema/unified-form.schema.json","../src/form-field-category.ts","../src/form-field.ts","../src/form-spec.ts","../src/form-field-validator.ts","../src/data/form-field-base-specs.json","../src/data/form-field-types.json","../src/data/form-field-validators.json","../src/catalogs.ts","../src/ihs-types.ts","../src/document-types.ts","../src/data/form-field-display-names.json","../src/ihs-processing.ts","../src/roles.ts","../src/extraction.ts","../src/ihs-status.ts","../src/extraction-status.ts","../src/adapter.ts","../src/adapter-aggregation.ts","../src/data/adapter-categories.json","../src/adapter-categories.ts"],"sourcesContent":["/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @finsys/core\n * Convert unified form configurations into Zod schemas, React Hook Form defaults, and SurveyJS JSON\n */\n\n// Functions\nexport {\n generateSurveyJson,\n resolvePageFields,\n getCategoryName,\n groupFieldsByCategory,\n applyDynamicTitles\n} from \"./survey-generator.js\";\n\nexport { getPastMonthLabel, getPastYearLabel, evaluateExpression } from \"./utils.js\";\n\nexport { \n generateRHFSchema,\n getStepSchema,\n getStepDefaultValues\n} from \"./rhf-generator.js\";\n\nexport { validateFormConfig, validateFormSpec, validatePagesConfig } from \"./validator.js\";\n\n// Unified Form Config types\nexport type {\n Category,\n Choice,\n Validator,\n FieldData,\n FieldReference,\n PageConfig,\n UnifiedFormConfig,\n ResolvedField,\n FieldGroup,\n} from \"./survey-generator.js\";\n\n// Output types (SurveyJS JSON compatible)\nexport type { SurveyElementJSON, SurveyPageJSON, SurveyJSON } from \"./survey-generator.js\";\n\n// RHF Generator types\nexport type { RHFStep, RHFSchemaOutput } from \"./rhf-generator.js\";\n\n// Re-export survey-core types for convenience\nexport type { IQuestion, IPage, ISurvey, IPanel, IElement } from \"./survey-generator.js\";\n\n// Form domain classes\nexport { FormSpec } from \"./form-spec.js\";\nexport { default as FormField, BasicFormField, FileFormField, FieldType } from \"./form-field.js\";\nexport type { FormFieldType, FormFieldInputType, FormFieldTypeDefinitions, DropdownOption, EditorValidator } from \"./form-field.js\";\nexport { FormFieldCategory } from \"./form-field-category.js\";\nexport { FormFieldValidator } from \"./form-field-validator.js\";\nexport type { FormValidatorDefinitions } from \"./form-field-validator.js\";\n\n// Catalogs\nexport {\n BASE_FIELD_SPECS,\n DEFAULT_VALIDATOR_DEFINITIONS,\n FIELD_TYPE_DEFINITIONS,\n getBaseFieldSpecs,\n getBaseCategories,\n getBaseFieldNames,\n getBaseFieldSpecMap,\n} from \"./catalogs.js\";\n\n// IHS data processing\nexport {\n getDisplayNames,\n getDisplayName,\n getGroupDisplayNames,\n extractTimePeriods,\n groupColumnsByTimePeriod,\n groupColumnsByInstance,\n groupFieldsByPattern,\n buildFileFieldTables,\n buildFileFieldTablesFromInstances,\n processIhsDetails,\n groupDetailsByCategory,\n buildDocumentRows,\n parseFileField,\n getDocDisplayNames,\n getExtractableDocTypes,\n getReuploadableDocTypes,\n formatDocumentType,\n formatDocumentSize,\n formatDocumentUploaded,\n} from './ihs-processing.js'\n\nexport { IhsValueFormat, FileFieldTableType, isValidIhsFieldOrigin, IHS_FIELD_ORIGINS } from './ihs-types.js'\nexport type { IhsFieldOrigin } from './ihs-types.js'\n\n// Roles\nexport { Role } from './roles.js'\n\n// Extraction\nexport { ExtractionJobStatus } from './extraction.js'\nexport type { ExtractionFileType } from './extraction.js'\nexport {\n getDocumentTypeGroups,\n isDocumentType,\n assertDocumentType,\n} from './document-types.js'\nexport type { DocumentTypeGroup, WireFormat, TaggedFieldData, TimePeriodUnit } from './document-types.js'\n\n// IHS status (canonical enum, mirrors finsys-api)\nexport {\n IhsStatus,\n IHS_VALID_STATUSES,\n IHS_TERMINAL_STATUSES,\n IHS_FAILURE_STATUSES,\n isValidIhsStatus,\n isTerminalIhsStatus,\n isFailureIhsStatus,\n} from './ihs-status.js'\n\n// Extraction status\nexport {\n resolveExtractionStatus,\n DocExtractionStatus,\n} from './extraction-status.js'\n\nexport type {\n ExtractionJobRecord,\n DocExtractionResult,\n ExtractionStatusResult,\n} from './extraction-status.js'\n\nexport type {\n IhsFieldDetail,\n IhsDetailCategory,\n FileFieldTableData,\n FileFieldTableItem,\n IhsFieldProvenance,\n DocumentRow,\n DocumentRowCapabilities,\n DocumentFileMetadata,\n InstanceRow,\n} from './ihs-types.js'\n\nexport type { CategorySpec } from './ihs-processing.js'\n\n// ── Source Adapter framework (SYS-2440) ──────────────────────────────\n// The contract for ingesting unstructured / partner-specific data\n// sources and producing canonical credit signals. Vendor-specific\n// adapter implementations live OUTSIDE this open-source package, in\n// private extension directories loaded by the host app at runtime.\n// finsys-core publishes the contract + the category catalogue.\n\nexport type {\n RawPayload,\n CanonicalFieldValue,\n CanonicalFieldValues,\n AdapterExtraction,\n SourceAdapter,\n AdapterErrorReason,\n ApplicantIdentity,\n} from './adapter.js'\n\nexport { AdapterError } from './adapter.js'\n\nexport type { AggregationOp, InstanceValue } from './adapter-aggregation.js'\nexport { applyAggregation, ALL_AGGREGATION_OPS } from './adapter-aggregation.js'\n\nexport type {\n AdapterCategory,\n CanonicalFieldName,\n CanonicalFieldSpec,\n CategorySchema,\n} from './adapter-categories.js'\n\n// NB: `buildCategoryRegistry` + the `CategoryRegistry` shape are\n// intentionally NOT re-exported here. They're the internal loader (and\n// its return type, which carries mutable Maps that `ReadonlyMap` only\n// guards at compile time). Keeping them out of the package's public API\n// avoids exposing a corruptible view of the shared singleton registry.\n// They remain module-exported for finsys-core's own tests. Promote to a\n// public, defensively-immutable API only when a consumer (e.g. host-side\n// category merging in a future phase) actually needs it.\nexport {\n ADAPTER_CATEGORY_IDS,\n categorySchemaOf,\n categoryFieldsOf,\n allCategories,\n categoryForField,\n isAdapterCategory,\n assertAdapterCategory,\n} from './adapter-categories.js'\n\nexport type {\n AdapterManifest,\n DeclarativeImplementation,\n TypescriptImplementation,\n FormIntakeImplementation,\n FormIntakeFieldMapEntry,\n ManualOverrideImplementation,\n FieldAuthorization,\n FieldMapEntry,\n} from './adapter-manifest.js'\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Utility functions for @finsys/core\n */\n\nexport function getPastMonthLabel(monthsAgo: number): string {\n const date = new Date();\n date.setDate(1); // Avoid day-of-month rollover (e.g. Mar 31 → \"February\" would roll to March)\n date.setMonth(date.getMonth() - monthsAgo);\n return date.toLocaleString('default', { month: 'long' });\n}\n\nexport function getPastYearLabel(yearsAgo: number): string {\n const date = new Date();\n return (date.getFullYear() - yearsAgo).toString();\n}\n\n/**\n * Evaluate a SurveyJS-style expression against a data object.\n * e.g. \"{totalFinancing} > 50000\"\n * \n * NOTE: This is a simplified evaluator that replaces {key} with data[key] access.\n * It does not support complex SurveyJS functions like age() or complicated nested paths unless handled by JS.\n */\nexport function evaluateExpression(expression: string, data: any): boolean {\n if (!expression) return true;\n \n try {\n // 1. Replace {variable} with this['variable'] safely\n let jsExpression = expression.replace(/\\{([^}]+)\\}/g, (_, key) => {\n // Clean key if needed (trim)\n return `this['${key.trim()}']`;\n });\n\n // 2. Map SurveyJS comparison operators to JS operators FIRST\n // (before array operator transforms inject JS code containing '=' assignments)\n // Replace single '=' with '==' if it's not already '==' or '!=' or '>=' or '<='\n jsExpression = jsExpression.replace(/(?<![<>!=])=(?![=])/g, '==');\n\n // 3. Map SurveyJS array operators to JS equivalents\n // These run AFTER the '=' transform so their generated JS won't be mangled.\n\n // \"anyof\" → value is one of the items in the array\n // e.g. this['employmentType'] anyof ['01','08','09']\n // → (['01','08','09']).includes(this['employmentType'])\n jsExpression = jsExpression.replace(\n /(this\\['[^']+'\\])\\s+anyof\\s+(\\[[^\\]]+\\])/gi,\n (_, ref, arr) => `(${arr}).includes(${ref})`\n );\n\n // \"allof\" → value (expected to be an array) contains all items\n // e.g. this['skills'] allof ['a','b']\n // → ['a','b'].every(item => (this['skills'] || []).includes(item))\n // Arrow functions inherit `this` from enclosing scope (the new Function call),\n // so this works correctly with Function.call(data).\n jsExpression = jsExpression.replace(\n /(this\\['[^']+'\\])\\s+allof\\s+(\\[[^\\]]+\\])/gi,\n (_, ref, arr) => `${arr}.every(item => (${ref} || []).includes(item))`\n );\n\n // \"contains\" → string/array contains value\n // e.g. this['roles'] contains 'admin'\n // Uses || [] fallback to handle both string and array values correctly.\n // (|| '' would stringify arrays causing false positives)\n jsExpression = jsExpression.replace(\n /(this\\['[^']+'\\])\\s+contains\\s+'([^']+)'/gi,\n (_, ref, val) => `(${ref} || []).includes('${val}')`\n );\n\n // \"notcontains\" → string/array does not contain value\n jsExpression = jsExpression.replace(\n /(this\\['[^']+'\\])\\s+notcontains\\s+'([^']+)'/gi,\n (_, ref, val) => `!(${ref} || []).includes('${val}')`\n );\n\n // 4. Execute with Function, binding 'data' as 'this'\n const func = new Function(`return ${jsExpression};`);\n return !!func.call(data || {});\n } catch (e) {\n // console.warn(`Failed to evaluate expression: \"${expression}\"`, e);\n return false;\n }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Survey Generator - Converts unified form configurations into SurveyJS-compatible JSON\n *\n * This module converts a unified form-config.json into SurveyJS-compatible JSON,\n * resolving field references, applying dynamic titles, and grouping by category.\n */\n\n// Re-export survey-core types for consumers\nexport type { IQuestion, IPage, ISurvey, IPanel, IElement } from \"survey-core\";\nimport { getPastMonthLabel, getPastYearLabel } from \"./utils.js\";\n\n// ============ Unified Form Config Types ============\n\nexport interface Category {\n id: string;\n name: string;\n}\n\nexport interface Choice {\n value: string;\n text: string;\n}\n\nexport interface Validator {\n type: \"regex\" | \"email\" | \"numeric\" | \"text\" | \"expression\" | \"answercount\" | \"custom\";\n text?: string;\n regex?: string;\n minValue?: number;\n maxValue?: number;\n minLength?: number;\n maxLength?: number;\n minCount?: number;\n maxCount?: number;\n expression?: string;\n validator?: string; // For custom validator name\n}\n\n/**\n * FieldData - Field definition in the unified form config\n */\nexport interface FieldData {\n name?: string; // Optional in fields{} (key is name), required in arrays\n displayName?: string;\n type: string;\n inputType?: \"text\" | \"number\" | \"tel\" | \"date\" | \"email\" | \"password\" | \"url\";\n category?: string; // Category ID (strictly string)\n maxLength?: number | string;\n min?: number | string;\n max?: number | string;\n step?: number;\n html?: string;\n choices?: Choice[];\n validators?: Validator[];\n visible?: boolean;\n visibleIf?: string;\n required?: boolean;\n isRequired?: boolean; // SurveyJS compat alias\n placeholder?: string;\n defaultValue?: string | number | boolean | string[];\n readOnly?: boolean;\n startWithNewLine?: boolean;\n enableIf?: string;\n titleLocation?: \"default\" | \"top\" | \"bottom\" | \"left\" | \"hidden\";\n // FinSys-specific fields\n ihs_column_names?: string[];\n requiredForEvaluation?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * FieldReference - How fields are referenced in pages\n */\nexport type FieldReference = \n | string // Simple field name reference\n | { ref: string; [key: string]: unknown } // Reference with overrides\n | { definition: FieldData & { name: string } }; // Inline definition\n\nexport interface PageConfig {\n id: string;\n title?: string;\n description?: string;\n showTOC?: boolean;\n showProgressBar?: boolean;\n showCategoryHeadings?: boolean;\n layout?: \"default\" | \"grid\" | \"vertical\";\n fields: FieldReference[];\n}\n\n/**\n * UnifiedFormConfig - The main configuration type for the unified form format\n */\nexport interface UnifiedFormConfig {\n $schema?: string;\n schemaVersion?: string;\n displayName?: string;\n templateIcon?: string; // Icon identifier for form template editors\n categories: Category[];\n fields: Record<string, FieldData>;\n pages?: PageConfig[]; // Optional when used in editor-only mode (no rendered form)\n}\n\n\n// ============ Output Types (SurveyJS JSON compatible) ============\n\nexport interface SurveyElementJSON {\n type: string;\n name: string;\n title?: string;\n isRequired?: boolean;\n maxLength?: number;\n storeDataAsText?: boolean;\n category?: string;\n [key: string]: unknown;\n}\n\nexport interface SurveyPageJSON {\n name: string;\n title: string;\n elements: Array<{\n type: string;\n name: string;\n elements: SurveyElementJSON[];\n }>;\n}\n\nexport interface SurveyJSON {\n title: string;\n logoPosition?: string;\n pages: SurveyPageJSON[];\n showQuestionNumbers?: string;\n questionErrorLocation?: string;\n completedHtml?: string;\n showTOC?: boolean;\n completeText?: string;\n showPreviewBeforeComplete?: string;\n showProgressBar?: string;\n widthMode?: string;\n width?: string;\n}\n\n// ============ Helper Types ============\n\nexport interface ResolvedField extends FieldData {\n name: string;\n}\n\n/**\n * Normalize a field to ensure backward compatibility\n * - Sets both `required` and `isRequired` to the same value\n */\nfunction normalizeField(field: ResolvedField): ResolvedField {\n // Spec: Fields are required by default unless explicitly false\n const isRequired = field.isRequired !== false && field.required !== false;\n return {\n ...field,\n required: isRequired,\n isRequired: isRequired\n };\n}\n\n/**\n * Resolve a field reference to a full field definition\n */\nfunction resolveFieldReference(\n ref: FieldReference, \n fields: Record<string, FieldData>\n): ResolvedField | null {\n if (typeof ref === \"string\") {\n // Simple string reference\n const fieldDef = fields[ref];\n if (!fieldDef) {\n console.warn(`Field \"${ref}\" not found in fields definition`);\n return null;\n }\n return normalizeField({ name: ref, ...fieldDef });\n }\n \n if (\"definition\" in ref) {\n // Inline definition\n return normalizeField(ref.definition as ResolvedField);\n }\n \n if (\"ref\" in ref) {\n // Reference with overrides\n const fieldDef = fields[ref.ref];\n if (!fieldDef) {\n console.warn(`Field \"${ref.ref}\" not found in fields definition`);\n return null;\n }\n const { ref: fieldName, ...overrides } = ref;\n return normalizeField({ name: fieldName, ...fieldDef, ...overrides });\n }\n \n return null;\n}\n\n/**\n * Apply dynamic title logic (e.g., bank statements with dynamic month labels,\n * financial statements with dynamic year labels)\n */\nexport function applyDynamicTitles(field: ResolvedField): ResolvedField {\n const bankStatementMatch = field.name.match(/^bank_statement_t(\\d+)$/);\n if (bankStatementMatch) {\n const monthsAgo = parseInt(bankStatementMatch[1], 10);\n return {\n ...field,\n displayName: `Bank Statement (${getPastMonthLabel(monthsAgo)})`\n };\n }\n if (field.name === \"financials\") {\n return {\n ...field,\n displayName: `Audited Financial Statement (${getPastYearLabel(1)})`\n };\n }\n return field;\n}\n\n/**\n * Generate SurveyJS JSON from unified form config\n */\nexport function generateSurveyJson(config: UnifiedFormConfig): SurveyJSON | Record<string, never> {\n if (!config.pages || config.pages.length === 0) return {};\n \n const firstPage = config.pages.find(p => p.id !== \"success-message\");\n if (!firstPage) return {};\n\n const categories = config.categories || [];\n const categoryMap: Record<string, string> = categories.reduce((acc, cat) => {\n acc[cat.id] = cat.name;\n return acc;\n }, {} as Record<string, string>);\n\n // Process all fields from the first page\n const processedFields = firstPage.fields\n .map(ref => resolveFieldReference(ref, config.fields))\n .filter((f): f is ResolvedField => f !== null)\n .map(f => applyDynamicTitles(f))\n .map(f => mapFieldToSurveyJS(f));\n\n // Group by Category\n const grouped = processedFields.reduce((acc: Record<string, SurveyElementJSON[]>, field) => {\n const catName = categoryMap[field.category as string] || \"Default\";\n if (!acc[catName]) acc[catName] = [];\n acc[catName].push(field);\n return acc;\n }, {} as Record<string, SurveyElementJSON[]>);\n\n // Build Pages (One Page per Category for Wizard effect)\n const pages: SurveyPageJSON[] = Object.entries(grouped).map(([categoryName, elements]) => ({\n name: categoryName.toLowerCase().replace(/\\s+/g, \"-\"),\n title: firstPage.showCategoryHeadings === false ? \"\" : categoryName,\n elements: [\n {\n type: \"panel\",\n name: `${categoryName.toLowerCase().replace(/\\s+/g, \"-\")}-panel`,\n elements: elements,\n },\n ],\n }));\n\n return {\n title: config.displayName || \"Flexible Financing Program\",\n logoPosition: \"right\",\n pages,\n showQuestionNumbers: \"off\",\n questionErrorLocation: \"bottom\",\n completedHtml: \"<h3>Thank you for completing the form</h3>\",\n showTOC: firstPage.showTOC ?? true,\n completeText: \"Submit\",\n showPreviewBeforeComplete: \"showAllQuestions\",\n showProgressBar: firstPage.showProgressBar === false ? \"off\" : \"top\",\n widthMode: \"responsive\",\n width: \"100%\",\n };\n}\n\n/**\n * Map a field definition to SurveyJS element format\n */\nfunction mapFieldToSurveyJS(field: ResolvedField): SurveyElementJSON {\n const element: SurveyElementJSON = {\n type: field.type,\n name: field.name,\n ...(field.displayName && { title: field.displayName }),\n isRequired: field.isRequired ?? field.required ?? false,\n ...(field.maxLength && { maxLength: Number(field.maxLength) }),\n };\n\n if (field.type === \"file\") {\n element.storeDataAsText = false;\n }\n\n // Copy other properties\n const excludeKeys = [\"displayName\", \"required\", \"category\"];\n Object.keys(field).forEach((key) => {\n if (!(key in element) && !excludeKeys.includes(key) && field[key] !== undefined) {\n element[key] = field[key];\n }\n });\n\n // Store category for grouping\n element.category = field.category ?? \"\";\n\n return element;\n}\n\n/**\n * Resolve all fields from a page to full field definitions\n */\nexport function resolvePageFields(\n page: PageConfig,\n fields: Record<string, FieldData>\n): ResolvedField[] {\n return page.fields\n .map(ref => resolveFieldReference(ref, fields))\n .filter((f): f is ResolvedField => f !== null)\n .map(f => applyDynamicTitles(f));\n}\n\n/**\n * Get category name from category ID (supports string or number IDs)\n */\nexport function getCategoryName(\n categoryId: string | undefined,\n categories: Category[]\n): string {\n if (categoryId === undefined) return \"Other\";\n const cat = categories.find(c => c.id === categoryId);\n return cat?.name || \"Other\";\n}\n\n/**\n * Group fields by their category, maintaining order and creating section breaks\n */\nexport interface FieldGroup {\n category: string;\n categoryName: string;\n fields: ResolvedField[];\n}\n\nexport function groupFieldsByCategory(\n fields: ResolvedField[],\n categories: Category[]\n): FieldGroup[] {\n const groups: FieldGroup[] = [];\n let currentGroup: FieldGroup | null = null;\n\n for (const field of fields) {\n const category = field.category ?? \"\";\n \n if (!currentGroup || currentGroup.category !== category) {\n currentGroup = {\n category,\n categoryName: getCategoryName(category, categories),\n fields: []\n };\n groups.push(currentGroup);\n }\n \n currentGroup.fields.push(field);\n }\n\n return groups;\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { z } from \"zod\";\nimport {\n type UnifiedFormConfig,\n type PageConfig,\n type FieldData,\n type FieldReference,\n type ResolvedField,\n type Category,\n resolvePageFields,\n groupFieldsByCategory,\n applyDynamicTitles,\n type FieldGroup\n} from \"./survey-generator.js\";\nimport { evaluateExpression } from \"./utils.js\";\n\nexport interface RHFStep {\n id: number;\n title: string;\n description?: string;\n fields: ResolvedField[];\n showCategoryHeadings: boolean;\n layout?: \"default\" | \"grid\" | \"vertical\";\n}\n\nexport interface RHFSchemaOutput {\n zodSchema: z.ZodTypeAny; // Can be ZodEffects\n baseSchema: z.ZodObject<any>;\n defaultValues: Record<string, any>;\n fields: ResolvedField[];\n groupedFields: FieldGroup[];\n steps: RHFStep[];\n displayName: string;\n categories: Category[];\n templateIcon?: string;\n}\n\n/**\n * Apply visibility-aware validation to a Zod schema\n */\nfunction applyVisibilityValidation(\n baseObject: z.ZodObject<any>, \n fields: ResolvedField[]\n): z.ZodTypeAny {\n return baseObject.superRefine((data, ctx) => {\n fields.forEach((field) => {\n const isRequired = field.isRequired !== false && field.required !== false && field.type !== \"html\";\n if (!isRequired) return;\n\n // Determine Visibility\n let isVisible = field.visible !== false;\n if (isVisible && field.visibleIf) {\n isVisible = evaluateExpression(field.visibleIf, data);\n }\n\n if (isVisible) {\n const value = data[field.name];\n const isEmpty = \n value === undefined || \n value === null || \n value === \"\" || \n (Array.isArray(value) && value.length === 0);\n\n if (isEmpty) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"This field is required\",\n path: [field.name],\n });\n }\n }\n });\n });\n}\n\nexport function generateRHFSchema(config: UnifiedFormConfig): RHFSchemaOutput {\n // ... (existing logic for collecting fields/building shape)\n const pages = config.pages || [];\n const categories = config.categories || [];\n const fieldsMap = config.fields || {};\n\n if (pages.length === 0) {\n throw new Error(\"v2.0.0 templates must include a 'pages' configuration.\");\n }\n\n // 1. Collect all fields from all pages\n const allFields: ResolvedField[] = [];\n \n for (const page of pages) {\n const pageFields = resolvePageFields(page, fieldsMap);\n allFields.push(...pageFields);\n }\n\n // Apply dynamic titles\n const mergedFields = allFields.map(applyDynamicTitles);\n\n // 2. Build Zod Shape & Default Values\n const shape: Record<string, z.ZodTypeAny> = {};\n const defaultValues: Record<string, any> = {};\n\n mergedFields.forEach((field) => {\n let schema: z.ZodTypeAny = z.string();\n\n // Track base type before validators/wrapping transform it via .refine()\n // (instanceof checks won't work after .refine() converts ZodString → ZodEffects)\n let baseType: \"string\" | \"number\" | \"array\" | \"boolean\" | \"any\" = \"string\";\n\n // --- Base Type Handling ---\n if (field.inputType === \"number\" || field.type === \"number\" || field.type === \"slider\" || field.type === \"range\") {\n schema = z.coerce.number();\n baseType = \"number\";\n defaultValues[field.name] = field.defaultValue !== undefined ? Number(field.defaultValue) : \"\";\n } else if (field.type === \"checkbox\") {\n schema = z.array(z.string());\n baseType = \"array\";\n defaultValues[field.name] = [];\n } else if (field.type === \"file\") {\n schema = z.array(z.any());\n baseType = \"array\";\n defaultValues[field.name] = [];\n } else if (field.type === \"boolean\") {\n schema = z.boolean();\n baseType = \"boolean\";\n defaultValues[field.name] = field.defaultValue ?? false;\n } else if (field.type === \"html\") {\n schema = z.any().optional();\n baseType = \"any\";\n defaultValues[field.name] = \"\";\n } else {\n if (Array.isArray(field.defaultValue)) {\n defaultValues[field.name] = field.defaultValue[0] || \"\";\n } else {\n defaultValues[field.name] = field.defaultValue ?? \"\";\n }\n }\n\n // --- Validation Constraints ---\n\n // Min/Max for Numbers\n if (baseType === \"number\" && schema instanceof z.ZodNumber) {\n let numSchema = schema;\n if (field.min !== undefined) numSchema = numSchema.min(Number(field.min), { message: `Minimum value is ${field.min}` });\n if (field.max !== undefined) numSchema = numSchema.max(Number(field.max), { message: `Maximum value is ${field.max}` });\n schema = numSchema;\n }\n\n const isRequired = field.isRequired !== false && field.required !== false && field.type !== \"html\";\n const isAlwaysVisible = field.visible !== false && !field.visibleIf;\n const isActuallyInput = field.type !== \"html\";\n\n // --- Required .min(1) for always-visible fields ---\n // Must be applied BEFORE validators (.refine) which change the schema type.\n if (isRequired && isAlwaysVisible && isActuallyInput) {\n if (baseType === \"string\" && schema instanceof z.ZodString) {\n schema = schema.min(1, { message: \"This field is required\" });\n } else if (baseType === \"array\" && schema instanceof z.ZodArray) {\n schema = schema.min(1, { message: \"Please select at least one option\" });\n }\n }\n\n // --- Enhancements: Validators ---\n // Applied BEFORE optional wrapping so instanceof checks still work on the\n // base type. The .refine() calls here will transform the schema to ZodEffects,\n // which is why we use baseType for subsequent decisions instead of instanceof.\n\n // Email\n const hasExplicitEmailValidator = field.validators?.some(v => v.type === \"email\");\n if ((field.inputType === \"email\" || field.name === \"email\") && baseType === \"string\" && schema instanceof z.ZodString && !hasExplicitEmailValidator) {\n schema = schema.refine(val => val === \"\" || z.string().email().safeParse(val).success, {\n message: \"Invalid email address\"\n });\n }\n\n // Legacy Validators (Regex / Numeric)\n if (field.validators) {\n field.validators.forEach((v) => {\n if (v.type === \"regex\" && v.regex) {\n try {\n const regex = new RegExp(v.regex);\n if (baseType === \"string\") {\n schema = schema.refine((val: any) => val === \"\" || regex.test(val), {\n message: v.text || \"Invalid format\"\n });\n }\n } catch (e) {\n console.warn(`Invalid regex pattern for field ${field.name}:`, v.regex);\n }\n }\n if (v.type === \"email\" && baseType === \"string\") {\n schema = schema.refine((val: any) => val === \"\" || z.string().email().safeParse(val).success, {\n message: v.text || \"Invalid email\"\n });\n }\n if (v.type === \"numeric\" && schema instanceof z.ZodNumber) {\n let numSchema = schema;\n if (v.minValue !== undefined) numSchema = numSchema.min(v.minValue, { message: v.text });\n if (v.maxValue !== undefined) numSchema = numSchema.max(v.maxValue, { message: v.text });\n schema = numSchema;\n }\n });\n }\n\n // --- Final Wrapper: Optional for conditional/hidden fields ---\n // Uses baseType instead of instanceof since validators may have transformed the schema.\n if (!(isRequired && isAlwaysVisible && isActuallyInput)) {\n if (baseType === \"number\") {\n schema = schema.optional().or(z.literal(\"\")).or(z.null());\n } else if (baseType === \"array\") {\n schema = schema.optional();\n } else if (baseType === \"boolean\") {\n schema = schema.optional();\n } else if (baseType === \"string\") {\n schema = schema.optional().or(z.literal(\"\"));\n }\n }\n\n shape[field.name] = schema;\n });\n\n // 3. Group Fields by Category\n const groupedFields = groupFieldsByCategory(mergedFields, categories);\n\n // 4. Build Steps (Dynamic Wizard)\n const steps: RHFStep[] = pages.map((page, idx) => {\n const pageFields = resolvePageFields(page, fieldsMap);\n\n return {\n id: idx,\n title: page.title || \"\",\n description: page.description,\n fields: pageFields,\n showCategoryHeadings: page.showCategoryHeadings ?? false,\n layout: page.layout\n };\n });\n\n // 5. Build Final Schema with Visibility-Aware Validation\n const baseObject = z.object(shape);\n const zodSchema = applyVisibilityValidation(baseObject, mergedFields);\n\n return {\n zodSchema,\n baseSchema: baseObject,\n defaultValues,\n fields: mergedFields,\n groupedFields,\n steps,\n displayName: config.displayName || \"Application Form\",\n categories,\n templateIcon: config.templateIcon\n };\n}\n\n/**\n * Get Zod schema for a specific step\n */\nexport function getStepSchema(step: RHFStep, fullSchema: any): z.ZodTypeAny {\n const stepFieldNames = step.fields.map(f => f.name);\n const stepShape: Record<string, z.ZodTypeAny> = {};\n \n // 1. Determine the base ZodObject\n let baseObj: z.ZodObject<any> | undefined;\n\n if (fullSchema instanceof z.ZodObject) {\n baseObj = fullSchema;\n } else if (fullSchema && typeof fullSchema === \"object\" && \"baseSchema\" in fullSchema) {\n baseObj = fullSchema.baseSchema as z.ZodObject<any>;\n } else if (fullSchema && \"_def\" in fullSchema && fullSchema._def.schema instanceof z.ZodObject) {\n // Basic Unwrap for ZodEffects\n baseObj = fullSchema._def.schema;\n }\n\n if (!baseObj) {\n console.warn(\"[RHF Generator] Could not extract ZodObject shape for step validation\");\n return z.object({});\n }\n\n const shape = baseObj.shape;\n const stepFields: ResolvedField[] = [];\n \n stepFieldNames.forEach(name => {\n if (name in shape) {\n stepShape[name] = shape[name];\n // Keep track of which fields are in this step\n const fieldDef = step.fields.find(f => f.name === name);\n if (fieldDef) stepFields.push(fieldDef);\n }\n });\n \n const stepBaseObject = z.object(stepShape);\n return applyVisibilityValidation(stepBaseObject, stepFields);\n}\n\n/**\n * Extract default values for a specific step\n */\nexport function getStepDefaultValues(\n step: RHFStep, \n allDefaults: Record<string, any>\n): Record<string, any> {\n const stepDefaults: Record<string, any> = {};\n \n step.fields.forEach(field => {\n if (field.name in allDefaults) {\n stepDefaults[field.name] = allDefaults[field.name];\n }\n });\n \n return stepDefaults;\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport AjvModule, { ErrorObject } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport unifiedFormSchema from \"./schema/unified-form.schema.json\" with { type: \"json\" };\n\n// Interop for Ajv which can be exported differently in ESM/CJS\nconst Ajv = (AjvModule as any).default || AjvModule;\nconst ajv = new Ajv({ allErrors: true, strict: false });\n\n// Interop for ajv-formats\nconst addFormatsFn = (addFormats as any).default || addFormats;\naddFormatsFn(ajv);\n\n// Register the unified schema\najv.addSchema(unifiedFormSchema, \"unified-form.schema.json\");\n\nexport interface ValidationResult {\n valid: boolean;\n errors?: ErrorObject[];\n message?: string;\n}\n\n/**\n * Validates a unified form-config.json object against its schema\n */\nexport function validateFormConfig(data: unknown): ValidationResult {\n const validate = ajv.getSchema(\"unified-form.schema.json\");\n if (!validate) {\n return { valid: false, message: \"Could not load unified form schema\" };\n }\n\n const valid = validate(data);\n return {\n valid: !!valid,\n errors: validate.errors || undefined,\n };\n}\n\n// Legacy exports - these now just call validateFormConfig\n/** @deprecated Use validateFormConfig instead */\nexport function validateFormSpec(data: unknown): ValidationResult {\n return validateFormConfig(data);\n}\n\n/** @deprecated Use validateFormConfig instead */\nexport function validatePagesConfig(data: unknown): ValidationResult {\n return validateFormConfig(data);\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Unified Form Configuration Schema\",\n \"description\": \"A unified schema combining field definitions and page layout configuration for multi-step forms.\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"description\": \"Reference to this JSON schema file\"\n },\n \"schemaVersion\": {\n \"type\": \"string\",\n \"pattern\": \"^v?[0-9]+\\\\.[0-9]+\\\\.[0-9]+$\",\n \"description\": \"Semantic version of the schema format (e.g., 'v2.0.0' or '2.0.0')\"\n },\n \"displayName\": {\n \"type\": \"string\",\n \"description\": \"The human-readable name of the loan product or form\"\n },\n \"templateIcon\": {\n \"type\": \"string\",\n \"description\": \"Icon identifier or path for the form template (used in FinSys editor)\"\n },\n \"categories\": {\n \"type\": \"array\",\n \"description\": \"Category definitions for field organization and grouping\",\n \"items\": {\n \"$ref\": \"#/definitions/category\"\n }\n },\n \"fields\": {\n \"type\": \"object\",\n \"description\": \"Master field definitions keyed by field name\",\n \"additionalProperties\": {\n \"$ref\": \"#/definitions/fieldData\"\n }\n },\n \"pages\": {\n \"type\": \"array\",\n \"description\": \"Ordered list of pages in the form wizard. Optional for FinSys editor mode.\",\n \"items\": {\n \"$ref\": \"#/definitions/pageConfig\"\n }\n }\n },\n \"required\": [\"categories\", \"fields\", \"pages\"],\n \"definitions\": {\n \"category\": {\n \"type\": \"object\",\n \"description\": \"A category for grouping related form fields\",\n \"properties\": {\n \"id\": { \n \"type\": \"string\",\n \"description\": \"Unique identifier for the category (string)\" \n },\n \"name\": { \"type\": \"string\", \"description\": \"Display name for the category heading\" }\n },\n \"required\": [\"id\", \"name\"]\n },\n \"choice\": {\n \"type\": \"object\",\n \"description\": \"A selectable option for dropdown or radiogroup fields\",\n \"properties\": {\n \"value\": { \"type\": \"string\", \"description\": \"Value submitted when this choice is selected\" },\n \"text\": { \"type\": \"string\", \"description\": \"Display text for this choice\" }\n },\n \"required\": [\"value\", \"text\"]\n },\n \"validator\": {\n \"type\": \"object\",\n \"description\": \"Validation rule for a form field\",\n \"properties\": {\n \"type\": { \n \"type\": \"string\",\n \"enum\": [\"regex\", \"email\", \"numeric\", \"text\", \"expression\", \"answercount\", \"custom\"],\n \"description\": \"Type of validation to perform\"\n },\n \"text\": { \"type\": \"string\", \"description\": \"Error message to display on validation failure\" },\n \"regex\": { \"type\": \"string\", \"description\": \"Regular expression pattern (for type=regex)\" },\n \"minValue\": { \"type\": \"number\", \"description\": \"Minimum numeric value (for type=numeric)\" },\n \"maxValue\": { \"type\": \"number\", \"description\": \"Maximum numeric value (for type=numeric)\" },\n \"minLength\": { \"type\": \"integer\", \"description\": \"Minimum text length (for type=text)\" },\n \"maxLength\": { \"type\": \"integer\", \"description\": \"Maximum text length (for type=text)\" },\n \"minCount\": { \"type\": \"integer\", \"description\": \"Minimum selection count (for type=answercount)\" },\n \"maxCount\": { \"type\": \"integer\", \"description\": \"Maximum selection count (for type=answercount)\" },\n \"expression\": { \"type\": \"string\", \"description\": \"SurveyJS expression for custom validation\" },\n \"validator\": { \"type\": \"string\", \"description\": \"Name of the custom validator function (for type=custom)\" }\n },\n \"required\": [\"type\"]\n },\n \"fieldData\": {\n \"type\": \"object\",\n \"description\": \"Definition of a form field\",\n \"properties\": {\n \"name\": { \n \"type\": \"string\", \n \"description\": \"Field name (optional in fields{} since it's the key, required in arrays)\"\n },\n \"displayName\": { \n \"type\": \"string\",\n \"description\": \"Human-readable label for the field\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"text\", \"number\", \"email\", \"file\", \"dropdown\", \"checkbox\", \"boolean\", \"comment\", \"radiogroup\", \"range\", \"html\", \"slider\"],\n \"description\": \"Field type determining rendering and behavior\"\n },\n \"inputType\": { \n \"type\": \"string\", \n \"enum\": [\"text\", \"number\", \"tel\", \"date\", \"email\", \"password\", \"url\"],\n \"description\": \"HTML input type override for text fields\" \n },\n \"category\": { \n \"type\": \"string\",\n \"description\": \"Category ID this field belongs to (string to match category.id)\" \n },\n \"categoryId\": { \n \"type\": \"integer\",\n \"description\": \"Legacy integer category ID (deprecated, prefer 'category')\"\n },\n \"maxLength\": { \"type\": [\"integer\", \"string\"], \"description\": \"Maximum character length\" },\n \"min\": { \"type\": [\"integer\", \"string\"], \"description\": \"Minimum value for numeric/slider fields\" },\n \"max\": { \"type\": [\"integer\", \"string\"], \"description\": \"Maximum value for numeric/slider fields\" },\n \"step\": { \"type\": \"number\", \"description\": \"Step increment for slider/range fields\" },\n \"html\": { \"type\": \"string\", \"description\": \"HTML content for type=html fields\" },\n \"choices\": {\n \"type\": \"array\",\n \"description\": \"Options for dropdown or radiogroup fields\",\n \"items\": { \"$ref\": \"#/definitions/choice\" }\n },\n \"validators\": {\n \"type\": \"array\",\n \"description\": \"Validation rules to apply to this field\",\n \"items\": { \"$ref\": \"#/definitions/validator\" }\n },\n \"visible\": { \n \"type\": \"boolean\", \n \"default\": true,\n \"description\": \"Whether the field is visible\"\n },\n \"visibleIf\": { \n \"type\": \"string\", \n \"description\": \"SurveyJS expression for conditional visibility\" \n },\n \"required\": { \n \"type\": \"boolean\",\n \"description\": \"Whether the field is required for form submission\"\n },\n \"isRequired\": { \n \"type\": \"boolean\", \n \"description\": \"Alias for 'required' (SurveyJS compatibility)\" \n },\n \"placeholder\": { \n \"type\": \"string\",\n \"description\": \"Placeholder text shown in empty field\"\n },\n \"defaultValue\": { \n \"type\": [\"string\", \"number\", \"boolean\", \"array\"],\n \"description\": \"Default value for the field\"\n },\n \"readOnly\": { \n \"type\": \"boolean\",\n \"description\": \"Whether the field is read-only\"\n },\n \"startWithNewLine\": { \n \"type\": \"boolean\",\n \"default\": true,\n \"description\": \"If false, field appears on same line as previous field\" \n },\n \"enableIf\": { \n \"type\": \"string\", \n \"description\": \"SurveyJS expression for conditional enable/disable\" \n },\n \"titleLocation\": { \n \"type\": \"string\", \n \"enum\": [\"default\", \"top\", \"bottom\", \"left\", \"hidden\"],\n \"description\": \"Position of the field label\"\n },\n \"ihs_column_names\": {\n \"type\": \"array\",\n \"description\": \"FinSys IHS column mappings for file fields (used for data extraction)\",\n \"items\": { \"type\": \"string\" }\n },\n \"requiredForEvaluation\": { \n \"type\": \"boolean\",\n \"default\": true,\n \"description\": \"Whether this field is required for loan evaluation (FinSys specific)\"\n }\n },\n \"required\": [\"type\"]\n },\n \"fieldReference\": {\n \"description\": \"Reference to a field in a page, supporting simple refs, refs with overrides, or inline definitions\",\n \"oneOf\": [\n { \n \"type\": \"string\", \n \"description\": \"Simple field name reference to a field defined in 'fields'\" \n },\n {\n \"type\": \"object\",\n \"description\": \"Field reference with optional property overrides\",\n \"properties\": {\n \"ref\": { \"type\": \"string\", \"description\": \"Reference to field name in 'fields' object\" },\n \"displayName\": { \"type\": \"string\", \"description\": \"Override display name for this page\" },\n \"type\": { \"type\": \"string\", \"description\": \"Override field type for this usage\" },\n \"defaultValue\": { \"type\": [\"string\", \"number\", \"boolean\", \"array\"] },\n \"readOnly\": { \"type\": \"boolean\" },\n \"visible\": { \"type\": \"boolean\" },\n \"visibleIf\": { \"type\": \"string\" },\n \"required\": { \"type\": \"boolean\" },\n \"min\": { \"type\": [\"integer\", \"string\"] },\n \"max\": { \"type\": [\"integer\", \"string\"] },\n \"choices\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/definitions/choice\" } }\n },\n \"required\": [\"ref\"]\n },\n {\n \"type\": \"object\",\n \"description\": \"Inline field definition (page-specific field not in master 'fields')\",\n \"properties\": {\n \"definition\": { \n \"allOf\": [\n { \"$ref\": \"#/definitions/fieldData\" },\n { \n \"type\": \"object\",\n \"properties\": {\n \"name\": { \"type\": \"string\" }\n },\n \"required\": [\"name\"]\n }\n ]\n }\n },\n \"required\": [\"definition\"]\n }\n ]\n },\n \"pageConfig\": {\n \"type\": \"object\",\n \"description\": \"Configuration for a single page/step in the form wizard\",\n \"properties\": {\n \"id\": { \"type\": \"string\", \"description\": \"Unique page identifier\" },\n \"title\": { \"type\": \"string\", \"description\": \"Page title displayed to user\" },\n \"description\": { \"type\": \"string\", \"description\": \"Optional page description or instructions\" },\n \"showTOC\": { \"type\": \"boolean\", \"default\": false, \"description\": \"Show table of contents\" },\n \"showProgressBar\": { \"type\": \"boolean\", \"default\": false, \"description\": \"Show progress indicator\" },\n \"showCategoryHeadings\": { \n \"type\": \"boolean\", \n \"default\": false,\n \"description\": \"Render category names as section headings when category changes between fields\"\n },\n \"layout\": { \n \"type\": \"string\", \n \"enum\": [\"default\", \"grid\", \"vertical\"],\n \"description\": \"Layout mode for the page\"\n },\n \"fields\": {\n \"type\": \"array\",\n \"description\": \"Ordered list of field references to display on this page\",\n \"items\": { \"$ref\": \"#/definitions/fieldReference\" }\n }\n },\n \"required\": [\"id\", \"fields\"]\n }\n }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class FormFieldCategory {\n private _id: string;\n private _name: string;\n\n constructor(id: string | number, name: string) {\n this._id = String(id);\n this._name = name;\n }\n\n get id(): string {\n return this._id;\n }\n\n get name(): string {\n return this._name;\n }\n\n set name(value: string) {\n this._name = value;\n }\n\n toJSON() {\n return {\n id: this._id,\n name: this._name,\n };\n }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { FieldData, Choice, Validator } from \"./survey-generator.js\";\n\nexport enum FieldType {\n FILE = 'file',\n TEXT = 'text',\n DROPDOWN = 'dropdown',\n BOOLEAN = 'boolean',\n CHECKBOX = 'checkbox',\n RADIOGROUP = 'radiogroup',\n SLIDER = 'slider',\n HTML = 'html',\n TAGBOX = 'tagbox',\n NUMBER = 'number',\n EMAIL = 'email',\n COMMENT = 'comment',\n RANGE = 'range',\n UNKNOWN = 'unknown',\n}\n\nexport interface FormFieldType {\n name: string;\n displayName: string;\n}\n\nexport interface FormFieldInputType {\n name: string;\n displayName: string;\n}\n\nexport interface FormFieldTypeDefinitions {\n version: number;\n types: FormFieldType[];\n input_types: FormFieldInputType[];\n}\n\nexport interface DropdownOption {\n id: number;\n name: string;\n displayName: string;\n choices: Choice[];\n}\n\nexport interface EditorValidator {\n id: number;\n displayName: string;\n class: string;\n description: string;\n isRequired: boolean;\n validators: Validator[];\n}\n\nfunction toFieldType(value: string): FieldType {\n const typeMap: Record<string, FieldType> = {\n [FieldType.FILE]: FieldType.FILE,\n [FieldType.TEXT]: FieldType.TEXT,\n [FieldType.DROPDOWN]: FieldType.DROPDOWN,\n [FieldType.BOOLEAN]: FieldType.BOOLEAN,\n [FieldType.CHECKBOX]: FieldType.CHECKBOX,\n [FieldType.RADIOGROUP]: FieldType.RADIOGROUP,\n [FieldType.SLIDER]: FieldType.SLIDER,\n [FieldType.HTML]: FieldType.HTML,\n [FieldType.TAGBOX]: FieldType.TAGBOX,\n [FieldType.NUMBER]: FieldType.NUMBER,\n [FieldType.EMAIL]: FieldType.EMAIL,\n [FieldType.COMMENT]: FieldType.COMMENT,\n [FieldType.RANGE]: FieldType.RANGE,\n };\n return typeMap[value] || FieldType.UNKNOWN;\n}\n\nexport default abstract class FormField {\n fieldObject: FieldData;\n\n constructor(name: string, displayName: string, type: string, category: string) {\n this.fieldObject = {\n name,\n displayName,\n type,\n category,\n };\n }\n\n static fromObject(fieldObject: FieldData): FormField {\n if (!fieldObject.name) {\n throw new Error('Field name is required');\n }\n\n if (!fieldObject.displayName || !fieldObject.category) {\n throw new Error(\n `Invalid field object: '${fieldObject.name}' field missing displayName or category`\n );\n }\n\n const identifiedType = toFieldType(fieldObject.type as string);\n if (identifiedType === FieldType.UNKNOWN) {\n throw new Error(\n `'${fieldObject.name}' field has unsupported or missing type: ${fieldObject.type}`\n );\n }\n\n if (\n fieldObject.choices &&\n !['dropdown', 'checkbox', 'radiogroup', 'tagbox'].includes(fieldObject.type as string)\n ) {\n // Logic remained as is\n }\n\n if (fieldObject.type === 'dropdown' && !fieldObject.choices) {\n throw new Error(\n `Invalid field object: '${fieldObject.name}' field has type dropdown, but does not have choices`\n );\n }\n\n let field: FormField;\n if (fieldObject.type === 'file') {\n field = new FileFormField(\n fieldObject.name,\n fieldObject.displayName || fieldObject.name,\n fieldObject.type,\n String(fieldObject.category),\n fieldObject.ihs_column_names || []\n );\n } else {\n field = new BasicFormField(\n fieldObject.name,\n fieldObject.displayName || fieldObject.name,\n fieldObject.type || 'text',\n String(fieldObject.category)\n );\n }\n\n field.fieldObject = { ...fieldObject };\n field.fieldObject.category = String(field.fieldObject.category);\n\n // Remove legacy categoryId property\n delete (field.fieldObject as any).categoryId;\n\n return field;\n }\n\n abstract getFieldNames(): string[];\n\n protected cleanObject(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n\n let target = obj;\n if (typeof obj.toJSON === 'function' && obj !== this) {\n target = obj.toJSON();\n }\n\n if (Array.isArray(target)) {\n return target.map((v: any) => (typeof v === 'object' ? this.cleanObject(v) : v));\n }\n\n if (typeof target !== 'object') return target;\n\n const cleaned: any = {};\n Object.keys(target).forEach((key) => {\n const value = target[key];\n if (value !== null && value !== undefined && value !== '') {\n if (typeof value === 'object') {\n cleaned[key] = this.cleanObject(value);\n } else {\n cleaned[key] = value;\n }\n }\n });\n return cleaned;\n }\n\n toJSON() {\n return this.cleanObject({ ...this.fieldObject });\n }\n\n get displayName(): string {\n return this.fieldObject.displayName || this.fieldObject.name || '';\n }\n\n set displayName(newDisplayName: string) {\n this.fieldObject.displayName = newDisplayName;\n }\n\n get name(): string {\n return this.fieldObject.name || '';\n }\n\n get type(): FieldType {\n return toFieldType(this.fieldObject.type as string);\n }\n\n get inputType(): string {\n return this.fieldObject.inputType ?? '';\n }\n\n get categoryId(): string {\n return String(this.fieldObject.category || '');\n }\n\n set categoryId(categoryId: string) {\n this.fieldObject.category = categoryId;\n }\n\n get defaultValue(): any {\n return this.fieldObject.defaultValue;\n }\n\n set defaultValue(value: any) {\n this.fieldObject.defaultValue = value;\n }\n\n get placeholder(): string | undefined {\n return this.fieldObject.placeholder;\n }\n\n get validators(): Validator[] | undefined {\n return this.fieldObject.validators as Validator[];\n }\n\n get choices(): Choice[] {\n return (this.fieldObject.choices as Choice[]) ?? [];\n }\n\n set choices(choices: Choice[]) {\n this.fieldObject.choices = choices;\n }\n\n get visible(): boolean {\n return this.fieldObject.visible ?? true;\n }\n\n get visibleIf(): string | undefined {\n return this.fieldObject.visibleIf;\n }\n\n get isRequired(): boolean {\n return this.fieldObject.required ?? this.fieldObject.isRequired ?? true;\n }\n\n get startWithNewLine(): boolean {\n return this.fieldObject.startWithNewLine ?? true;\n }\n\n get requiredForEvaluation(): boolean {\n return this.fieldObject.requiredForEvaluation ?? true;\n }\n\n get maxLength(): number | undefined {\n return typeof this.fieldObject.maxLength === 'string'\n ? Number.parseInt(this.fieldObject.maxLength)\n : this.fieldObject.maxLength;\n }\n\n get min(): number | undefined {\n return typeof this.fieldObject.min === 'string'\n ? Number.parseFloat(this.fieldObject.min)\n : this.fieldObject.min;\n }\n\n get max(): number | undefined {\n return typeof this.fieldObject.max === 'string'\n ? Number.parseFloat(this.fieldObject.max)\n : this.fieldObject.max;\n }\n}\n\nexport class BasicFormField extends FormField {\n constructor(name: string, displayName: string, type: string, category: string) {\n super(name, displayName, type, category);\n }\n\n getFieldNames(): string[] {\n if (this.fieldObject.requiredForEvaluation === false) {\n return [];\n }\n\n return [this.fieldObject.name!];\n }\n}\n\nexport class FileFormField extends FormField {\n constructor(\n name: string,\n displayName: string,\n type: string,\n category: string,\n ihs_column_names: string[]\n ) {\n super(name, displayName, type, category);\n this.fieldObject.ihs_column_names = ihs_column_names;\n }\n\n getFieldNames(): string[] {\n if (this.fieldObject.requiredForEvaluation === false) {\n return [];\n }\n\n return this.fieldObject.ihs_column_names || [];\n }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FormFieldCategory } from \"./form-field-category.js\";\nimport FormField from \"./form-field.js\";\nimport type { FieldData, PageConfig, UnifiedFormConfig } from \"./survey-generator.js\";\nimport { validateFormConfig } from \"./validator.js\";\nimport semver from \"semver\";\n\nexport class FormSpec {\n private _categories: FormFieldCategory[] = [];\n private _fields: FormField[] = [];\n private _displayName: string;\n private _templateIcon?: string;\n private _schemaVersion: string;\n private _pages: PageConfig[] = [];\n\n constructor(\n displayName: string,\n categories: FormFieldCategory[],\n fields: FormField[],\n pages: PageConfig[] = [],\n templateIcon?: string,\n schemaVersion: string = FormSpec.MAX_PARSER_SCHEMA_VERSION\n ) {\n this._displayName = displayName;\n this._templateIcon = templateIcon;\n this._categories = categories;\n this._fields = fields;\n this._pages = pages;\n this._schemaVersion = schemaVersion;\n }\n\n static readonly MIN_PARSER_SCHEMA_VERSION = 'v1.0.0';\n static readonly MAX_PARSER_SCHEMA_VERSION = 'v2.0.0';\n\n get fieldNames(): string[] {\n let names: string[] = [];\n\n this.fields.forEach((field) => {\n names = names.concat(field.getFieldNames());\n });\n\n return names;\n }\n\n get schemaVersion(): string {\n return this._schemaVersion;\n }\n\n get requiresUpgrade(): boolean {\n return semver.lt(this._schemaVersion, FormSpec.MAX_PARSER_SCHEMA_VERSION);\n }\n\n upgradeToV2(): void {\n this._schemaVersion = FormSpec.MAX_PARSER_SCHEMA_VERSION;\n }\n\n get displayName(): string {\n return this._displayName;\n }\n\n set displayName(newDisplayName: string) {\n this._displayName = newDisplayName;\n }\n\n get templateIcon(): string | undefined {\n return this._templateIcon;\n }\n\n set templateIcon(value: string | undefined) {\n this._templateIcon = value;\n }\n\n get categories(): FormFieldCategory[] {\n return this._categories;\n }\n\n set categories(categories: FormFieldCategory[]) {\n this._categories = categories;\n }\n\n get fields(): FormField[] {\n return this._fields;\n }\n\n set fields(fields: FormField[]) {\n this._fields = fields;\n }\n\n get pages(): PageConfig[] {\n return this._pages;\n }\n\n set pages(value: PageConfig[]) {\n this._pages = value;\n }\n\n addField(field: FormField): void {\n this._fields.push(field);\n }\n\n updateField(field: FormField): void {\n const index = this._fields.findIndex((f) => f.name === field.name);\n if (index !== -1) {\n this._fields[index] = field;\n } else {\n throw new Error(\n `${field.name} not found. Form Spec of ${this._displayName} cannot update ${field.name}`\n );\n }\n }\n\n removeField(fieldName: string): void {\n const fieldIndex = this._fields.findIndex((f) => f.name === fieldName);\n if (fieldIndex !== -1) {\n this._fields.splice(fieldIndex, 1);\n\n this._pages.forEach((page) => {\n page.fields = page.fields.filter((fieldRef) => {\n let refName: string | undefined;\n if (typeof fieldRef === 'string') {\n refName = fieldRef;\n } else if ('ref' in fieldRef) {\n refName = fieldRef.ref;\n } else if ('definition' in fieldRef) {\n refName = fieldRef.definition.name;\n }\n return refName !== fieldName;\n });\n });\n }\n }\n\n getFieldsByCategory(categoryName: string): FormField[] {\n const foundCategory = this.categories.find((category) => category.name === categoryName);\n\n if (!foundCategory) {\n return [];\n }\n\n return this._fields.filter((field) => field.categoryId === foundCategory.id);\n }\n\n validate(): { valid: boolean; errors?: any[] } {\n const config = this.toJSON() as UnifiedFormConfig;\n const result = validateFormConfig(config);\n const errors: any[] = [];\n\n if (result.errors) {\n result.errors.forEach((err: any) => {\n let path = err.instancePath || err.dataPath || '';\n path = path.replace(/^\\//, '').replace(/\\//g, '.');\n const prefix = path ? `${path}: ` : '';\n errors.push({\n message: `${prefix}${err.message}`,\n path: path,\n });\n });\n }\n\n if (!this._displayName || this._displayName.trim() === '') {\n errors.push({\n message: 'displayName: Form display name is required',\n path: 'displayName',\n });\n }\n\n const categoryIds = new Set(this._categories.map((c) => String(c.id)));\n this._fields.forEach((field) => {\n if (field.categoryId && !categoryIds.has(String(field.categoryId))) {\n errors.push({\n message: `fields.${field.name}.category: references non-existent category '${field.categoryId}'`,\n path: `fields.${field.name}.category`,\n });\n }\n });\n\n const fieldNames = new Set(this._fields.map((f) => f.name));\n this._pages.forEach((page, pageIndex) => {\n page.fields.forEach((fieldRef, fieldIndex) => {\n let refName: string | undefined;\n if (typeof fieldRef === 'string') {\n refName = fieldRef;\n } else if (fieldRef && (fieldRef as any).ref) {\n refName = (fieldRef as any).ref;\n } else if (fieldRef && (fieldRef as any).definition) {\n refName = (fieldRef as any).definition.name;\n }\n\n if (refName && !fieldNames.has(refName)) {\n errors.push({\n message: `pages.${pageIndex}.fields.${fieldIndex}: references non-existent field '${refName}'`,\n path: `pages.${pageIndex}.fields.${fieldIndex}`,\n });\n }\n });\n });\n\n return {\n valid: result.valid && errors.length === (result.errors?.length || 0),\n errors: errors.length > 0 ? errors : undefined,\n };\n }\n\n private cleanObject(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n\n let target = obj;\n if (typeof obj.toJSON === 'function' && obj !== this) {\n target = obj.toJSON();\n }\n\n if (Array.isArray(target)) {\n return target.map((v: any) => (typeof v === 'object' ? this.cleanObject(v) : v));\n }\n\n if (typeof target !== 'object') return target;\n\n const cleaned: any = {};\n Object.keys(target).forEach((key) => {\n const value = target[key];\n if (value !== null && value !== undefined && value !== '') {\n if (typeof value === 'object') {\n cleaned[key] = this.cleanObject(value);\n } else {\n cleaned[key] = value;\n }\n }\n });\n return cleaned;\n }\n\n toJSON(): object {\n const fieldsMap: Record<string, any> = {};\n this._fields.forEach((field) => {\n fieldsMap[field.name] = field.toJSON();\n delete fieldsMap[field.name].name;\n });\n\n return this.cleanObject({\n $schema:\n '../../../node_modules/@finsys/core/dist/schema/unified-form.schema.json',\n schemaVersion: this._schemaVersion,\n displayName: this._displayName,\n templateIcon: this._templateIcon,\n categories: this._categories,\n fields: fieldsMap,\n pages: this._pages,\n });\n }\n\n static fromJSON(jsonString: string): FormSpec {\n let jsonData: any;\n try {\n jsonData = JSON.parse(jsonString);\n } catch (error) {\n console.error(`Error parsing JSON for Loantype with string: ${jsonString}`);\n throw error;\n }\n\n if (!jsonData.schemaVersion) {\n throw new Error('Invalid JSON: schemaVersion is missing or invalid');\n }\n\n if (semver.lt(jsonData.schemaVersion, FormSpec.MIN_PARSER_SCHEMA_VERSION)) {\n throw new Error(\n `This form spec file is using an outdated schema version ${jsonData.schemaVersion}. Minimum supported version is ${FormSpec.MIN_PARSER_SCHEMA_VERSION}`\n );\n }\n\n if (!jsonData.displayName) {\n throw new Error('Invalid JSON: displayName is missing or invalid');\n }\n\n if (!jsonData.categories) {\n throw new Error('Invalid JSON: categories is missing or invalid');\n }\n\n if (!jsonData.fields) {\n throw new Error('Invalid JSON: fields is missing or invalid');\n }\n\n if (!jsonData.pages || jsonData.pages.length === 0) {\n if (semver.satisfies(jsonData.schemaVersion, '>=2.0.0')) {\n console.warn(\n `v2.0.0 template ${jsonData.displayName} is missing pages. Generating default pages.`\n );\n }\n }\n\n let fieldObjects: FieldData[] = [];\n if (Array.isArray(jsonData.fields)) {\n fieldObjects = jsonData.fields;\n } else if (typeof jsonData.fields === 'object' && jsonData.fields !== null) {\n fieldObjects = Object.entries(jsonData.fields).map(([name, data]: [string, any]) => {\n return {\n name,\n ...data,\n };\n });\n }\n\n fieldObjects.forEach((f: any) => {\n if (f.categoryId && !f.category) {\n f.category = String(f.categoryId);\n } else if (f.category) {\n f.category = String(f.category);\n }\n });\n\n const categories = (jsonData.categories || []).map((cat: any) => {\n return new FormFieldCategory(String(cat.id), cat.name);\n });\n\n const fields: FormField[] = fieldObjects.map((fieldObject) => {\n return FormField.fromObject(fieldObject);\n });\n\n let pages = jsonData.pages || [];\n if (pages.length === 0) {\n const categoriesMap: Record<string, string[]> = {};\n fields.forEach((f) => {\n const catId = f.categoryId;\n if (!categoriesMap[catId]) {\n categoriesMap[catId] = [];\n }\n categoriesMap[catId].push(f.name);\n });\n\n pages = categories\n .map((cat: FormFieldCategory) => ({\n id: `page-${cat.id}`,\n title: cat.name,\n fields: categoriesMap[cat.id] || [],\n }))\n .filter((p: PageConfig) => p.fields.length > 0);\n }\n\n return new FormSpec(\n jsonData.displayName,\n categories,\n fields,\n pages,\n jsonData.templateIcon,\n jsonData.schemaVersion\n );\n }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Validator } from \"./survey-generator.js\";\nimport type { EditorValidator } from \"./form-field.js\";\n\nexport interface FormValidatorDefinitions {\n options: EditorValidator[];\n version: number;\n}\n\nexport class FormFieldValidator implements EditorValidator {\n id: number;\n displayName: string;\n class: string;\n description: string;\n isRequired: boolean;\n validators: Validator[];\n\n constructor(validatorData: EditorValidator) {\n this.id = validatorData.id;\n this.displayName = validatorData.displayName;\n this.class = validatorData.class;\n this.description = validatorData.description;\n this.isRequired = validatorData.isRequired;\n this.validators = validatorData.validators;\n }\n\n validate(value: any): boolean {\n for (const validator of this.validators) {\n switch (validator.type) {\n case 'numeric':\n if (!this.validateNumeric(value, validator.minValue, validator.maxValue)) {\n return false;\n }\n break;\n case 'text':\n if (!this.validateText(value, validator.minLength, validator.maxLength)) {\n return false;\n }\n break;\n }\n }\n return true;\n }\n\n private validateNumeric(value: number, min?: number, max?: number): boolean {\n if (min !== undefined && value < min) return false;\n if (max !== undefined && value > max) return false;\n return true;\n }\n\n private validateText(value: string, minLength?: number, maxLength?: number): boolean {\n if (minLength !== undefined && value.length < minLength) return false;\n if (maxLength !== undefined && value.length > maxLength) return false;\n return true;\n }\n}\n","{\n \"schemaVersion\": \"v2.0.0\",\n \"categories\": [\n {\n \"id\": \"1\",\n \"name\": \"Basic Information\"\n },\n {\n \"id\": \"2\",\n \"name\": \"Personal Information\"\n },\n {\n \"id\": \"3\",\n \"name\": \"Company Information\"\n },\n {\n \"id\": \"4\",\n \"name\": \"Financial Information\"\n },\n {\n \"id\": \"5\",\n \"name\": \"Employment Information\"\n },\n {\n \"id\": \"6\",\n \"name\": \"Consent and Legal Agreements\"\n },\n {\n \"id\": \"7\",\n \"name\": \"Address Information\"\n },\n {\n \"id\": \"8\",\n \"name\": \"Contact Information\"\n },\n {\n \"id\": \"9\",\n \"name\": \"Declarations\"\n },\n {\n \"id\": \"10\",\n \"name\": \"Account Information\"\n },\n {\n \"id\": \"11\",\n \"name\": \"Loan Information\"\n },\n {\n \"id\": \"12\",\n \"name\": \"Vehicle Information\"\n },\n {\n \"id\": \"13\",\n \"name\": \"Document Upload\"\n }\n ],\n \"fields\": [\n {\n \"name\": \"fullName\",\n \"displayName\": \"Full Name\",\n \"placeholder\": \"E.g. John Doe\",\n \"type\": \"text\",\n \"maxLength\": 80,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please make sure the name doesn't include extra spaces, numbers, or invalid symbols\",\n \"regex\": \"^[A-Za-z'-]+(?:\\\\s[A-Za-z'-]+)*\\\\s?[A-Za-z'-]+$\"\n }\n ],\n \"category\": \"1\"\n },\n {\n \"name\": \"email\",\n \"displayName\": \"Email\",\n \"placeholder\": \"E.g. johndoe@example.com\",\n \"type\": \"text\",\n \"inputType\": \"email\",\n \"maxLength\": 65,\n \"validators\": [\n {\n \"type\": \"email\",\n \"text\": \"Value must be a valid email\"\n }\n ],\n \"category\": \"1\"\n },\n {\n \"name\": \"mobilePhoneNoAreaCode\",\n \"displayName\": \"Mobile Phone Number Area Code\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"1\"\n },\n {\n \"name\": \"mobilePhoneNo\",\n \"displayName\": \"Mobile Phone Number\",\n \"placeholder\": \"Mobile Phone Number\",\n \"type\": \"text\",\n \"inputType\": \"tel\",\n \"maxLength\": 12,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"A valid Malaysia phone number is required.\",\n \"regex\": \"^(011[0-9]{8}|01[2346789][0-9]{7}|[2-9][0-9]{0,8})$\"\n }\n ],\n \"category\": \"1\"\n },\n {\n \"type\": \"text\",\n \"name\": \"idNumber\",\n \"title\": \"ID Number\",\n \"placeholder\": \"E.g. 700513065143\",\n \"isRequired\": true,\n \"displayName\": \"IC Number\",\n \"maxLength\": 25,\n \"inputType\": \"text\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d{12}$\",\n \"text\": \"Please enter exactly 12 digits numbers\"\n },\n {\n \"type\": \"regex\",\n \"regex\": \"^(\\\\d{2})(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])\\\\d{6}$\",\n \"text\": \"First 6 digits must be valid birth year (00-99), month (01-12), and day (01-31)\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"dateOfBirth\",\n \"displayName\": \"Date of Birth\",\n \"type\": \"text\",\n \"inputType\": \"date\",\n \"visible\": false,\n \"category\": \"2\"\n },\n {\n \"name\": \"companyName\",\n \"displayName\": \"Company Name\",\n \"type\": \"text\",\n \"category\": \"3\"\n },\n {\n \"name\": \"companyRegNo\",\n \"displayName\": \"Company Registration Number\",\n \"type\": \"text\",\n \"category\": \"3\"\n },\n {\n \"name\": \"natureOfBusiness\",\n \"displayName\": \"Nature of Business\",\n \"placeholder\": \"Select your Nature of Business\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Manufacturing\",\n \"text\": \"Manufacturing\"\n },\n {\n \"value\": \"Services\",\n \"text\": \"Services\"\n },\n {\n \"value\": \"Others\",\n \"text\": \"Others\"\n }\n ],\n \"maxLength\": 80,\n \"category\": \"3\"\n },\n {\n \"name\": \"officeFacilityType\",\n \"displayName\": \"Office Facility Type\",\n \"placeholder\": \"Select your facility type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Owned\",\n \"text\": \"Owned\"\n },\n {\n \"value\": \"Rented\",\n \"text\": \"Rented\"\n }\n ],\n \"maxLength\": 80,\n \"category\": \"3\"\n },\n {\n \"name\": \"companySize\",\n \"displayName\": \"Company Size\",\n \"placeholder\": \"Select your company size\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"selfEmplyed\",\n \"text\": \"Self-employed\"\n },\n {\n \"value\": \"1-10\",\n \"text\": \"1-10\"\n },\n {\n \"value\": \"11-20\",\n \"text\": \"11-20\"\n },\n {\n \"value\": \"21-30\",\n \"text\": \"21-30\"\n },\n {\n \"value\": \"31-50\",\n \"text\": \"31-50\"\n },\n {\n \"value\": \"51-100\",\n \"text\": \"51-100\"\n },\n {\n \"value\": \"101-500\",\n \"text\": \"101-500\"\n },\n {\n \"value\": \"500+\",\n \"text\": \"500+\"\n }\n ],\n \"category\": \"3\"\n },\n {\n \"name\": \"facilityAddress\",\n \"displayName\": \"Facility Address\",\n \"type\": \"text\",\n \"category\": \"3\"\n },\n {\n \"name\": \"companyEntityType\",\n \"displayName\": \"Company Entity Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Branch office\",\n \"text\": \"Branch office\"\n },\n {\n \"value\": \"Company Limited by guarantee\",\n \"text\": \"Company Limited by guarantee\"\n },\n {\n \"value\": \"Enterprise or Sole Proprietorship\",\n \"text\": \"Enterprise or Sole Proprietorship\"\n },\n {\n \"value\": \"Foreign Companies\",\n \"text\": \"Foreign Companies\"\n },\n {\n \"value\": \"Limited Liability Partnership\",\n \"text\": \"Limited Liability Partnership\"\n },\n {\n \"value\": \"Partnership\",\n \"text\": \"Partnership\"\n },\n {\n \"value\": \"Private Limited Company (Sdn. Bhd.)\",\n \"text\": \"Private Limited Company (Sdn. Bhd.)\"\n },\n {\n \"value\": \"Public Limited Company (Bhd.)\",\n \"text\": \"Public Limited Company (Bhd.)\"\n },\n {\n \"value\": \"Proprietorship/ Partnership\",\n \"text\": \"Proprietorship/ Partnership\"\n }\n ],\n \"category\": \"3\"\n },\n {\n \"name\": \"tnbTariff\",\n \"displayName\": \"TNB Tariff\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"B\",\n \"text\": \"B\"\n },\n {\n \"value\": \"C1\",\n \"text\": \"C1\"\n },\n {\n \"value\": \"C2\",\n \"text\": \"C2\"\n },\n {\n \"value\": \"D\",\n \"text\": \"D\"\n },\n {\n \"value\": \"E1\",\n \"text\": \"E1\"\n },\n {\n \"value\": \"E2\",\n \"text\": \"E2\"\n },\n {\n \"value\": \"E3\",\n \"text\": \"E3\"\n },\n {\n \"value\": \"H\",\n \"text\": \"H\"\n },\n {\n \"value\": \"H1\",\n \"text\": \"H1\"\n },\n {\n \"value\": \"H2\",\n \"text\": \"H2\"\n }\n ],\n \"category\": \"4\"\n },\n {\n \"name\": \"avgMaximumDemand\",\n \"displayName\": \"Average Maximum Demand\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"ctRatio\",\n \"displayName\": \"CT Ratio\",\n \"type\": \"text\",\n \"category\": \"4\"\n },\n {\n \"name\": \"buildingType\",\n \"displayName\": \"Building Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Warehouse/Factory\",\n \"text\": \"Warehouse/Factory\"\n },\n {\n \"value\": \"Office building/Shoplot\",\n \"text\": \"Office building/Shoplot\"\n },\n {\n \"value\": \"Shopping Mall/Complex\",\n \"text\": \"Shopping Mall/Complex\"\n },\n {\n \"value\": \"School\",\n \"text\": \"School\"\n },\n {\n \"value\": \"Other\",\n \"text\": \"Other\"\n }\n ],\n \"category\": \"3\"\n },\n {\n \"name\": \"tnbBills\",\n \"displayName\": \"TNB Bills\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"2\"\n },\n {\n \"name\": \"financingSelection\",\n \"displayName\": \"Financing Selection\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Loan\",\n \"text\": \"Loan\"\n },\n {\n \"value\": \"Leasing\",\n \"text\": \"Leasing\"\n },\n {\n \"value\": \"Extended Terms\",\n \"text\": \"Extended Terms\"\n }\n ],\n \"category\": \"4\"\n },\n {\n \"name\": \"businessSector\",\n \"displayName\": \"Business Sector\",\n \"type\": \"text\",\n \"category\": \"5\"\n },\n {\n \"name\": \"companyBackground\",\n \"displayName\": \"Company Background\",\n \"type\": \"text\",\n \"category\": \"3\"\n },\n {\n \"name\": \"isApplication\",\n \"displayName\": \"Is Application\",\n \"type\": \"boolean\",\n \"category\": \"6\"\n },\n {\n \"name\": \"isReview\",\n \"displayName\": \"Is Review\",\n \"type\": \"boolean\",\n \"category\": \"6\"\n },\n {\n \"name\": \"addressLine1\",\n \"displayName\": \"Address Line 1\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"addressLine2\",\n \"displayName\": \"Address Line 2\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"addressLine3\",\n \"displayName\": \"Address Line 3\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"addressType\",\n \"displayName\": \"Address Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"P\",\n \"text\": \"Permanent\"\n },\n {\n \"value\": \"O\",\n \"text\": \"Office\"\n },\n {\n \"value\": \"R\",\n \"text\": \"Residence\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"city\",\n \"displayName\": \"City\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"country\",\n \"displayName\": \"Country\",\n \"type\": \"dropdown\",\n \"titleLocation\": \"hidden\",\n \"placeholder\": \"Country\",\n \"choices\": [\n {\n \"text\": \"Afghanistan\",\n \"value\": \"AFG\"\n },\n {\n \"text\": \"Angola\",\n \"value\": \"ANG\"\n },\n {\n \"text\": \"Albania\",\n \"value\": \"ALB\"\n },\n {\n \"text\": \"Andorra\",\n \"value\": \"AND\"\n },\n {\n \"text\": \"United Arab Emirates\",\n \"value\": \"UAE\"\n },\n {\n \"text\": \"Argentina\",\n \"value\": \"ARG\"\n },\n {\n \"text\": \"Armenia\",\n \"value\": \"ARM\"\n },\n {\n \"text\": \"Antigua and Barbuda\",\n \"value\": \"ANT\"\n },\n {\n \"text\": \"Australia\",\n \"value\": \"AUS\"\n },\n {\n \"text\": \"Austria\",\n \"value\": \"AUT\"\n },\n {\n \"text\": \"Azerbaijan\",\n \"value\": \"AZE\"\n },\n {\n \"text\": \"Burundi\",\n \"value\": \"BDI\"\n },\n {\n \"text\": \"Belgium\",\n \"value\": \"BEL\"\n },\n {\n \"text\": \"Benin\",\n \"value\": \"BEN\"\n },\n {\n \"text\": \"Burkina Faso\",\n \"value\": \"BFA\"\n },\n {\n \"text\": \"Bangladesh\",\n \"value\": \"BGD\"\n },\n {\n \"text\": \"Bulgaria\",\n \"value\": \"BUL\"\n },\n {\n \"text\": \"Bahrain\",\n \"value\": \"BRN\"\n },\n {\n \"text\": \"Bahamas\",\n \"value\": \"BAH\"\n },\n {\n \"text\": \"Bosnia and Herzegovina\",\n \"value\": \"BIH\"\n },\n {\n \"text\": \"Belarus\",\n \"value\": \"BLR\"\n },\n {\n \"text\": \"Belize\",\n \"value\": \"BIZ\"\n },\n {\n \"text\": \"Bolivia\",\n \"value\": \"BOL\"\n },\n {\n \"text\": \"Brazil\",\n \"value\": \"BRA\"\n },\n {\n \"text\": \"Barbados\",\n \"value\": \"BAR\"\n },\n {\n \"text\": \"Brunei\",\n \"value\": \"BRU\"\n },\n {\n \"text\": \"Bhutan\",\n \"value\": \"BHU\"\n },\n {\n \"text\": \"Botswana\",\n \"value\": \"BOT\"\n },\n {\n \"text\": \"Central African Republic\",\n \"value\": \"CAF\"\n },\n {\n \"text\": \"Canada\",\n \"value\": \"CAN\"\n },\n {\n \"text\": \"Switzerland\",\n \"value\": \"CHE\"\n },\n {\n \"text\": \"Chile\",\n \"value\": \"CHI\"\n },\n {\n \"text\": \"China\",\n \"value\": \"CHN\"\n },\n {\n \"text\": \"Ivory Coast\",\n \"value\": \"CIV\"\n },\n {\n \"text\": \"Cameroon\",\n \"value\": \"CMR\"\n },\n {\n \"text\": \"DR Congo\",\n \"value\": \"COD\"\n },\n {\n \"text\": \"Republic of the Congo\",\n \"value\": \"CGO\"\n },\n {\n \"text\": \"Colombia\",\n \"value\": \"COL\"\n },\n {\n \"text\": \"Comoros\",\n \"value\": \"COM\"\n },\n {\n \"text\": \"Cape Verde\",\n \"value\": \"CPV\"\n },\n {\n \"text\": \"Costa Rica\",\n \"value\": \"CRC\"\n },\n {\n \"text\": \"Cuba\",\n \"value\": \"CUB\"\n },\n {\n \"text\": \"Cyprus\",\n \"value\": \"CYP\"\n },\n {\n \"text\": \"Czechia\",\n \"value\": \"CZE\"\n },\n {\n \"text\": \"Germany\",\n \"value\": \"DEU\"\n },\n {\n \"text\": \"Djibouti\",\n \"value\": \"DJI\"\n },\n {\n \"text\": \"Dominica\",\n \"value\": \"DMA\"\n },\n {\n \"text\": \"Denmark\",\n \"value\": \"DEN\"\n },\n {\n \"text\": \"Dominican Republic\",\n \"value\": \"DOM\"\n },\n {\n \"text\": \"Algeria\",\n \"value\": \"ALG\"\n },\n {\n \"text\": \"Ecuador\",\n \"value\": \"ECU\"\n },\n {\n \"text\": \"Egypt\",\n \"value\": \"EGY\"\n },\n {\n \"text\": \"Eritrea\",\n \"value\": \"ERI\"\n },\n {\n \"text\": \"Spain\",\n \"value\": \"ESP\"\n },\n {\n \"text\": \"Estonia\",\n \"value\": \"EST\"\n },\n {\n \"text\": \"Ethiopia\",\n \"value\": \"ETH\"\n },\n {\n \"text\": \"Finland\",\n \"value\": \"FIN\"\n },\n {\n \"text\": \"Fiji\",\n \"value\": \"FIJ\"\n },\n {\n \"text\": \"France\",\n \"value\": \"FRA\"\n },\n {\n \"text\": \"Micronesia\",\n \"value\": \"FSM\"\n },\n {\n \"text\": \"Gabon\",\n \"value\": \"GAB\"\n },\n {\n \"text\": \"United Kingdom\",\n \"value\": \"GBR\"\n },\n {\n \"text\": \"Georgia\",\n \"value\": \"GEO\"\n },\n {\n \"text\": \"Ghana\",\n \"value\": \"GHA\"\n },\n {\n \"text\": \"Guinea\",\n \"value\": \"GUI\"\n },\n {\n \"text\": \"Gambia\",\n \"value\": \"GAM\"\n },\n {\n \"text\": \"Equatorial Guinea\",\n \"value\": \"GEQ\"\n },\n {\n \"text\": \"Greece\",\n \"value\": \"GRE\"\n },\n {\n \"text\": \"Grenada\",\n \"value\": \"GRN\"\n },\n {\n \"text\": \"Guatemala\",\n \"value\": \"GUA\"\n },\n {\n \"text\": \"Guyana\",\n \"value\": \"GUY\"\n },\n {\n \"text\": \"Honduras\",\n \"value\": \"HON\"\n },\n {\n \"text\": \"Croatia\",\n \"value\": \"CRO\"\n },\n {\n \"text\": \"Haiti\",\n \"value\": \"HAI\"\n },\n {\n \"text\": \"Hungary\",\n \"value\": \"HUN\"\n },\n {\n \"text\": \"Indonesia\",\n \"value\": \"INA\"\n },\n {\n \"text\": \"India\",\n \"value\": \"IND\"\n },\n {\n \"text\": \"Ireland\",\n \"value\": \"IRL\"\n },\n {\n \"text\": \"Iran\",\n \"value\": \"IRI\"\n },\n {\n \"text\": \"Iraq\",\n \"value\": \"IRQ\"\n },\n {\n \"text\": \"Iceland\",\n \"value\": \"ISL\"\n },\n {\n \"text\": \"Israel\",\n \"value\": \"ISR\"\n },\n {\n \"text\": \"Italy\",\n \"value\": \"ITA\"\n },\n {\n \"text\": \"Jamaica\",\n \"value\": \"JAM\"\n },\n {\n \"text\": \"Jordan\",\n \"value\": \"JOR\"\n },\n {\n \"text\": \"Japan\",\n \"value\": \"JPN\"\n },\n {\n \"text\": \"Kazakhstan\",\n \"value\": \"KAZ\"\n },\n {\n \"text\": \"Kenya\",\n \"value\": \"KEN\"\n },\n {\n \"text\": \"Kyrgyzstan\",\n \"value\": \"KGZ\"\n },\n {\n \"text\": \"Cambodia\",\n \"value\": \"KHM\"\n },\n {\n \"text\": \"Kiribati\",\n \"value\": \"KIR\"\n },\n {\n \"text\": \"Saint Kitts and Nevis\",\n \"value\": \"SKN\"\n },\n {\n \"text\": \"South Korea\",\n \"value\": \"KOR\"\n },\n {\n \"text\": \"Kuwait\",\n \"value\": \"KUW\"\n },\n {\n \"text\": \"Laos\",\n \"value\": \"LAO\"\n },\n {\n \"text\": \"Lebanon\",\n \"value\": \"LIB\"\n },\n {\n \"text\": \"Liberia\",\n \"value\": \"LBR\"\n },\n {\n \"text\": \"Libya\",\n \"value\": \"LBA\"\n },\n {\n \"text\": \"Saint Lucia\",\n \"value\": \"LCA\"\n },\n {\n \"text\": \"Liechtenstein\",\n \"value\": \"LIE\"\n },\n {\n \"text\": \"Sri Lanka\",\n \"value\": \"SRI\"\n },\n {\n \"text\": \"Lesotho\",\n \"value\": \"LES\"\n },\n {\n \"text\": \"Lithuania\",\n \"value\": \"LTU\"\n },\n {\n \"text\": \"Luxembourg\",\n \"value\": \"LUX\"\n },\n {\n \"text\": \"Latvia\",\n \"value\": \"LAT\"\n },\n {\n \"text\": \"Morocco\",\n \"value\": \"MAR\"\n },\n {\n \"text\": \"Monaco\",\n \"value\": \"MON\"\n },\n {\n \"text\": \"Moldova\",\n \"value\": \"MDA\"\n },\n {\n \"text\": \"Madagascar\",\n \"value\": \"MAD\"\n },\n {\n \"text\": \"Maldives\",\n \"value\": \"MDV\"\n },\n {\n \"text\": \"Mexico\",\n \"value\": \"MEX\"\n },\n {\n \"text\": \"Marshall Islands\",\n \"value\": \"MHL\"\n },\n {\n \"text\": \"North Macedonia\",\n \"value\": \"MKD\"\n },\n {\n \"text\": \"Mali\",\n \"value\": \"MLI\"\n },\n {\n \"text\": \"Malta\",\n \"value\": \"MLT\"\n },\n {\n \"text\": \"Myanmar\",\n \"value\": \"MYA\"\n },\n {\n \"text\": \"Montenegro\",\n \"value\": \"MNE\"\n },\n {\n \"text\": \"Mongolia\",\n \"value\": \"MGL\"\n },\n {\n \"text\": \"Mozambique\",\n \"value\": \"MOZ\"\n },\n {\n \"text\": \"Mauritania\",\n \"value\": \"MTN\"\n },\n {\n \"text\": \"Mauritius\",\n \"value\": \"MRI\"\n },\n {\n \"text\": \"Malawi\",\n \"value\": \"MAW\"\n },\n {\n \"text\": \"Malaysia\",\n \"value\": \"MAS\"\n },\n {\n \"text\": \"Namibia\",\n \"value\": \"NAM\"\n },\n {\n \"text\": \"Niger\",\n \"value\": \"NIG\"\n },\n {\n \"text\": \"Nigeria\",\n \"value\": \"NGR\"\n },\n {\n \"text\": \"Nicaragua\",\n \"value\": \"NCA\"\n },\n {\n \"text\": \"Netherlands\",\n \"value\": \"NED\"\n },\n {\n \"text\": \"Norway\",\n \"value\": \"NOR\"\n },\n {\n \"text\": \"Nepal\",\n \"value\": \"NEP\"\n },\n {\n \"text\": \"Nauru\",\n \"value\": \"NRU\"\n },\n {\n \"text\": \"New Zealand\",\n \"value\": \"NZL\"\n },\n {\n \"text\": \"Oman\",\n \"value\": \"OMA\"\n },\n {\n \"text\": \"Pakistan\",\n \"value\": \"PAK\"\n },\n {\n \"text\": \"Panama\",\n \"value\": \"PAN\"\n },\n {\n \"text\": \"Peru\",\n \"value\": \"PER\"\n },\n {\n \"text\": \"Philippines\",\n \"value\": \"PHI\"\n },\n {\n \"text\": \"Palau\",\n \"value\": \"PLW\"\n },\n {\n \"text\": \"Papua New Guinea\",\n \"value\": \"PNG\"\n },\n {\n \"text\": \"Poland\",\n \"value\": \"POL\"\n },\n {\n \"text\": \"North Korea\",\n \"value\": \"PRK\"\n },\n {\n \"text\": \"Portugal\",\n \"value\": \"POR\"\n },\n {\n \"text\": \"Paraguay\",\n \"value\": \"PAR\"\n },\n {\n \"text\": \"Qatar\",\n \"value\": \"QAT\"\n },\n {\n \"text\": \"Romania\",\n \"value\": \"ROU\"\n },\n {\n \"text\": \"Russia\",\n \"value\": \"RUS\"\n },\n {\n \"text\": \"Rwanda\",\n \"value\": \"RWA\"\n },\n {\n \"text\": \"Saudi Arabia\",\n \"value\": \"KSA\"\n },\n {\n \"text\": \"Sudan\",\n \"value\": \"SUD\"\n },\n {\n \"text\": \"Senegal\",\n \"value\": \"SEN\"\n },\n {\n \"text\": \"Singapore\",\n \"value\": \"SIN\"\n },\n {\n \"text\": \"Solomon Islands\",\n \"value\": \"SOL\"\n },\n {\n \"text\": \"Sierra Leone\",\n \"value\": \"SLE\"\n },\n {\n \"text\": \"El Salvador\",\n \"value\": \"ESA\"\n },\n {\n \"text\": \"San Marino\",\n \"value\": \"SMR\"\n },\n {\n \"text\": \"Somalia\",\n \"value\": \"SOM\"\n },\n {\n \"text\": \"Serbia\",\n \"value\": \"SRB\"\n },\n {\n \"text\": \"S\\u00e3o Tom\\u00e9 and Pr\\u00edncipe\",\n \"value\": \"STP\"\n },\n {\n \"text\": \"Suriname\",\n \"value\": \"SUR\"\n },\n {\n \"text\": \"Slovakia\",\n \"value\": \"SVK\"\n },\n {\n \"text\": \"Slovenia\",\n \"value\": \"SLO\"\n },\n {\n \"text\": \"Sweden\",\n \"value\": \"SWE\"\n },\n {\n \"text\": \"Eswatini\",\n \"value\": \"SWZ\"\n },\n {\n \"text\": \"Seychelles\",\n \"value\": \"SEY\"\n },\n {\n \"text\": \"Syria\",\n \"value\": \"SYR\"\n },\n {\n \"text\": \"Chad\",\n \"value\": \"CHA\"\n },\n {\n \"text\": \"Togo\",\n \"value\": \"TOG\"\n },\n {\n \"text\": \"Thailand\",\n \"value\": \"THA\"\n },\n {\n \"text\": \"Tajikistan\",\n \"value\": \"TJK\"\n },\n {\n \"text\": \"Turkmenistan\",\n \"value\": \"TKM\"\n },\n {\n \"text\": \"Timor-Leste\",\n \"value\": \"TLS\"\n },\n {\n \"text\": \"Tonga\",\n \"value\": \"TGA\"\n },\n {\n \"text\": \"Trinidad and Tobago\",\n \"value\": \"TTO\"\n },\n {\n \"text\": \"Tunisia\",\n \"value\": \"TUN\"\n },\n {\n \"text\": \"Turkey\",\n \"value\": \"TUR\"\n },\n {\n \"text\": \"Tuvalu\",\n \"value\": \"TUV\"\n },\n {\n \"text\": \"Tanzania\",\n \"value\": \"TAN\"\n },\n {\n \"text\": \"Uganda\",\n \"value\": \"UGA\"\n },\n {\n \"text\": \"Ukraine\",\n \"value\": \"UKR\"\n },\n {\n \"text\": \"Uruguay\",\n \"value\": \"URU\"\n },\n {\n \"text\": \"United States\",\n \"value\": \"USA\"\n },\n {\n \"text\": \"Uzbekistan\",\n \"value\": \"UZB\"\n },\n {\n \"text\": \"Saint Vincent and the Grenadines\",\n \"value\": \"VIN\"\n },\n {\n \"text\": \"Venezuela\",\n \"value\": \"VEN\"\n },\n {\n \"text\": \"Vietnam\",\n \"value\": \"VIE\"\n },\n {\n \"text\": \"Vanuatu\",\n \"value\": \"VAN\"\n },\n {\n \"text\": \"Samoa\",\n \"value\": \"SAM\"\n },\n {\n \"text\": \"Yemen\",\n \"value\": \"YEM\"\n },\n {\n \"text\": \"South Africa\",\n \"value\": \"RSA\"\n },\n {\n \"text\": \"Zambia\",\n \"value\": \"ZAM\"\n },\n {\n \"text\": \"Zimbabwe\",\n \"value\": \"ZIM\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"durationInCurrentResidenceMth\",\n \"displayName\": \"Duration in Current Residence (Months)\",\n \"placeholder\": \"Duration in Current Residence (Months)\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 2,\n \"min\": 0,\n \"max\": 11,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^([0-9]|10|11)$\",\n \"text\": \"Value must be a number between 0-11.\"\n }\n ],\n \"inputType\": \"number\",\n \"category\": \"7\"\n },\n {\n \"name\": \"durationInCurrentResidenceYr\",\n \"displayName\": \"Duration in Current Residence (Years)\",\n \"placeholder\": \"Duration in Current Residence (Years)\",\n \"type\": \"text\",\n \"maxLength\": 2,\n \"min\": 0,\n \"max\": 99,\n \"inputType\": \"number\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^([0-9]|[1-9][0-9])$\",\n \"text\": \"Value must be a number between 0-99.\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"officePhoneNo\",\n \"displayName\": \"Employer Phone Number\",\n \"placeholder\": \"Employer Phone Number\",\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"text\",\n \"maxLength\": 12,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"The phone number must be a valid Malaysian number\",\n \"regex\": \"^(011[0-9]{8}|(60[4-7]|004|005|006|007|009|609|012|013|014|016|017|019)[0-9]{7})$\"\n }\n ],\n \"inputType\": \"tel\",\n \"category\": \"5\"\n },\n {\n \"name\": \"officePhoneNoAreaCode\",\n \"displayName\": \"Office Phone Number Area Code\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"8\"\n },\n {\n \"name\": \"postcode\",\n \"displayName\": \"Postcode\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"state\",\n \"displayName\": \"Permanent State\",\n \"placeholder\": \"Select State Of The Permanenet Address\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"A\",\n \"text\": \"PERAK\"\n },\n {\n \"value\": \"B\",\n \"text\": \"SELANGOR\"\n },\n {\n \"value\": \"C\",\n \"text\": \"PAHANG\"\n },\n {\n \"value\": \"D\",\n \"text\": \"KELANTAN\"\n },\n {\n \"value\": \"J\",\n \"text\": \"JOHOR\"\n },\n {\n \"value\": \"K\",\n \"text\": \"KEDAH\"\n },\n {\n \"value\": \"L\",\n \"text\": \"WP LABUAN\"\n },\n {\n \"value\": \"M\",\n \"text\": \"MELAKA\"\n },\n {\n \"value\": \"N\",\n \"text\": \"NEGERI SEMBILAN\"\n },\n {\n \"value\": \"P\",\n \"text\": \"PULAU PINANG\"\n },\n {\n \"value\": \"Q\",\n \"text\": \"SARAWAK\"\n },\n {\n \"value\": \"R\",\n \"text\": \"PERLIS\"\n },\n {\n \"value\": \"S\",\n \"text\": \"SABAH\"\n },\n {\n \"value\": \"T\",\n \"text\": \"TERENGGANU\"\n },\n {\n \"value\": \"U\",\n \"text\": \"WP PUTRAJAYA\"\n },\n {\n \"value\": \"W\",\n \"text\": \"WP KUALA LUMPUR\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"residenceAddress\",\n \"displayName\": \"Residence address same as permanent address?\",\n \"type\": \"boolean\",\n \"defaultValue\": false,\n \"requiredForEvaluation\": false,\n \"category\": \"7\"\n },\n {\n \"name\": \"officestate\",\n \"displayName\": \"Employer State\",\n \"startWithNewLine\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"placeholder\": \"Select State Of The Employer Address\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"A\",\n \"text\": \"PERAK\"\n },\n {\n \"value\": \"B\",\n \"text\": \"SELANGOR\"\n },\n {\n \"value\": \"C\",\n \"text\": \"PAHANG\"\n },\n {\n \"value\": \"D\",\n \"text\": \"KELANTAN\"\n },\n {\n \"value\": \"J\",\n \"text\": \"JOHOR\"\n },\n {\n \"value\": \"K\",\n \"text\": \"KEDAH\"\n },\n {\n \"value\": \"L\",\n \"text\": \"WP LABUAN\"\n },\n {\n \"value\": \"M\",\n \"text\": \"MELAKA\"\n },\n {\n \"value\": \"N\",\n \"text\": \"NEGERI SEMBILAN\"\n },\n {\n \"value\": \"P\",\n \"text\": \"PULAU PINANG\"\n },\n {\n \"value\": \"Q\",\n \"text\": \"SARAWAK\"\n },\n {\n \"value\": \"R\",\n \"text\": \"PERLIS\"\n },\n {\n \"value\": \"S\",\n \"text\": \"SABAH\"\n },\n {\n \"value\": \"T\",\n \"text\": \"TERENGGANU\"\n },\n {\n \"value\": \"U\",\n \"text\": \"WP PUTRAJAYA\"\n },\n {\n \"value\": \"W\",\n \"text\": \"WP KUALA LUMPUR\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"type\": \"text\",\n \"name\": \"age\",\n \"title\": \"Age\",\n \"isRequired\": true,\n \"displayName\": \"Age\",\n \"visible\": false,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid whole number age between 21 and 55.\",\n \"regex\": \"^(2[1-9]|[3-4][0-9]|55)$\"\n }\n ],\n \"defaultValue\": \"21\",\n \"category\": \"2\"\n },\n {\n \"name\": \"consentCrossSelling\",\n \"displayName\": \"Consent Cross-Selling, Consent to Obtain Information from CTOS and Disclosure of Information\",\n \"type\": \"boolean\",\n \"validators\": [\n {\n \"type\": \"expression\",\n \"expression\": \"{consentCrossSelling} = true\",\n \"text\": \"You must provide consent to Consent Cross-Selling.\"\n }\n ],\n \"defaultValue\": false,\n \"showTitle\": true,\n \"category\": \"9\"\n },\n {\n \"type\": \"text\",\n \"name\": \"consentObtainInfoFromCtos\",\n \"displayName\": \"Consent to Obtain Information from CTOS\",\n \"defaultValue\": \"yes\",\n \"showTitle\": true,\n \"visible\": false,\n \"category\": \"9\"\n },\n {\n \"name\": \"dateJoined\",\n \"displayName\": \"Date Joined\",\n \"placeholder\": \"Date Joined\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 10,\n \"inputType\": \"date\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\",\n \"text\": \"Date must be in YYYY-MM-DD format\"\n },\n {\n \"type\": \"custom\",\n \"validator\": \"validateNotFutureDate\",\n \"text\": \"Date of joining cannot be in the future\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"disclosureOfInformation\",\n \"displayName\": \"Disclosure of Information\",\n \"type\": \"text\",\n \"defaultValue\": \"yes\",\n \"showTitle\": true,\n \"visible\": false,\n \"category\": \"9\"\n },\n {\n \"name\": \"educationLevel\",\n \"displayName\": \"Education Level\",\n \"placeholder\": \"Highest Education Level\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Primary\"\n },\n {\n \"value\": \"02\",\n \"text\": \"Secondary/High school\"\n },\n {\n \"value\": \"03\",\n \"text\": \"College graduate-certificate/Diploma holder\"\n },\n {\n \"value\": \"04\",\n \"text\": \"University Degree/Associate Degree\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Master Degree\"\n },\n {\n \"value\": \"06\",\n \"text\": \"Doctorate\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"emerContactTelNo1\",\n \"displayName\": \"Emergency Contact Telephone Number 1\",\n \"startWithNewLine\": false,\n \"placeholder\": \"Emergency Contact Telephone Number 1\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"A valid Malaysia phone number is required.\",\n \"regex\": \"^((60[4-79]|0[4-79])[0-9]{7}|011[0-9]{8}|01[2346789][0-9]{7})$\"\n }\n ],\n \"type\": \"text\",\n \"maxLength\": 18,\n \"inputType\": \"tel\",\n \"category\": \"8\"\n },\n {\n \"name\": \"emerContactTelNo1AreaCode\",\n \"displayName\": \"Emergency Contact Telephone Number 1 Area Code\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"8\"\n },\n {\n \"name\": \"emergencyContactName\",\n \"displayName\": \"Emergency Contact Name\",\n \"placeholder\": \"Emergency Contact Name\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"8\"\n },\n {\n \"name\": \"employerName\",\n \"displayName\": \"Employer Name\",\n \"placeholder\": \"Employer Name\",\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"5\"\n },\n {\n \"name\": \"employmentSector\",\n \"displayName\": \"Employment Sector\",\n \"placeholder\": \"Select Employment Sector\",\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"0010\",\n \"text\": \"Accounting\"\n },\n {\n \"value\": \"0020\",\n \"text\": \"Actuarial / Statistic\"\n },\n {\n \"value\": \"0030\",\n \"text\": \"Advertising / Marketing / PR\"\n },\n {\n \"value\": \"0040\",\n \"text\": \"Aerospace\"\n },\n {\n \"value\": \"0050\",\n \"text\": \"Agricultural / Chemicals / Forest Products\"\n },\n {\n \"value\": \"0060\",\n \"text\": \"Architecture\"\n },\n {\n \"value\": \"0070\",\n \"text\": \"Automotive / Manufacturing / Production\"\n },\n {\n \"value\": \"0080\",\n \"text\": \"Aviation\"\n },\n {\n \"value\": \"0090\",\n \"text\": \"Buying / Retail\"\n },\n {\n \"value\": \"0100\",\n \"text\": \"Computers / Electronics\"\n },\n {\n \"value\": \"0110\",\n \"text\": \"Construction\"\n },\n {\n \"value\": \"0120\",\n \"text\": \"Creative / Graphics\"\n },\n {\n \"value\": \"0130\",\n \"text\": \"Customer Service\"\n },\n {\n \"value\": \"0140\",\n \"text\": \"Education (includes students) / Training\"\n },\n {\n \"value\": \"0150\",\n \"text\": \"Energy / Mining\"\n },\n {\n \"value\": \"0160\",\n \"text\": \"Engineering\"\n },\n {\n \"value\": \"0170\",\n \"text\": \"Finance / Banking / Insurance\"\n },\n {\n \"value\": \"0180\",\n \"text\": \"Freight / Shipping\"\n },\n {\n \"value\": \"0190\",\n \"text\": \"Government / Military / Public Service\"\n },\n {\n \"value\": \"0200\",\n \"text\": \"Recreation / Hospitality / Sports\"\n },\n {\n \"value\": \"0210\",\n \"text\": \"Hotel / Food\"\n },\n {\n \"value\": \"0220\",\n \"text\": \"Human Resources\"\n },\n {\n \"value\": \"0230\",\n \"text\": \"Investment\"\n },\n {\n \"value\": \"0240\",\n \"text\": \"Journalist / Editor\"\n },\n {\n \"value\": \"0250\",\n \"text\": \"Media / Publishing\"\n },\n {\n \"value\": \"0260\",\n \"text\": \"Medical / Health Services\"\n },\n {\n \"value\": \"0270\",\n \"text\": \"Non-Profit Organization\"\n },\n {\n \"value\": \"0280\",\n \"text\": \"Geology\"\n },\n {\n \"value\": \"0290\",\n \"text\": \"Pharmaceuticals\"\n },\n {\n \"value\": \"0300\",\n \"text\": \"Real Estate\"\n },\n {\n \"value\": \"0310\",\n \"text\": \"Administrative and Support Service Activities\"\n },\n {\n \"value\": \"0320\",\n \"text\": \"Social Services\"\n },\n {\n \"value\": \"0330\",\n \"text\": \"Telecommunications / Networking\"\n },\n {\n \"value\": \"0340\",\n \"text\": \"Travel\"\n },\n {\n \"value\": \"0350\",\n \"text\": \"Transportation\"\n },\n {\n \"value\": \"0360\",\n \"text\": \"Entertainment / Arts\"\n },\n {\n \"value\": \"0370\",\n \"text\": \"Electricity, Gas, Steam and Air Conditioning Supply\"\n },\n {\n \"value\": \"0380\",\n \"text\": \"Water Supply; Sewerage, Waste Management and Remediation Activities\"\n },\n {\n \"value\": \"0390\",\n \"text\": \"Activities of Households as Employers; Undifferentiated Goods and Services Producing Activities of Households for Own Use\"\n },\n {\n \"value\": \"0400\",\n \"text\": \"Activities of Extraterritorial Organisations and Bodies\"\n },\n {\n \"value\": \"0410\",\n \"text\": \"Unemployed/ Outside Labour Force\"\n },\n {\n \"value\": \"0420\",\n \"text\": \"Other Service Activities\"\n },\n {\n \"value\": \"0430\",\n \"text\": \"Legal Services\"\n },\n {\n \"value\": \"0440\",\n \"text\": \"Research & Experimental Development Services\"\n },\n {\n \"value\": \"0450\",\n \"text\": \"Other Professional, Scientific and Technical Activities\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"employmentStatus\",\n \"displayName\": \"Employment Status\",\n \"placeholder\": \"Select Employment Status\",\n \"startWithNewLine\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '08', '09']\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"CON\",\n \"text\": \"Contract\"\n },\n {\n \"value\": \"FRL\",\n \"text\": \"Freelance\"\n },\n {\n \"value\": \"OTH\",\n \"text\": \"Others\"\n },\n {\n \"value\": \"PER\",\n \"text\": \"Permanent\"\n },\n {\n \"value\": \"PRT\",\n \"text\": \"Part Time\"\n },\n {\n \"value\": \"TMP\",\n \"text\": \"Temporary\"\n },\n {\n \"value\": \"UPROB\",\n \"text\": \"Under Probation\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"employmentType\",\n \"displayName\": \"Employment Type\",\n \"placeholder\": \"Select Employment Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Private Employee\"\n },\n {\n \"value\": \"02\",\n \"text\": \"Employer\"\n },\n {\n \"value\": \"03\",\n \"text\": \"Housewife\"\n },\n {\n \"value\": \"04\",\n \"text\": \"Retired\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Student\"\n },\n {\n \"value\": \"06\",\n \"text\": \"Unemployed\"\n },\n {\n \"value\": \"07\",\n \"text\": \"Self-employed/Own Account Worker\"\n },\n {\n \"value\": \"08\",\n \"text\": \"Government Employee\"\n },\n {\n \"value\": \"09\",\n \"text\": \"Reporting Entity Employee\"\n },\n {\n \"value\": \"10\",\n \"text\": \"Unpaid Family Worker\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"gender\",\n \"displayName\": \"Gender\",\n \"placeholder\": \"Select Gender\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"M\",\n \"text\": \"Male\"\n },\n {\n \"value\": \"F\",\n \"text\": \"Female\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"idType\",\n \"displayName\": \"ID Type\",\n \"type\": \"dropdown\",\n \"defaultValue\": \"MyKad\",\n \"choices\": [\n {\n \"value\": \"MK\",\n \"text\": \"MyKad\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"lengthOfServiceMonth\",\n \"displayName\": \"Length of Service (Months)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"5\"\n },\n {\n \"name\": \"lengthOfServiceYear\",\n \"displayName\": \"Length of Service (Years)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"5\"\n },\n {\n \"name\": \"mailingBillingAddressInd\",\n \"displayName\": \"Preferred Mailing Address\",\n \"placeholder\": \"Select Preferred Mailing Address\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"O\",\n \"text\": \"Office\"\n },\n {\n \"value\": \"R\",\n \"text\": \"Residence\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"maritalStatus\",\n \"displayName\": \"Marital Status\",\n \"placeholder\": \"Select Marital Status\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"S\",\n \"text\": \"Single\"\n },\n {\n \"value\": \"M\",\n \"text\": \"Married\"\n },\n {\n \"value\": \"W\",\n \"text\": \"Widowed\"\n },\n {\n \"value\": \"D\",\n \"text\": \"Divorced\"\n },\n {\n \"value\": \"E\",\n \"text\": \"Separated\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"monthlyGrossIncome\",\n \"displayName\": \"Monthly Gross Income\",\n \"placeholder\": \"E.g. 6000\",\n \"visibleIf\": \"{employmentType} anyof ['01', '07', '08', '09', '10']\",\n \"type\": \"text\",\n \"maxLength\": 15,\n \"inputType\": \"number\",\n \"min\": 2000,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d+(\\\\.\\\\d+)?$\",\n \"text\": \"Please enter a valid non-negative number.\"\n },\n {\n \"type\": \"expression\",\n \"expression\": \"{monthlyGrossIncome} >= 2000\",\n \"text\": \"Income must be at least RM 2000.\"\n }\n ],\n \"category\": \"4\"\n },\n {\n \"name\": \"monthlyNetIncome\",\n \"displayName\": \"Monthly Net Income\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"nationality\",\n \"displayName\": \"Nationality\",\n \"type\": \"text\",\n \"category\": \"2\"\n },\n {\n \"name\": \"noOfDependants\",\n \"displayName\": \"Number of Dependants\",\n \"placeholder\": \"Number Of Dependants\",\n \"type\": \"text\",\n \"startWithNewLine\": false,\n \"maxLength\": 3,\n \"inputType\": \"number\",\n \"min\": 0,\n \"max\": 99,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid whole number between 0 and 99.\",\n \"regex\": \"^[0-9][0-9]?$\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"occupation\",\n \"displayName\": \"Occupation\",\n \"placeholder\": \"Select Occupation\",\n \"startWithNewLine\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"001\",\n \"text\": \"Accountant\"\n },\n {\n \"value\": \"005\",\n \"text\": \"Army Officer\"\n },\n {\n \"value\": \"007\",\n \"text\": \"Assistant Director\"\n },\n {\n \"value\": \"008\",\n \"text\": \"Assistant Manager\"\n },\n {\n \"value\": \"009\",\n \"text\": \"Auditor\"\n },\n {\n \"value\": \"010\",\n \"text\": \"Baker\"\n },\n {\n \"value\": \"011\",\n \"text\": \"Beautician\"\n },\n {\n \"value\": \"012\",\n \"text\": \"Broker\"\n },\n {\n \"value\": \"013\",\n \"text\": \"Business Partner\"\n },\n {\n \"value\": \"014\",\n \"text\": \"Businessman/Businesswoman\"\n },\n {\n \"value\": \"015\",\n \"text\": \"Carpenter\"\n },\n {\n \"value\": \"016\",\n \"text\": \"Cashier\"\n },\n {\n \"value\": \"017\",\n \"text\": \"CEO\"\n },\n {\n \"value\": \"018\",\n \"text\": \"Chairman\"\n },\n {\n \"value\": \"019\",\n \"text\": \"Chief Accountant\"\n },\n {\n \"value\": \"020\",\n \"text\": \"Chief Auditor\"\n },\n {\n \"value\": \"022\",\n \"text\": \"Co-Director\"\n },\n {\n \"value\": \"023\",\n \"text\": \"Consultant\"\n },\n {\n \"value\": \"024\",\n \"text\": \"Contractor\"\n },\n {\n \"value\": \"025\",\n \"text\": \"Financial Controller\"\n },\n {\n \"value\": \"026\",\n \"text\": \"Coordinator\"\n },\n {\n \"value\": \"027\",\n \"text\": \"Copywriter\"\n },\n {\n \"value\": \"028\",\n \"text\": \"Dealer/Distributor\"\n },\n {\n \"value\": \"029\",\n \"text\": \"Dentist\"\n },\n {\n \"value\": \"031\",\n \"text\": \"Despatch\"\n },\n {\n \"value\": \"032\",\n \"text\": \"Detective\"\n },\n {\n \"value\": \"034\",\n \"text\": \"Diplomat\"\n },\n {\n \"value\": \"035\",\n \"text\": \"Director\"\n },\n {\n \"value\": \"036\",\n \"text\": \"Doctor\"\n },\n {\n \"value\": \"038\",\n \"text\": \"Electrician\"\n },\n {\n \"value\": \"040\",\n \"text\": \"Executive\"\n },\n {\n \"value\": \"041\",\n \"text\": \"Executive Director\"\n },\n {\n \"value\": \"042\",\n \"text\": \"Exporter\"\n },\n {\n \"value\": \"043\",\n \"text\": \"Farmer\"\n },\n {\n \"value\": \"044\",\n \"text\": \"Foreman\"\n },\n {\n \"value\": \"045\",\n \"text\": \"Gardener\"\n },\n {\n \"value\": \"046\",\n \"text\": \"General Manager\"\n },\n {\n \"value\": \"047\",\n \"text\": \"Goldsmith\"\n },\n {\n \"value\": \"048\",\n \"text\": \"Hairdresser\"\n },\n {\n \"value\": \"049\",\n \"text\": \"Hawker\"\n },\n {\n \"value\": \"050\",\n \"text\": \"Housewife\"\n },\n {\n \"value\": \"051\",\n \"text\": \"Homemaker\"\n },\n {\n \"value\": \"053\",\n \"text\": \"Investor\"\n },\n {\n \"value\": \"054\",\n \"text\": \"Jeweller\"\n },\n {\n \"value\": \"055\",\n \"text\": \"Judge\"\n },\n {\n \"value\": \"057\",\n \"text\": \"Lawyer/Barrister/Solicitor\"\n },\n {\n \"value\": \"058\",\n \"text\": \"Lender\"\n },\n {\n \"value\": \"060\",\n \"text\": \"Managing Director\"\n },\n {\n \"value\": \"061\",\n \"text\": \"Manufacturer\"\n },\n {\n \"value\": \"063\",\n \"text\": \"Money Lender\"\n },\n {\n \"value\": \"064\",\n \"text\": \"Money-Changer\"\n },\n {\n \"value\": \"068\",\n \"text\": \"Owner/Co-Owner\"\n },\n {\n \"value\": \"070\",\n \"text\": \"Partner\"\n },\n {\n \"value\": \"071\",\n \"text\": \"Pastor\"\n },\n {\n \"value\": \"072\",\n \"text\": \"Physician\"\n },\n {\n \"value\": \"073\",\n \"text\": \"Plumber\"\n },\n {\n \"value\": \"075\",\n \"text\": \"Principal\"\n },\n {\n \"value\": \"076\",\n \"text\": \"Programmer\"\n },\n {\n \"value\": \"077\",\n \"text\": \"Quantity Surveyor\"\n },\n {\n \"value\": \"078\",\n \"text\": \"Remiser\"\n },\n {\n \"value\": \"079\",\n \"text\": \"Retailer\"\n },\n {\n \"value\": \"080\",\n \"text\": \"Retiree\"\n },\n {\n \"value\": \"082\",\n \"text\": \"Secretary\"\n },\n {\n \"value\": \"083\",\n \"text\": \"Self-Employed\"\n },\n {\n \"value\": \"084\",\n \"text\": \"Smallholder\"\n },\n {\n \"value\": \"085\",\n \"text\": \"Stockbroker\"\n },\n {\n \"value\": \"086\",\n \"text\": \"Store-Keeper\"\n },\n {\n \"value\": \"087\",\n \"text\": \"Student\"\n },\n {\n \"value\": \"088\",\n \"text\": \"Sub-contractor\"\n },\n {\n \"value\": \"090\",\n \"text\": \"Supplier\"\n },\n {\n \"value\": \"091\",\n \"text\": \"Tailor/Dressmaker\"\n },\n {\n \"value\": \"094\",\n \"text\": \"Tourist Guide\"\n },\n {\n \"value\": \"095\",\n \"text\": \"Trader\"\n },\n {\n \"value\": \"096\",\n \"text\": \"Valuer\"\n },\n {\n \"value\": \"097\",\n \"text\": \"Vice President\"\n },\n {\n \"value\": \"098\",\n \"text\": \"Waiter/Waitress\"\n },\n {\n \"value\": \"099\",\n \"text\": \"Welder\"\n },\n {\n \"value\": \"100\",\n \"text\": \"Wholesaler\"\n },\n {\n \"value\": \"101\",\n \"text\": \"Fisherman\"\n },\n {\n \"value\": \"102\",\n \"text\": \"Grocer\"\n },\n {\n \"value\": \"104\",\n \"text\": \"Unemployed\"\n },\n {\n \"value\": \"105\",\n \"text\": \"Babysitter\"\n },\n {\n \"value\": \"107\",\n \"text\": \"Sole Proprietor\"\n },\n {\n \"value\": \"108\",\n \"text\": \"Politician\"\n },\n {\n \"value\": \"109\",\n \"text\": \"Actor\"\n },\n {\n \"value\": \"110\",\n \"text\": \"Adjusters\"\n },\n {\n \"value\": \"111\",\n \"text\": \"Air Hostess\"\n },\n {\n \"value\": \"112\",\n \"text\": \"Aquaculture\"\n },\n {\n \"value\": \"115\",\n \"text\": \"Athlete\"\n },\n {\n \"value\": \"116\",\n \"text\": \"Auctioneer\"\n },\n {\n \"value\": \"117\",\n \"text\": \"Author\"\n },\n {\n \"value\": \"118\",\n \"text\": \"Bell Boy\"\n },\n {\n \"value\": \"119\",\n \"text\": \"Biographer\"\n },\n {\n \"value\": \"120\",\n \"text\": \"Butcher\"\n },\n {\n \"value\": \"121\",\n \"text\": \"Catering\"\n },\n {\n \"value\": \"122\",\n \"text\": \"Chargeman\"\n },\n {\n \"value\": \"123\",\n \"text\": \"Chemist, Physicist\"\n },\n {\n \"value\": \"124\",\n \"text\": \"Choreographer/Dancer\"\n },\n {\n \"value\": \"125\",\n \"text\": \"Circus Performer\"\n },\n {\n \"value\": \"126\",\n \"text\": \"Civil Servant\"\n },\n {\n \"value\": \"127\",\n \"text\": \"Clergy\"\n },\n {\n \"value\": \"128\",\n \"text\": \"Coach\"\n },\n {\n \"value\": \"129\",\n \"text\": \"Composer\"\n },\n {\n \"value\": \"130\",\n \"text\": \"Decorator\"\n },\n {\n \"value\": \"131\",\n \"text\": \"Direct Sales\"\n },\n {\n \"value\": \"132\",\n \"text\": \"Economist\"\n },\n {\n \"value\": \"133\",\n \"text\": \"Editor\"\n },\n {\n \"value\": \"135\",\n \"text\": \"Fireman\"\n },\n {\n \"value\": \"136\",\n \"text\": \"Fishmonger\"\n },\n {\n \"value\": \"137\",\n \"text\": \"Florist\"\n },\n {\n \"value\": \"138\",\n \"text\": \"Forestry\"\n },\n {\n \"value\": \"139\",\n \"text\": \"Freight Forwarding Services\"\n },\n {\n \"value\": \"140\",\n \"text\": \"General Worker\"\n },\n {\n \"value\": \"142\",\n \"text\": \"Hunter\"\n },\n {\n \"value\": \"143\",\n \"text\": \"Journalist\"\n },\n {\n \"value\": \"144\",\n \"text\": \"Launderer/Dry Cleaner\"\n },\n {\n \"value\": \"145\",\n \"text\": \"Librarian/Curator\"\n },\n {\n \"value\": \"146\",\n \"text\": \"Locksmith\"\n },\n {\n \"value\": \"147\",\n \"text\": \"Magician\"\n },\n {\n \"value\": \"149\",\n \"text\": \"Model\"\n },\n {\n \"value\": \"150\",\n \"text\": \"Newscaster\"\n },\n {\n \"value\": \"151\",\n \"text\": \"NGO Staff/Volunteer\"\n },\n {\n \"value\": \"152\",\n \"text\": \"Nursery Worker & Gardener\"\n },\n {\n \"value\": \"154\",\n \"text\": \"Pharmacist\"\n },\n {\n \"value\": \"155\",\n \"text\": \"Photographer\"\n },\n {\n \"value\": \"156\",\n \"text\": \"Postman\"\n },\n {\n \"value\": \"157\",\n \"text\": \"Priest/Nun\"\n },\n {\n \"value\": \"158\",\n \"text\": \"Promoter\"\n },\n {\n \"value\": \"159\",\n \"text\": \"Proof Reader\"\n },\n {\n \"value\": \"160\",\n \"text\": \"Psychiatrist\"\n },\n {\n \"value\": \"161\",\n \"text\": \"Psychologist\"\n },\n {\n \"value\": \"162\",\n \"text\": \"Sailor\"\n },\n {\n \"value\": \"163\",\n \"text\": \"Security/Bodyguard\"\n },\n {\n \"value\": \"164\",\n \"text\": \"Shop Assistant\"\n },\n {\n \"value\": \"165\",\n \"text\": \"Singer\"\n },\n {\n \"value\": \"166\",\n \"text\": \"Social Worker\"\n },\n {\n \"value\": \"168\",\n \"text\": \"Town Planner\"\n },\n {\n \"value\": \"169\",\n \"text\": \"Translator/Interpreter\"\n },\n {\n \"value\": \"170\",\n \"text\": \"Upholsterer\"\n },\n {\n \"value\": \"171\",\n \"text\": \"Warden\"\n },\n {\n \"value\": \"172\",\n \"text\": \"Bank Officer\"\n },\n {\n \"value\": \"175\",\n \"text\": \"Astronaut/Astronomer/Astrologer\"\n },\n {\n \"value\": \"176\",\n \"text\": \"President\"\n },\n {\n \"value\": \"200\",\n \"text\": \"Production and Manufacturing Managers\"\n },\n {\n \"value\": \"201\",\n \"text\": \"Hospitality, Retail and Other Services Managers\"\n },\n {\n \"value\": \"202\",\n \"text\": \"Information and Communications Technology Managers\"\n },\n {\n \"value\": \"203\",\n \"text\": \"Services Managers\"\n },\n {\n \"value\": \"204\",\n \"text\": \"Meteorologists and Seismologists\"\n },\n {\n \"value\": \"205\",\n \"text\": \"Geologists and Geophysicists\"\n },\n {\n \"value\": \"206\",\n \"text\": \"Farming, Forestry and Fisheries Advisers\"\n },\n {\n \"value\": \"207\",\n \"text\": \"Other Life Science Professionals\"\n },\n {\n \"value\": \"208\",\n \"text\": \"Landscape Architects\"\n },\n {\n \"value\": \"209\",\n \"text\": \"Product and Garment Designers\"\n },\n {\n \"value\": \"210\",\n \"text\": \"Graphic and Multimedia Designers\"\n },\n {\n \"value\": \"211\",\n \"text\": \"Ships Engineers\"\n },\n {\n \"value\": \"212\",\n \"text\": \"Aircraft Pilots and Related Professionals\"\n },\n {\n \"value\": \"213\",\n \"text\": \"Other Ship, Aircraft and Train/Locomotive Controllers\"\n },\n {\n \"value\": \"214\",\n \"text\": \"University and Higher Education Teachers\"\n },\n {\n \"value\": \"215\",\n \"text\": \"Vocational Education Teachers\"\n },\n {\n \"value\": \"216\",\n \"text\": \"Secondary Education Teachers\"\n },\n {\n \"value\": \"217\",\n \"text\": \"Primary School and Early Childhood Teachers\"\n },\n {\n \"value\": \"218\",\n \"text\": \"Music, Arts and Performing Arts Teachers\"\n },\n {\n \"value\": \"219\",\n \"text\": \"Language Teachers\"\n },\n {\n \"value\": \"220\",\n \"text\": \"Technology Skill and Technical Trainers\"\n },\n {\n \"value\": \"221\",\n \"text\": \"System Analysts\"\n },\n {\n \"value\": \"222\",\n \"text\": \"Web and Multimedia Developers\"\n },\n {\n \"value\": \"223\",\n \"text\": \"Software and Applications Developers and Analysts n.e.c.\"\n },\n {\n \"value\": \"224\",\n \"text\": \"Database Designers and Administrators\"\n },\n {\n \"value\": \"225\",\n \"text\": \"Information Technology System Administrators\"\n },\n {\n \"value\": \"226\",\n \"text\": \"Other Database and Network Professionals\"\n },\n {\n \"value\": \"227\",\n \"text\": \"Legal Professionals n.e.c.\"\n },\n {\n \"value\": \"228\",\n \"text\": \"Sociologists, Anthropologists and Related Professionals\"\n },\n {\n \"value\": \"229\",\n \"text\": \"Philosophers, Historians and Political Scientists\"\n },\n {\n \"value\": \"230\",\n \"text\": \"Film, Stage and Related Directors and Producers\"\n },\n {\n \"value\": \"231\",\n \"text\": \"Animals Keepers and Trainers\"\n },\n {\n \"value\": \"232\",\n \"text\": \"Professional Customs and Border Inspectors\"\n },\n {\n \"value\": \"233\",\n \"text\": \"Professional Taxation and Excise Officials\"\n },\n {\n \"value\": \"234\",\n \"text\": \"Professional Government Social Benefits Officials\"\n },\n {\n \"value\": \"235\",\n \"text\": \"Professional Government Licensing Officials\"\n },\n {\n \"value\": \"236\",\n \"text\": \"Professional Civil Defence Officials\"\n },\n {\n \"value\": \"237\",\n \"text\": \"Physical and Engineering Science Technicians\"\n },\n {\n \"value\": \"238\",\n \"text\": \"Mining, Manufacturing and Construction Supervisors\"\n },\n {\n \"value\": \"239\",\n \"text\": \"Process Control Technicians\"\n },\n {\n \"value\": \"240\",\n \"text\": \"Life Science Technicians and Related Associate Professionals\"\n },\n {\n \"value\": \"241\",\n \"text\": \"Ship, Aircraft and Train Technicians\"\n },\n {\n \"value\": \"242\",\n \"text\": \"Nuclear Science Associate Professionals\"\n },\n {\n \"value\": \"243\",\n \"text\": \"Medical and Pharmaceutical Technicians\"\n },\n {\n \"value\": \"244\",\n \"text\": \"Traditional and Complementary Medicine Associate Professionals\"\n },\n {\n \"value\": \"245\",\n \"text\": \"Veterinary Technicians and Assistants\"\n },\n {\n \"value\": \"246\",\n \"text\": \"Dental Assistants and Therapists\"\n },\n {\n \"value\": \"247\",\n \"text\": \"Medical Records and Health Information Technicians\"\n },\n {\n \"value\": \"248\",\n \"text\": \"Dispensing Opticians\"\n },\n {\n \"value\": \"249\",\n \"text\": \"Physiotherapy Technicians and Assistants\"\n },\n {\n \"value\": \"250\",\n \"text\": \"Medical Assistants\"\n },\n {\n \"value\": \"251\",\n \"text\": \"Health Associate Professionals Not Elsewhere Classified\"\n },\n {\n \"value\": \"252\",\n \"text\": \"Statistical, Mathematical and Actuarial Associate Professionals\"\n },\n {\n \"value\": \"253\",\n \"text\": \"Insurance Agent\"\n },\n {\n \"value\": \"254\",\n \"text\": \"Commercial Sales Agent\"\n },\n {\n \"value\": \"255\",\n \"text\": \"Buyers\"\n },\n {\n \"value\": \"256\",\n \"text\": \"Administrative Associate Professionals\"\n },\n {\n \"value\": \"257\",\n \"text\": \"Administrative and Executive Secretaries\"\n },\n {\n \"value\": \"258\",\n \"text\": \"Other Administrative and Specialized Associate Professionals\"\n },\n {\n \"value\": \"259\",\n \"text\": \"Legal Associate Professionals\"\n },\n {\n \"value\": \"260\",\n \"text\": \"Social and Religious Associate Professionals\"\n },\n {\n \"value\": \"261\",\n \"text\": \"Fitness and Recreation Instructors and Program Leaders\"\n },\n {\n \"value\": \"262\",\n \"text\": \"Gallery, Museum and Library Technicians\"\n },\n {\n \"value\": \"263\",\n \"text\": \"Cultural Associate Professionals\"\n },\n {\n \"value\": \"264\",\n \"text\": \"Artistic and Cultural Associate Professionals Not Elsewhere Classified\"\n },\n {\n \"value\": \"265\",\n \"text\": \"Customs and Border Inspector Associate Professionals\"\n },\n {\n \"value\": \"266\",\n \"text\": \"Taxation and Excise Official Associate Professionals\"\n },\n {\n \"value\": \"267\",\n \"text\": \"Government Social Benefit Official Associate Professionals\"\n },\n {\n \"value\": \"268\",\n \"text\": \"Government Licensing Official Associate Professionals\"\n },\n {\n \"value\": \"269\",\n \"text\": \"Civil Defence Associate Professionals\"\n },\n {\n \"value\": \"270\",\n \"text\": \"General Office Clerks\"\n },\n {\n \"value\": \"271\",\n \"text\": \"Data Entry Clerks\"\n },\n {\n \"value\": \"272\",\n \"text\": \"Bank Tellers and Related Clerks\"\n },\n {\n \"value\": \"273\",\n \"text\": \"Travel Consultants and Related Clerks\"\n },\n {\n \"value\": \"274\",\n \"text\": \"Contact/Call Centre Information Clerks\"\n },\n {\n \"value\": \"275\",\n \"text\": \"Telephone Switchboard Operators\"\n },\n {\n \"value\": \"276\",\n \"text\": \"Receptionists\"\n },\n {\n \"value\": \"277\",\n \"text\": \"Enquiry Clerks\"\n },\n {\n \"value\": \"278\",\n \"text\": \"Numerical and Material Recording Clerks\"\n },\n {\n \"value\": \"279\",\n \"text\": \"Transport Conductors\"\n },\n {\n \"value\": \"280\",\n \"text\": \"Cooks\"\n },\n {\n \"value\": \"281\",\n \"text\": \"Building and Housekeeping Supervisors\"\n },\n {\n \"value\": \"282\",\n \"text\": \"Street Food Salespersons\"\n },\n {\n \"value\": \"283\",\n \"text\": \"Sales Demonstrators\"\n },\n {\n \"value\": \"284\",\n \"text\": \"Teachers Aide\"\n },\n {\n \"value\": \"285\",\n \"text\": \"Personal Care Workers in Health Services Not Elsewhere Classified\"\n },\n {\n \"value\": \"286\",\n \"text\": \"Immigration/Custom Officers and Assistants\"\n },\n {\n \"value\": \"287\",\n \"text\": \"Protective Services Workers n.e.c.\"\n },\n {\n \"value\": \"288\",\n \"text\": \"Livestock and Dairy Producers\"\n },\n {\n \"value\": \"289\",\n \"text\": \"Animal Producers and Related Workers Not Elsewhere Classified\"\n },\n {\n \"value\": \"290\",\n \"text\": \"Mixed Crop and Animal Producers\"\n },\n {\n \"value\": \"291\",\n \"text\": \"Subsistence Farmers, Fishermen, Hunters and Gatherers\"\n },\n {\n \"value\": \"292\",\n \"text\": \"House Builders\"\n },\n {\n \"value\": \"293\",\n \"text\": \"Air Conditioning and Refrigeration Mechanics\"\n },\n {\n \"value\": \"294\",\n \"text\": \"Other Building Finishers and Related Trades Workers\"\n },\n {\n \"value\": \"295\",\n \"text\": \"Spray Painters and Varnishers\"\n },\n {\n \"value\": \"296\",\n \"text\": \"Building Structure Cleaners\"\n },\n {\n \"value\": \"297\",\n \"text\": \"Metal Moulders and Coremakers\"\n },\n {\n \"value\": \"298\",\n \"text\": \"Other Sheet and Structural Metal Workers, Moulders, Welders and Related Workers\"\n },\n {\n \"value\": \"299\",\n \"text\": \"Metal Working Machine Tool Setters and Operators\"\n },\n {\n \"value\": \"300\",\n \"text\": \"Aircraft Engine Mechanics and Repairers\"\n },\n {\n \"value\": \"301\",\n \"text\": \"Agricultural and Industrial Machinery Mechanics and Repairers\"\n },\n {\n \"value\": \"302\",\n \"text\": \"Bicycle and Related Repairers\"\n },\n {\n \"value\": \"303\",\n \"text\": \"Machinery Mechanics and Repairers Not Elsewhere Classified\"\n },\n {\n \"value\": \"304\",\n \"text\": \"Sign Writers, Decorative Painters, Engravers and Etchers\"\n },\n {\n \"value\": \"305\",\n \"text\": \"Pre-press Workers\"\n },\n {\n \"value\": \"306\",\n \"text\": \"Other Printing Trades Workers\"\n },\n {\n \"value\": \"307\",\n \"text\": \"Electrical Mechanics and Fitters\"\n },\n {\n \"value\": \"308\",\n \"text\": \"Electronics Mechanics and Servicers\"\n },\n {\n \"value\": \"309\",\n \"text\": \"Information and Communications Technology Installers and Services\"\n },\n {\n \"value\": \"310\",\n \"text\": \"Other Food Processing and Related Trades Workers\"\n },\n {\n \"value\": \"311\",\n \"text\": \"Woodworking-Machine Tool Setters and Operators\"\n },\n {\n \"value\": \"312\",\n \"text\": \"Other Wood Treaters, Cabinet-Makers and Related Trades Workers\"\n },\n {\n \"value\": \"313\",\n \"text\": \"Other Garment and Related Trades Workers\"\n },\n {\n \"value\": \"314\",\n \"text\": \"Other Craft and Related Workers\"\n },\n {\n \"value\": \"315\",\n \"text\": \"Stationary Plant and Machine Operators\"\n },\n {\n \"value\": \"316\",\n \"text\": \"Mechanical Machinery Assemblers\"\n },\n {\n \"value\": \"317\",\n \"text\": \"Assemblers Not Elsewhere Classified\"\n },\n {\n \"value\": \"318\",\n \"text\": \"Machine-Tool Setter-Operators\"\n },\n {\n \"value\": \"319\",\n \"text\": \"Locomotive Engine Drivers\"\n },\n {\n \"value\": \"320\",\n \"text\": \"Railway Brake, Signal and Switch Operators\"\n },\n {\n \"value\": \"321\",\n \"text\": \"Heavy Truck and Bus Drivers\"\n },\n {\n \"value\": \"322\",\n \"text\": \"Mobile Plant Operators\"\n },\n {\n \"value\": \"323\",\n \"text\": \"Mining and Construction Labourers\"\n },\n {\n \"value\": \"324\",\n \"text\": \"Hand and Pedal Vehicle Drivers\"\n },\n {\n \"value\": \"325\",\n \"text\": \"Animal-Drawn Machinery and Vehicle Drivers\"\n },\n {\n \"value\": \"326\",\n \"text\": \"Transport and Storage Labourers\"\n },\n {\n \"value\": \"327\",\n \"text\": \"Shelf Fillers\"\n },\n {\n \"value\": \"328\",\n \"text\": \"Food Preparation Assistant\"\n },\n {\n \"value\": \"329\",\n \"text\": \"Street and Related Sales and Services Workers\"\n },\n {\n \"value\": \"330\",\n \"text\": \"Refuse Workers and Other Elementary Workers\"\n },\n {\n \"value\": \"331\",\n \"text\": \"Nursing and Midwifery Associate Professionals\"\n },\n {\n \"value\": \"332\",\n \"text\": \"Police Officers - Protective Service Workers\"\n },\n {\n \"value\": \"333\",\n \"text\": \"Other Outside Labour Force\"\n },\n {\n \"value\": \"334\",\n \"text\": \"Financial and Investment Advisers\"\n },\n {\n \"value\": \"335\",\n \"text\": \"Business Services Agent\"\n },\n {\n \"value\": \"336\",\n \"text\": \"Health Care Assistants\"\n },\n {\n \"value\": \"337\",\n \"text\": \"Other Clerical Support Workers\"\n },\n {\n \"value\": \"338\",\n \"text\": \"Interior Designers and Decorators\"\n },\n {\n \"value\": \"339\",\n \"text\": \"Software Developers\"\n },\n {\n \"value\": \"340\",\n \"text\": \"Car, Van and Motorcycle Drivers\"\n },\n {\n \"value\": \"341\",\n \"text\": \"Engineering Professionals (including Electrotechnology)\"\n },\n {\n \"value\": \"342\",\n \"text\": \"Driving Instructors\"\n },\n {\n \"value\": \"343\",\n \"text\": \"Manufacturing Labourers\"\n },\n {\n \"value\": \"344\",\n \"text\": \"Administrative and Commercial Managers\"\n },\n {\n \"value\": \"345\",\n \"text\": \"Motor Vehicle Mechanics and Repairers\"\n },\n {\n \"value\": \"346\",\n \"text\": \"Nursing and Midwifery Professionals\"\n },\n {\n \"value\": \"347\",\n \"text\": \"Typist and Word Processor Operators\"\n },\n {\n \"value\": \"348\",\n \"text\": \"Painters and Related Workers\"\n },\n {\n \"value\": \"349\",\n \"text\": \"Police Officers\"\n },\n {\n \"value\": \"350\",\n \"text\": \"Stall and Market Salespersons\"\n },\n {\n \"value\": \"351\",\n \"text\": \"Shop Supervisors\"\n },\n {\n \"value\": \"352\",\n \"text\": \"Other Teaching Professionals\"\n },\n {\n \"value\": \"353\",\n \"text\": \"Information and Communications Technicians\"\n },\n {\n \"value\": \"354\",\n \"text\": \"Ships Deck Officers and Pilots\"\n },\n {\n \"value\": \"355\",\n \"text\": \"Chefs\"\n },\n {\n \"value\": \"356\",\n \"text\": \"Building Architects\"\n },\n {\n \"value\": \"357\",\n \"text\": \"Visual Artists\"\n },\n {\n \"value\": \"358\",\n \"text\": \"Creative and Performing Artists n.e.c.\"\n },\n {\n \"value\": \"359\",\n \"text\": \"Regulatory Government Professionals Not Elsewhere Classified\"\n },\n {\n \"value\": \"360\",\n \"text\": \"Cleaners and Helpers\"\n },\n {\n \"value\": \"361\",\n \"text\": \"Optometrists and Ophthalmic Opticians\"\n },\n {\n \"value\": \"362\",\n \"text\": \"Mathematicians, Actuaries and Statisticians\"\n },\n {\n \"value\": \"363\",\n \"text\": \"Financial Analysts\"\n },\n {\n \"value\": \"364\",\n \"text\": \"Administrative Professional\"\n },\n {\n \"value\": \"365\",\n \"text\": \"Other Legislators and Senior Officials\"\n },\n {\n \"value\": \"366\",\n \"text\": \"Personal Assistant\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"preferredLanguage\",\n \"displayName\": \"Preferred Language\",\n \"placeholder\": \"Select Preferred Language\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"English\"\n },\n {\n \"value\": \" 02\",\n \"text\": \"Bahasa\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"race\",\n \"displayName\": \"Race\",\n \"placeholder\": \"Select Race\",\n \"type\": \"dropdown\",\n \"startWithNewLine\": false,\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Malaysian - Chinese\"\n },\n {\n \"value\": \"02\",\n \"text\": \"Malaysian - Bumiputra - Malay\"\n },\n {\n \"value\": \"03\",\n \"text\": \"Malaysian - Bumiputra - Non Malay\"\n },\n {\n \"value\": \"04\",\n \"text\": \"Malaysian - Indian\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Malaysian - Other Race\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"relationshiptoContactName\",\n \"displayName\": \"Relationship to Contact Name\",\n \"type\": \"dropdown\",\n \"placeholder\": \"Relationship to contact Name\",\n \"choices\": [\n {\n \"value\": \"07\",\n \"text\": \"Father\"\n },\n {\n \"value\": \"08\",\n \"text\": \"Mother\"\n },\n {\n \"value\": \"09\",\n \"text\": \"Brother\"\n },\n {\n \"value\": \"10\",\n \"text\": \"Sister\"\n },\n {\n \"value\": \"11\",\n \"text\": \"Spouse\"\n },\n {\n \"value\": \"12\",\n \"text\": \"Son\"\n },\n {\n \"value\": \"13\",\n \"text\": \"Daughter\"\n },\n {\n \"value\": \"14\",\n \"text\": \"Uncle\"\n },\n {\n \"value\": \"15\",\n \"text\": \"Aunt\"\n },\n {\n \"value\": \"40\",\n \"text\": \"Relative\"\n }\n ],\n \"category\": \"8\"\n },\n {\n \"name\": \"residenceType\",\n \"displayName\": \"Residence Type\",\n \"placeholder\": \"Residence Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"PL0001\",\n \"text\": \"Own Property\"\n },\n {\n \"value\": \"PL0002\",\n \"text\": \"Mortgaged\"\n },\n {\n \"value\": \"PL0003\",\n \"text\": \"Employers\"\n },\n {\n \"value\": \"PL0004\",\n \"text\": \"Rented\"\n },\n {\n \"value\": \"PL0005\",\n \"text\": \"Parents\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"salutation\",\n \"displayName\": \"Salutation\",\n \"placeholder\": \"Select Salutation\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"002\",\n \"text\": \"CIK\"\n },\n {\n \"value\": \"004\",\n \"text\": \"DATIN\"\n },\n {\n \"value\": \"009\",\n \"text\": \"Datin Seri\"\n },\n {\n \"value\": \"011\",\n \"text\": \"DATO`\"\n },\n {\n \"value\": \"018\",\n \"text\": \"DATO SERI\"\n },\n {\n \"value\": \"023\",\n \"text\": \"DATUK\"\n },\n {\n \"value\": \"028\",\n \"text\": \"DOCTOR\"\n },\n {\n \"value\": \"033\",\n \"text\": \"ENCIK\"\n },\n {\n \"value\": \"043\",\n \"text\": \"DYTM\"\n },\n {\n \"value\": \"053\",\n \"text\": \"MADAM\"\n },\n {\n \"value\": \"061\",\n \"text\": \"MISS\"\n },\n {\n \"value\": \"062\",\n \"text\": \"MR\"\n },\n {\n \"value\": \"072\",\n \"text\": \"PUAN\"\n },\n {\n \"value\": \"075\",\n \"text\": \"PUAN SRI\"\n },\n {\n \"value\": \"079\",\n \"text\": \"TAN SRI\"\n },\n {\n \"value\": \"090\",\n \"text\": \"Toh Puan\"\n },\n {\n \"value\": \"102\",\n \"text\": \"YAM\"\n },\n {\n \"value\": \"151\",\n \"text\": \"DATO SRI\"\n },\n {\n \"value\": \"157\",\n \"text\": \"TYT TUN DATUK SERI PANGLIMA\"\n },\n {\n \"value\": \"158\",\n \"text\": \"Ms\"\n },\n {\n \"value\": \"159\",\n \"text\": \"KDYTM\"\n }\n ],\n \"category\": \"2\"\n },\n {\n \"name\": \"sourceOfWealth\",\n \"displayName\": \"Source of Wealth\",\n \"placeholder\": \"Source of Wealth\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Accumulated Saving\"\n },\n {\n \"value\": \"02\",\n \"text\": \"Employment income\"\n },\n {\n \"value\": \"03\",\n \"text\": \"Inheritance\"\n },\n {\n \"value\": \"04\",\n \"text\": \"Trust Fund\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Retirement Income\"\n },\n {\n \"value\": \"06\",\n \"text\": \"EPF\"\n },\n {\n \"value\": \"07\",\n \"text\": \"Disposal of Assets/Shares\"\n },\n {\n \"value\": \"08\",\n \"text\": \"Insurance Maturity/Surrender\"\n },\n {\n \"value\": \"09\",\n \"text\": \"Return on investment\"\n },\n {\n \"value\": \"10\",\n \"text\": \"Legal Settlement\"\n },\n {\n \"value\": \"11\",\n \"text\": \"Income from own business\"\n }\n ],\n \"category\": \"4\"\n },\n {\n \"name\": \"statementType\",\n \"displayName\": \"Statement Type\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"E\",\n \"text\": \"Email\"\n },\n {\n \"value\": \"R\",\n \"text\": \"RHB Now\"\n }\n ],\n \"category\": \"10\"\n },\n {\n \"name\": \"subEmploymentSector\",\n \"displayName\": \"Sub Employment Sector\",\n \"placeholder\": \"Select Sub Employment Sector\",\n \"startWithNewLine\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"0011\",\n \"text\": \"Accounting\"\n },\n {\n \"value\": \"0021\",\n \"text\": \"Actuarial / Statistic\"\n },\n {\n \"value\": \"0031\",\n \"text\": \"Advertising\"\n },\n {\n \"value\": \"0032\",\n \"text\": \"Public Relations\"\n },\n {\n \"value\": \"0041\",\n \"text\": \"Aerospace\"\n },\n {\n \"value\": \"0051\",\n \"text\": \"Agricultural / Chemicals / Forest Products\"\n },\n {\n \"value\": \"0052\",\n \"text\": \"Support activities to agriculture and post-harvest crops activities\"\n },\n {\n \"value\": \"0053\",\n \"text\": \"Growing paddy, sugar cane, vegetables and melons, roots, tubers, perennial crops\"\n },\n {\n \"value\": \"0054\",\n \"text\": \"Raising of animals\"\n },\n {\n \"value\": \"0055\",\n \"text\": \"Mixed farming\"\n },\n {\n \"value\": \"0056\",\n \"text\": \"Fishing / aquaculture\"\n },\n {\n \"value\": \"0057\",\n \"text\": \"Plantation (e.g. oil palm, rubber tree, cocoa, coconut etc.)\"\n },\n {\n \"value\": \"0058\",\n \"text\": \"Silviculture and forestry activities\"\n },\n {\n \"value\": \"0059\",\n \"text\": \"Veterinary activities\"\n },\n {\n \"value\": \"0061\",\n \"text\": \"Architecture\"\n },\n {\n \"value\": \"0062\",\n \"text\": \"Engineering Services\"\n },\n {\n \"value\": \"0063\",\n \"text\": \"Engineering technical services\"\n },\n {\n \"value\": \"0064\",\n \"text\": \"Surveying Services\"\n },\n {\n \"value\": \"0071\",\n \"text\": \"Manufacture of Switchgear and Switchboard Apparatus\"\n },\n {\n \"value\": \"0072\",\n \"text\": \"Manufacture of Insulated wire and cable\"\n },\n {\n \"value\": \"0073\",\n \"text\": \"Manufacture of TV radio communication equipment\"\n },\n {\n \"value\": \"0074\",\n \"text\": \"Manufacture of Typesetting; Platemaking and Related Services\"\n },\n {\n \"value\": \"0075\",\n \"text\": \"Manufacture of Aircraft and related machinery\"\n },\n {\n \"value\": \"0076\",\n \"text\": \"Manufacture of Consumer goods & Pharmaceuticals\"\n },\n {\n \"value\": \"0077\",\n \"text\": \"Manufacture of jewellery, bijouterie & related articles\"\n },\n {\n \"value\": \"0078\",\n \"text\": \"Manufacture of machinery/ motor vehicles/ other transport equipment\"\n },\n {\n \"value\": \"0079\",\n \"text\": \"Manufacture of other fabricated metal product\"\n },\n {\n \"value\": \"0081\",\n \"text\": \"Aviation\"\n },\n {\n \"value\": \"0091\",\n \"text\": \"Radio, Television, and Consumer Electronics Stores\"\n },\n {\n \"value\": \"0092\",\n \"text\": \"Retail garments / apparels\"\n },\n {\n \"value\": \"0093\",\n \"text\": \"Household goods\"\n },\n {\n \"value\": \"0094\",\n \"text\": \"Furniture stores\"\n },\n {\n \"value\": \"0095\",\n \"text\": \"Retail sale of Chinaware Glassware\"\n },\n {\n \"value\": \"0096\",\n \"text\": \"Other retail trade (except for motor vehicle, f&b, health care and grocery)\"\n },\n {\n \"value\": \"0097\",\n \"text\": \"Other retail sale in non-specialized stores\"\n },\n {\n \"value\": \"0098\",\n \"text\": \"Retail sale of beer, wine and spirits\"\n },\n {\n \"value\": \"0099\",\n \"text\": \"Retail sale of tobacco products in specialized store\"\n },\n {\n \"value\": \"0101\",\n \"text\": \"Radio and Television Repair Shops\"\n },\n {\n \"value\": \"0102\",\n \"text\": \"Repair Shops and Related Services, N.E.C.;\"\n },\n {\n \"value\": \"0103\",\n \"text\": \"Refrigeration and Air-Conditioning Service and Repair Shops;\"\n },\n {\n \"value\": \"0104\",\n \"text\": \"Computer related activities;\"\n },\n {\n \"value\": \"0105\",\n \"text\": \"Electrical and Electronic Repair Shops, N.E.C\"\n },\n {\n \"value\": \"00110\",\n \"text\": \"Construction of other civil engineering projects (specialised)\"\n },\n {\n \"value\": \"0111\",\n \"text\": \"Building Construction\"\n },\n {\n \"value\": \"00111\",\n \"text\": \"Construction of other civil engineering projects (not specialised)\"\n },\n {\n \"value\": \"00112\",\n \"text\": \"Electrical, Installation and plumbing\"\n },\n {\n \"value\": \"00113\",\n \"text\": \"Demolition and site preparation\"\n },\n {\n \"value\": \"00114\",\n \"text\": \"Construction of utility projects\"\n },\n {\n \"value\": \"0114\",\n \"text\": \"Construction of Residential house (landed property)\"\n },\n {\n \"value\": \"00115\",\n \"text\": \"Other specialized construction activities\"\n },\n {\n \"value\": \"0115\",\n \"text\": \"Construction of other residentials\"\n },\n {\n \"value\": \"00116\",\n \"text\": \"Roofing, Siding, and Sheet Metal Work\"\n },\n {\n \"value\": \"0116\",\n \"text\": \"Construction of industrial building & factories\"\n },\n {\n \"value\": \"00117\",\n \"text\": \"Water, Sewer, Pipeline, and Communications and Power Line Construction\"\n },\n {\n \"value\": \"0117\",\n \"text\": \"Construction of office buildings\"\n },\n {\n \"value\": \"00118\",\n \"text\": \"Assembly and erection of prefabricated constructions on the site\"\n },\n {\n \"value\": \"0118\",\n \"text\": \"Construction of commercial complex\"\n },\n {\n \"value\": \"0119\",\n \"text\": \"Construction of infrastructure\"\n },\n {\n \"value\": \"00119\",\n \"text\": \"Construction of hotels\"\n },\n {\n \"value\": \"00120\",\n \"text\": \"Construction of condominiums/apartments\"\n },\n {\n \"value\": \"0121\",\n \"text\": \"Creative / Graphics\"\n },\n {\n \"value\": \"0131\",\n \"text\": \"Customer Service\"\n },\n {\n \"value\": \"0141\",\n \"text\": \"Higher Education with significant reliance on foreign/international students\"\n },\n {\n \"value\": \"0142\",\n \"text\": \"Higher Education with no significant reliance on foreign students\"\n },\n {\n \"value\": \"0143\",\n \"text\": \"Administration of the State and the economic and social policy of the community\"\n },\n {\n \"value\": \"0144\",\n \"text\": \"Public - Pre school, primary and secondary level education\"\n },\n {\n \"value\": \"0145\",\n \"text\": \"Private - Pre school, primary and secondary level education\"\n },\n {\n \"value\": \"0151\",\n \"text\": \"O&G - Upstream i.e. drilling, extraction, exploration and field services\"\n },\n {\n \"value\": \"0152\",\n \"text\": \"O&G - Other than Upstream\"\n },\n {\n \"value\": \"0153\",\n \"text\": \"Mining of iron ores and other non-ferrous metal ores\"\n },\n {\n \"value\": \"0154\",\n \"text\": \"Stonequarrying, clay & sand pits\"\n },\n {\n \"value\": \"155\",\n \"text\": \"Chemical & fertilizer mining\"\n },\n {\n \"value\": \"0155\",\n \"text\": \"Chemical & fertiliser mining\"\n },\n {\n \"value\": \"156\",\n \"text\": \"Other than oil and gas\"\n },\n {\n \"value\": \"0156\",\n \"text\": \"Other than oil and gas\"\n },\n {\n \"value\": \"161\",\n \"text\": \"Engineering Services & Engineering Technical Services\"\n },\n {\n \"value\": \"0161\",\n \"text\": \"Engineering Services & Engineering Technical Services\"\n },\n {\n \"value\": \"171\",\n \"text\": \"Banking services\"\n },\n {\n \"value\": \"0171\",\n \"text\": \"Banking services\"\n },\n {\n \"value\": \"172\",\n \"text\": \"Finance services\"\n },\n {\n \"value\": \"0172\",\n \"text\": \"Finance services\"\n },\n {\n \"value\": \"0173\",\n \"text\": \"Insurance services\"\n },\n {\n \"value\": \"173\",\n \"text\": \"Insurance services\"\n },\n {\n \"value\": \"0174\",\n \"text\": \"Money lenders / Money Changers/ Remittance Services/ Money Transmitter/ Check Cashing Business/ Currency Exchange\"\n },\n {\n \"value\": \"0175\",\n \"text\": \"Pawnshop\"\n },\n {\n \"value\": \"0176\",\n \"text\": \"Activity of holding companies\"\n },\n {\n \"value\": \"0177\",\n \"text\": \"Financial leasing activities\"\n },\n {\n \"value\": \"0178\",\n \"text\": \"Finance - credit card services\"\n },\n {\n \"value\": \"0179\",\n \"text\": \"Consultancy services\"\n },\n {\n \"value\": \"0181\",\n \"text\": \"Freight Forwarding Services\"\n },\n {\n \"value\": \"0191\",\n \"text\": \"Government\"\n },\n {\n \"value\": \"0192\",\n \"text\": \"Public Service\"\n },\n {\n \"value\": \"0193\",\n \"text\": \"Military\"\n },\n {\n \"value\": \"0201\",\n \"text\": \"Tourism & Hospitality\"\n },\n {\n \"value\": \"0202\",\n \"text\": \"Recreational related services / activities\"\n },\n {\n \"value\": \"0211\",\n \"text\": \"Food Service Activities\"\n },\n {\n \"value\": \"0212\",\n \"text\": \"Organization Hotel, Lodging Houses, chalet, rest house, homestay, Inn, motels, rooming sporting, and recreational camp\"\n },\n {\n \"value\": \"0213\",\n \"text\": \"Other short term accommodation not mentioned above\"\n },\n {\n \"value\": \"0214\",\n \"text\": \"Restaurants, bars and canteens\"\n },\n {\n \"value\": \"0215\",\n \"text\": \"Restaurant, bar (other discretionary items and significant reliance on dine-in)\"\n },\n {\n \"value\": \"0216\",\n \"text\": \"Event catering and other food service activities\"\n },\n {\n \"value\": \"0217\",\n \"text\": \"Eating Places, Except Food Service, Institutional\"\n },\n {\n \"value\": \"0221\",\n \"text\": \"Human Resources\"\n },\n {\n \"value\": \"0231\",\n \"text\": \"Investment advisory services\"\n },\n {\n \"value\": \"0241\",\n \"text\": \"Journalist / Editor\"\n },\n {\n \"value\": \"0251\",\n \"text\": \"Motion picture, video and television programme production, sound recording and music publishing activities\"\n },\n {\n \"value\": \"0252\",\n \"text\": \"Programming and broadcasting activities\"\n },\n {\n \"value\": \"0253\",\n \"text\": \"News agency activities\"\n },\n {\n \"value\": \"0254\",\n \"text\": \"Media, culture and recreational activities\"\n },\n {\n \"value\": \"0261\",\n \"text\": \"Medical / Health Services\"\n },\n {\n \"value\": \"0262\",\n \"text\": \"Kidney Dialysis Centers\"\n },\n {\n \"value\": \"0263\",\n \"text\": \"Intermediate Care Facilities\"\n },\n {\n \"value\": \"0264\",\n \"text\": \"Home Health Care Services Facilities\"\n },\n {\n \"value\": \"0271\",\n \"text\": \"Non-Profit Organization\"\n },\n {\n \"value\": \"0281\",\n \"text\": \"Geology\"\n },\n {\n \"value\": \"0291\",\n \"text\": \"Pharmaceuticals products\"\n },\n {\n \"value\": \"0301\",\n \"text\": \"Real estate operations - shopping complex\"\n },\n {\n \"value\": \"0302\",\n \"text\": \"Appraisal services for real estate\"\n },\n {\n \"value\": \"0303\",\n \"text\": \"Real estate activities on a fee or contract basis\"\n },\n {\n \"value\": \"0304\",\n \"text\": \"Buying, selling, renting and operating of residential buildings or land\"\n },\n {\n \"value\": \"0305\",\n \"text\": \"Real estate operations - shophouse\"\n },\n {\n \"value\": \"0306\",\n \"text\": \"Real estate Operation - Industrial building & factories\"\n },\n {\n \"value\": \"0307\",\n \"text\": \"Real estate Operation - office building\"\n },\n {\n \"value\": \"0308\",\n \"text\": \"Real estate Operation - other commercial building\"\n },\n {\n \"value\": \"0309\",\n \"text\": \"Real estate operation not related above\"\n },\n {\n \"value\": \"0311\",\n \"text\": \"Administrative and Support Service Activities\"\n },\n {\n \"value\": \"0321\",\n \"text\": \"Social Work Activites\"\n },\n {\n \"value\": \"0331\",\n \"text\": \"Wired / Wireless telecommunications activities\"\n },\n {\n \"value\": \"0341\",\n \"text\": \"Tour operators\"\n },\n {\n \"value\": \"0342\",\n \"text\": \"Travel Agencies\"\n },\n {\n \"value\": \"0351\",\n \"text\": \"Rail transport\"\n },\n {\n \"value\": \"0352\",\n \"text\": \"Transportation Services, N.E.C.\"\n },\n {\n \"value\": \"0353\",\n \"text\": \"Service activities incidental to land / road transportation\"\n },\n {\n \"value\": \"0354\",\n \"text\": \"Scheduled and Non-Scheduled Air Transport (Transport of passengers by air over regular routes and on regular schedules)\"\n },\n {\n \"value\": \"0355\",\n \"text\": \"Aircrafts, Aircraft engine / parts, space vehicles\"\n },\n {\n \"value\": \"0356\",\n \"text\": \"Tanks and Tank components\"\n },\n {\n \"value\": \"0357\",\n \"text\": \"Warehousing and storage\"\n },\n {\n \"value\": \"0358\",\n \"text\": \"Water transport\"\n },\n {\n \"value\": \"0359\",\n \"text\": \"Other transportation support activities n.e.c. (e.g. arranging transportation services, terminal maintenance services, etc)\"\n },\n {\n \"value\": \"0361\",\n \"text\": \"Casinos including Junket Operators\"\n },\n {\n \"value\": \"0362\",\n \"text\": \"Karaoke lounges, internet cafe or video arcade\"\n },\n {\n \"value\": \"0363\",\n \"text\": \"Amusement and Recreation Services\"\n },\n {\n \"value\": \"0364\",\n \"text\": \"Membership Sports and Recreation Clubs\"\n },\n {\n \"value\": \"0365\",\n \"text\": \"Entertainment services\"\n },\n {\n \"value\": \"0366\",\n \"text\": \"Arts & Theatrical\"\n },\n {\n \"value\": \"0371\",\n \"text\": \"Electricty power generation\"\n },\n {\n \"value\": \"0372\",\n \"text\": \"Steam and air conditioning supply\"\n },\n {\n \"value\": \"0373\",\n \"text\": \"Water collection, treatment and supply\"\n },\n {\n \"value\": \"0381\",\n \"text\": \"Water Supply\"\n },\n {\n \"value\": \"0382\",\n \"text\": \"Sewerage\"\n },\n {\n \"value\": \"0383\",\n \"text\": \"Waste Management and Remediation Activities\"\n },\n {\n \"value\": \"0384\",\n \"text\": \"Recycling of non-metal (including rubber & textile fibre)\"\n },\n {\n \"value\": \"0385\",\n \"text\": \"Recycling of tin and other metal waste and scrap\"\n },\n {\n \"value\": \"0391\",\n \"text\": \"Activities of Households as Employers; Undifferentiated Goods and Services Producing Activities of Households for Own Use\"\n },\n {\n \"value\": \"0401\",\n \"text\": \"Activities of Extraterritorial Organisations and Bodies\"\n },\n {\n \"value\": \"0411\",\n \"text\": \"Unemployed/ Outside Labour Force\"\n },\n {\n \"value\": \"0421\",\n \"text\": \"Activities of membership organisations (Political/Religious/Trade Union)\"\n },\n {\n \"value\": \"0422\",\n \"text\": \"International Business Corporations and other similar entities\"\n },\n {\n \"value\": \"0423\",\n \"text\": \"Business Activities - Intermediary activities - trustee/ nominee/ agent OR Shell Companies\"\n },\n {\n \"value\": \"0424\",\n \"text\": \"Other Services\"\n },\n {\n \"value\": \"0425\",\n \"text\": \"Offshore Corporations (or their subsidiaries) and bank set up in tax and/or secrecy havens\"\n },\n {\n \"value\": \"0426\",\n \"text\": \"Building Cleaning and Maintenance Services, N.E.C.\"\n },\n {\n \"value\": \"0427\",\n \"text\": \"Detective, Guard, and Armored Car Services\"\n },\n {\n \"value\": \"0428\",\n \"text\": \"Rental, Leasing and Packaging ( tour operator, reservation services and related activities, Organisation of conventions and trade shows)\"\n },\n {\n \"value\": \"0429\",\n \"text\": \"Funeral Service and Crematories\"\n },\n {\n \"value\": \"0431\",\n \"text\": \"Legal Services\"\n },\n {\n \"value\": \"0441\",\n \"text\": \"Research & Experiemental Development Services\"\n },\n {\n \"value\": \"0451\",\n \"text\": \"Other Professional, scientific and Technical activities\"\n },\n {\n \"value\": \"00510\",\n \"text\": \"Hunting, trapping and related service activities\"\n },\n {\n \"value\": \"00511\",\n \"text\": \"Logging\"\n },\n {\n \"value\": \"00710\",\n \"text\": \"Manufacture of watches and clocks\"\n },\n {\n \"value\": \"0711\",\n \"text\": \"Manufacture of others\"\n },\n {\n \"value\": \"00711\",\n \"text\": \"Manufacture of others\"\n },\n {\n \"value\": \"0712\",\n \"text\": \"Maintenance and repair of motor vehicles\"\n },\n {\n \"value\": \"00712\",\n \"text\": \"Maintenance and repair of motor vehicles\"\n },\n {\n \"value\": \"0713\",\n \"text\": \"Manufacture of furniture\"\n },\n {\n \"value\": \"00713\",\n \"text\": \"Manufacture of furniture\"\n },\n {\n \"value\": \"0714\",\n \"text\": \"Manufacture of packaging and stretch film\"\n },\n {\n \"value\": \"00714\",\n \"text\": \"Manufacture of packaging and stretch film\"\n },\n {\n \"value\": \"0715\",\n \"text\": \"Manufacture of plastic product\"\n },\n {\n \"value\": \"00715\",\n \"text\": \"Manufacture of plastic product\"\n },\n {\n \"value\": \"0716\",\n \"text\": \"Manufacture of rubber product\"\n },\n {\n \"value\": \"00716\",\n \"text\": \"Manufacture of rubber product\"\n },\n {\n \"value\": \"00717\",\n \"text\": \"Manufacture of processed food or beverages products\"\n },\n {\n \"value\": \"0717\",\n \"text\": \"Manufacture of processed food or beverages products\"\n },\n {\n \"value\": \"00718\",\n \"text\": \"Manufacture of wood product except furniture\"\n },\n {\n \"value\": \"0718\",\n \"text\": \"Manufacture of wood product except furniture\"\n },\n {\n \"value\": \"00719\",\n \"text\": \"Manufacture of refined petroleum products\"\n },\n {\n \"value\": \"0719\",\n \"text\": \"Manufacture of refined petroleum products\"\n },\n {\n \"value\": \"00720\",\n \"text\": \"Manufacture of chemicals and chemical products (except for refined petroleum products)\"\n },\n {\n \"value\": \"0720\",\n \"text\": \"Manufacture of chemicals and chemical products (except for refined petroleum products)\"\n },\n {\n \"value\": \"00721\",\n \"text\": \"Manufacture of electrical equipment or components\"\n },\n {\n \"value\": \"00722\",\n \"text\": \"Manufacture of dairy food\"\n },\n {\n \"value\": \"00723\",\n \"text\": \"Manufacture of grain mills\"\n },\n {\n \"value\": \"00724\",\n \"text\": \"Manufacture of other food product (except dairy food and grain mills, starches and starch products)\"\n },\n {\n \"value\": \"00725\",\n \"text\": \"Manufacture of vegetable and animal oils and fats\"\n },\n {\n \"value\": \"00726\",\n \"text\": \"Manufacture of textiles\"\n },\n {\n \"value\": \"00727\",\n \"text\": \"Manufacture of footwear\"\n },\n {\n \"value\": \"00728\",\n \"text\": \"Manufacture of building materials\"\n },\n {\n \"value\": \"00729\",\n \"text\": \"Manufacture of glass and glass products\"\n },\n {\n \"value\": \"00730\",\n \"text\": \"Manufacture of mineral products\"\n },\n {\n \"value\": \"00731\",\n \"text\": \"Manufacture of medical and dental instruments and supplies\"\n },\n {\n \"value\": \"00732\",\n \"text\": \"Manufacturing of automobile or autopart\"\n },\n {\n \"value\": \"00733\",\n \"text\": \"Manufacture of paper and paper products\"\n },\n {\n \"value\": \"00734\",\n \"text\": \"Manufacture of gas and distribution of gaseous fuels through mains\"\n },\n {\n \"value\": \"00735\",\n \"text\": \"Manufacture of fertiliser pesticides\"\n },\n {\n \"value\": \"00736\",\n \"text\": \"Production of natural mineral water and other bottled water\"\n },\n {\n \"value\": \"00901\",\n \"text\": \"Retail trade not in stores, stalls or markets\"\n },\n {\n \"value\": \"00902\",\n \"text\": \"Retail sale via stalls and markets\"\n },\n {\n \"value\": \"00903\",\n \"text\": \"Wholesale of beer, wine and spirits\"\n },\n {\n \"value\": \"00904\",\n \"text\": \"Wholesale of tobacco, cigar, cigarettes\"\n },\n {\n \"value\": \"00905\",\n \"text\": \"Wholesale of construction and civil engineering machinery and equipment\"\n },\n {\n \"value\": \"00906\",\n \"text\": \"Wholesale of other machinery for use in industry, trade and navigation and other services n.e.c.\"\n },\n {\n \"value\": \"00907\",\n \"text\": \"Motor Vehicle dealer (Used)\"\n },\n {\n \"value\": \"00908\",\n \"text\": \"Jewel / Gem / Precious Metal\"\n },\n {\n \"value\": \"00909\",\n \"text\": \"Automobile and autoparts\"\n },\n {\n \"value\": \"00910\",\n \"text\": \"Hardware / construction material\"\n },\n {\n \"value\": \"00911\",\n \"text\": \"Electrical products\"\n },\n {\n \"value\": \"00912\",\n \"text\": \"Chemical / Petrochemical\"\n },\n {\n \"value\": \"00913\",\n \"text\": \"Cosmetics\"\n },\n {\n \"value\": \"00914\",\n \"text\": \"Import / Export\"\n },\n {\n \"value\": \"00915\",\n \"text\": \"Medical related products\"\n },\n {\n \"value\": \"00916\",\n \"text\": \"Automatic Merchandising Machine Operators\"\n },\n {\n \"value\": \"00917\",\n \"text\": \"Direct Selling Establishments\"\n },\n {\n \"value\": \"00918\",\n \"text\": \"Liquefied Petroleum Gas (Bottled Gas) Dealers\"\n },\n {\n \"value\": \"00919\",\n \"text\": \"Motor Vehicle Dealers (New )\"\n },\n {\n \"value\": \"00920\",\n \"text\": \"Office equipment\"\n },\n {\n \"value\": \"00921\",\n \"text\": \"Stationery, books, periodical and newspapers\"\n },\n {\n \"value\": \"00922\",\n \"text\": \"Retail - Petrol Station\"\n },\n {\n \"value\": \"00923\",\n \"text\": \"Retail / wholesaler other than above\"\n },\n {\n \"value\": \"01700\",\n \"text\": \"Other monetary intermediation\"\n },\n {\n \"value\": \"1700\",\n \"text\": \"Other monetary intermediation\"\n },\n {\n \"value\": \"01701\",\n \"text\": \"Research & Experiemental Development Services\"\n },\n {\n \"value\": \"1701\",\n \"text\": \"Research & Experimental Development Services\"\n },\n {\n \"value\": \"01702\",\n \"text\": \"licensed money lending activities, co-operative with credit functions and factoring companies\"\n },\n {\n \"value\": \"1702\",\n \"text\": \"licensed money lending activities, co-operative with credit functions and factoring companies\"\n },\n {\n \"value\": \"03510\",\n \"text\": \"Postal and courier activities\"\n },\n {\n \"value\": \"04201\",\n \"text\": \"Beauty Shops\"\n },\n {\n \"value\": \"04202\",\n \"text\": \"Barber Shops\"\n },\n {\n \"value\": \"04203\",\n \"text\": \"Libraries, archives, museums and other cultural activities\"\n },\n {\n \"value\": \"04204\",\n \"text\": \"Reupholstery and Furniture Repair\"\n },\n {\n \"value\": \"04205\",\n \"text\": \"Armature Rewinding Shops\"\n },\n {\n \"value\": \"04206\",\n \"text\": \"Welding Repair\"\n },\n {\n \"value\": \"04207\",\n \"text\": \"Maintenance and repair of motor vehicles\"\n },\n {\n \"value\": \"04208\",\n \"text\": \"Renting and leasing of motor vehicle, household good, machinery, equipment and tangible goods\"\n },\n {\n \"value\": \"04209\",\n \"text\": \"Business management consultancy services\"\n },\n {\n \"value\": \"04210\",\n \"text\": \"Activties of collection agencies / credit bureaus\"\n },\n {\n \"value\": \"04211\",\n \"text\": \"Repair of bicycles\"\n },\n {\n \"value\": \"04212\",\n \"text\": \"Repair of footwear and other leather goods\"\n }\n ],\n \"category\": \"5\"\n },\n {\n \"name\": \"dateApplied\",\n \"displayName\": \"Date Applied\",\n \"type\": \"text\",\n \"inputType\": \"date\",\n \"category\": \"11\"\n },\n {\n \"name\": \"entity\",\n \"displayName\": \"Entity\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"C\",\n \"text\": \"Conventional\"\n },\n {\n \"value\": \"I\",\n \"text\": \"Islamic\"\n }\n ],\n \"category\": \"10\"\n },\n {\n \"name\": \"facilityPackage\",\n \"displayName\": \"Facility Package\",\n \"type\": \"text\",\n \"category\": \"11\"\n },\n {\n \"name\": \"purposeOfAcquisition\",\n \"displayName\": \"Purpose of Acquisition\",\n \"placeholder\": \"Select your Purpose of Acquisition\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"Internal Use\",\n \"text\": \"Internal Use\"\n },\n {\n \"value\": \"Tender\",\n \"text\": \"Tender\"\n },\n {\n \"value\": \"Service\",\n \"text\": \"Service\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"facilityPurpose\",\n \"displayName\": \"Facility Purpose\",\n \"type\": \"dropdown\",\n \"defaultValue\": \"Refinancing of property\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Staff ASB - Untuk Kegunaan Sendiri dalam Pelaburan ASB\"\n },\n {\n \"value\": \"02\",\n \"text\": \"ASB - Untuk Kegunaan Sendiri dalam pelaburan ASB\"\n },\n {\n \"value\": \"002\",\n \"text\": \"Finance purchase of property/land for INVESTMENT.\"\n },\n {\n \"value\": \"03\",\n \"text\": \"ASB2 - Untuk Kegunaan Sendiri dalam Pelaburan ASB2\"\n },\n {\n \"value\": \"003\",\n \"text\": \"Finance purchase of prop/land for own occupation\"\n },\n {\n \"value\": \"04\",\n \"text\": \"Personal Consumption Against ASB/ASM2W Certificate\"\n },\n {\n \"value\": \"05\",\n \"text\": \"ASB/ASM2W for Sole-prop Business\"\n },\n {\n \"value\": \"005\",\n \"text\": \"Personal consumption\"\n },\n {\n \"value\": \"008\",\n \"text\": \"Construction of property\"\n },\n {\n \"value\": \"010\",\n \"text\": \"Purchase of property for INVESTMENT & consumption.\"\n },\n {\n \"value\": \"013\",\n \"text\": \"Purchase of car park\"\n },\n {\n \"value\": \"015\",\n \"text\": \"To finance renovation/upgrading cost\"\n },\n {\n \"value\": \"016\",\n \"text\": \"To part finance Car Park and Renovation Cost\"\n },\n {\n \"value\": \"018\",\n \"text\": \"Staff - Renovation of property under staff rate\"\n },\n {\n \"value\": \"023\",\n \"text\": \"Refinancing of property\"\n },\n {\n \"value\": \"026\",\n \"text\": \"Staff Sundry Loan - Calamities\"\n },\n {\n \"value\": \"027\",\n \"text\": \"Staff-To part finance Medical Expenses\"\n },\n {\n \"value\": \"028\",\n \"text\": \"Staff-To part finance the purchase of a personal computer\"\n },\n {\n \"value\": \"029\",\n \"text\": \"Staff-Purchase of new car\"\n },\n {\n \"value\": \"030\",\n \"text\": \"Staff- study loan\"\n },\n {\n \"value\": \"031\",\n \"text\": \"Staff-Purchase of motorcycle\"\n },\n {\n \"value\": \"036\",\n \"text\": \"Staff-Staff Sundry loan\"\n },\n {\n \"value\": \"037\",\n \"text\": \"Booking Fee - Car\"\n },\n {\n \"value\": \"038\",\n \"text\": \"Debt Consolidation\"\n },\n {\n \"value\": \"039\",\n \"text\": \"Education\"\n },\n {\n \"value\": \"040\",\n \"text\": \"Electrical Goods\"\n },\n {\n \"value\": \"041\",\n \"text\": \"Home Furnishing/Equipment\"\n },\n {\n \"value\": \"042\",\n \"text\": \"Medical Expenses\"\n },\n {\n \"value\": \"043\",\n \"text\": \"Online Financing\"\n },\n {\n \"value\": \"044\",\n \"text\": \"Personal Refinancing\"\n },\n {\n \"value\": \"045\",\n \"text\": \"Property/House Downpayment\"\n },\n {\n \"value\": \"046\",\n \"text\": \"Renovation\"\n },\n {\n \"value\": \"047\",\n \"text\": \"Travel\"\n },\n {\n \"value\": \"048\",\n \"text\": \"Additional Financing for Revival of Abandoned Project\"\n },\n {\n \"value\": \"100\",\n \"text\": \"Purchase of Resident / Non Resident Property for personal purpose\"\n },\n {\n \"value\": \"101\",\n \"text\": \"Purchase of securities quoted on the Bursa Malaysia and/or financing of IPO shares\"\n },\n {\n \"value\": \"102\",\n \"text\": \"Purchase of securities quoted on the Bursa Malaysia and/or financing of IPO shares\"\n },\n {\n \"value\": \"COM01AF\",\n \"text\": \"PURCHASE OF COMMERCIAL VEHICLES\"\n },\n {\n \"value\": \"PRI01AF\",\n \"text\": \"PURCHASE OF PRIVATE VEHICLES\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"facilityType\",\n \"displayName\": \"Facility Type (Personal)\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"PLFT001\",\n \"text\": \"Conventional\"\n },\n {\n \"value\": \"PLFT002\",\n \"text\": \"Private Sector\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"facilityType\",\n \"displayName\": \"Facility Type (Auto)\",\n \"placeholder\": \"Facility Type\",\n \"startWithNewLine\": false,\n \"visible\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"HPFAC04\",\n \"text\": \" Islamic - Variable rate\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"financingTenure\",\n \"displayName\": \"Financing Tenure (Years)\",\n \"placeholder\": \"Financing Tenure (Years)\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 3,\n \"min\": 1,\n \"max\": 7,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid financing tenure from 1 to 7 years.\",\n \"regex\": \"^[1-7]$\"\n }\n ],\n \"inputType\": \"number\",\n \"category\": \"11\"\n },\n {\n \"name\": \"product\",\n \"displayName\": \"Product (Auto)\",\n \"placeholder\": \"Product\",\n \"startWithNewLine\": false,\n \"visible\": false,\n \"isRequired\": true,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"AFI04\",\n \"text\": \"Vehicle Financing-i (Variable Rate SBR)\"\n }\n ],\n \"maxLength\": 40,\n \"category\": \"11\"\n },\n {\n \"name\": \"purposeOfAcctOpen\",\n \"displayName\": \"Purpose of Account Opening\",\n \"type\": \"dropdown\",\n \"defaultValue\": \"Personal Loan/Financing\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Payroll/Salary\"\n },\n {\n \"value\": \"03\",\n \"text\": \"Savings/Fixed/Term Deposits\"\n },\n {\n \"value\": \"04\",\n \"text\": \"Remittance (Local/Foreign)\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Household/Family Expenses\"\n },\n {\n \"value\": \"06\",\n \"text\": \"Investment\"\n },\n {\n \"value\": \"08\",\n \"text\": \"Standing Instruction\"\n },\n {\n \"value\": \"11\",\n \"text\": \"EPF Withdrawals\"\n },\n {\n \"value\": \"12\",\n \"text\": \"Personal Loan/Financing\"\n },\n {\n \"value\": \"14\",\n \"text\": \"Equipment & Machinery Expenses\"\n },\n {\n \"value\": \"15\",\n \"text\": \"Business Operating Account\"\n },\n {\n \"value\": \"16\",\n \"text\": \"Client's Account\"\n },\n {\n \"value\": \"17\",\n \"text\": \"Sales Proceed\"\n },\n {\n \"value\": \"18\",\n \"text\": \"Capital Injection\"\n },\n {\n \"value\": \"19\",\n \"text\": \"Administration of Estate Account\"\n },\n {\n \"value\": \"20\",\n \"text\": \"Liquidation/Disposal of Asset\"\n },\n {\n \"value\": \"21\",\n \"text\": \"Financing Payment/Drawdown\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"sourceOfFund\",\n \"displayName\": \"Source of Fund\",\n \"placeholder\": \"Source of Fund\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"01\",\n \"text\": \"Income/Salary\"\n },\n {\n \"value\": \"02\",\n \"text\": \"Own Bank Transfer (within RHB)\"\n },\n {\n \"value\": \"04\",\n \"text\": \"EPF/SOCSO/Pension/Gratuity\"\n },\n {\n \"value\": \"05\",\n \"text\": \"Savings/Investment\"\n },\n {\n \"value\": \"08\",\n \"text\": \"Scholarship/Allowance/Edu Loan\"\n },\n {\n \"value\": \"13\",\n \"text\": \"Trust Funds\"\n },\n {\n \"value\": \"15\",\n \"text\": \"Divorce Sett/Compensation\"\n },\n {\n \"value\": \"17\",\n \"text\": \"Sale of Inves/Shares/Prop/Land\"\n },\n {\n \"value\": \"18\",\n \"text\": \"Dividends/Profits\"\n },\n {\n \"value\": \"20\",\n \"text\": \"Rental Proceeds\"\n },\n {\n \"value\": \"21\",\n \"text\": \"Commission\"\n },\n {\n \"value\": \"22\",\n \"text\": \"Directors Fee/Salary\"\n },\n {\n \"value\": \"23\",\n \"text\": \"Welfare Allowance\"\n },\n {\n \"value\": \"24\",\n \"text\": \"Return on Investment\"\n },\n {\n \"value\": \"25\",\n \"text\": \"FD Placement Roll Over/Renewal\"\n },\n {\n \"value\": \"26\",\n \"text\": \"Insurance Maturity/Surrender\"\n },\n {\n \"value\": \"27\",\n \"text\": \"Legal Settlement\"\n },\n {\n \"value\": \"28\",\n \"text\": \"Credit Facility Approve by FI\"\n },\n {\n \"value\": \"29\",\n \"text\": \"Trf frm Parent/Holding/Subs\"\n },\n {\n \"value\": \"30\",\n \"text\": \"Trf frm Own Acct with Oth FI\"\n },\n {\n \"value\": \"31\",\n \"text\": \"Spouse/Parents/Children\"\n },\n {\n \"value\": \"32\",\n \"text\": \"Financial Aid/Subsidies\"\n },\n {\n \"value\": \"33\",\n \"text\": \"Part-time Income\"\n },\n {\n \"value\": \"34\",\n \"text\": \"Inheritance\"\n },\n {\n \"value\": \"35\",\n \"text\": \"Gift/Donation\"\n },\n {\n \"value\": \"36\",\n \"text\": \"Winning-legal Gambling/Contest\"\n },\n {\n \"value\": \"37\",\n \"text\": \"Business/Sales Proceeds\"\n },\n {\n \"value\": \"38\",\n \"text\": \"Crypto Currency/Digital Asset Investment Proceeds\"\n }\n ],\n \"category\": \"4\"\n },\n {\n \"name\": \"preferredBranch\",\n \"displayName\": \"Preferred Branch\",\n \"placeholder\": \"Select Preferred Branch\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"000\",\n \"text\": \"Head Office (KL)\"\n },\n {\n \"value\": \"002\",\n \"text\": \"JALAN SILANG (WITH KUP)\"\n },\n {\n \"value\": \"003\",\n \"text\": \"Jalan Bukit Bintang (WITH BBI)\"\n },\n {\n \"value\": \"004\",\n \"text\": \"Jln Tun Sambanthan, Ipoh\"\n },\n {\n \"value\": \"005\",\n \"text\": \"Kampar\"\n },\n {\n \"value\": \"006\",\n \"text\": \"Johor Bahru City Square\"\n },\n {\n \"value\": \"007\",\n \"text\": \"Wisma Khoo, Sandakan\"\n },\n {\n \"value\": \"008\",\n \"text\": \"Putra Square, Kuantan\"\n },\n {\n \"value\": \"009\",\n \"text\": \"New Town, Petaling Jaya\"\n },\n {\n \"value\": \"010\",\n \"text\": \"Seri Kembangan\"\n },\n {\n \"value\": \"011\",\n \"text\": \"Kajang\"\n },\n {\n \"value\": \"012\",\n \"text\": \"Lebuh Pantai\"\n },\n {\n \"value\": \"013\",\n \"text\": \"Bentung\"\n },\n {\n \"value\": \"014\",\n \"text\": \"Batu Pahat\"\n },\n {\n \"value\": \"015\",\n \"text\": \"Kepong\"\n },\n {\n \"value\": \"016\",\n \"text\": \"Tanjung Sepat\"\n },\n {\n \"value\": \"017\",\n \"text\": \"Jln Tunku Ibrahim, Alor Setar\"\n },\n {\n \"value\": \"018\",\n \"text\": \"Jln Tok Hakim, Kota Bharu\"\n },\n {\n \"value\": \"019\",\n \"text\": \"Kuala Terengganu\"\n },\n {\n \"value\": \"020\",\n \"text\": \"Air Tawar\"\n },\n {\n \"value\": \"021\",\n \"text\": \"Kulai\"\n },\n {\n \"value\": \"022\",\n \"text\": \"Jln Gaya, Kota Kinabalu\"\n },\n {\n \"value\": \"024\",\n \"text\": \"Setapak\"\n },\n {\n \"value\": \"025\",\n \"text\": \"Jelapang\"\n },\n {\n \"value\": \"026\",\n \"text\": \"Jln Niaga, Shah Alam\"\n },\n {\n \"value\": \"027\",\n \"text\": \"Bukit Baru\"\n },\n {\n \"value\": \"028\",\n \"text\": \"Jln Chain Ferry, Prai\"\n },\n {\n \"value\": \"029\",\n \"text\": \"Yung Kong\"\n },\n {\n \"value\": \"030\",\n \"text\": \"Kenanga Wholesale City\"\n },\n {\n \"value\": \"031\",\n \"text\": \"Tmn Sg. Besi\"\n },\n {\n \"value\": \"032\",\n \"text\": \"Damansara Jaya\"\n },\n {\n \"value\": \"033\",\n \"text\": \"Kluang\"\n },\n {\n \"value\": \"034\",\n \"text\": \"Jerantut\"\n },\n {\n \"value\": \"035\",\n \"text\": \"Kuala Kurau\"\n },\n {\n \"value\": \"036\",\n \"text\": \"Raub\"\n },\n {\n \"value\": \"037\",\n \"text\": \"Port Klang\"\n },\n {\n \"value\": \"038\",\n \"text\": \"Jln Bakar Arang, Sg. Petani\"\n },\n {\n \"value\": \"039\",\n \"text\": \"Kemaman\"\n },\n {\n \"value\": \"040\",\n \"text\": \"Pasir Gudang\"\n },\n {\n \"value\": \"041\",\n \"text\": \"Bandar Baru Sg. Buloh\"\n },\n {\n \"value\": \"042\",\n \"text\": \"Jelutong\"\n },\n {\n \"value\": \"043\",\n \"text\": \"Tmn Suntex\"\n },\n {\n \"value\": \"044\",\n \"text\": \"Tmn Johor Jaya, Johor Bahru\"\n },\n {\n \"value\": \"045\",\n \"text\": \"JALAN TUN RAZAK (WITH PAS)\"\n },\n {\n \"value\": \"046\",\n \"text\": \"Jln Nakhoda Gampar, Miri\"\n },\n {\n \"value\": \"047\",\n \"text\": \"Tawau\"\n },\n {\n \"value\": \"048\",\n \"text\": \"Inanam\"\n },\n {\n \"value\": \"049\",\n \"text\": \"Tmn Pelangi, Johor Bahru\"\n },\n {\n \"value\": \"050\",\n \"text\": \"Tmn Ungku Tun Aminah\"\n },\n {\n \"value\": \"051\",\n \"text\": \"Jln Tunku Osman, Sibu\"\n },\n {\n \"value\": \"052\",\n \"text\": \"BUKIT MERTAJAM 1(WITH BMT)\"\n },\n {\n \"value\": \"053\",\n \"text\": \"Bandar Baru Uda, Tampoi\"\n },\n {\n \"value\": \"054\",\n \"text\": \"Rawang\"\n },\n {\n \"value\": \"055\",\n \"text\": \"Jln SS15 Subang Jaya\"\n },\n {\n \"value\": \"056\",\n \"text\": \"Mid Valley\"\n },\n {\n \"value\": \"057\",\n \"text\": \"Pandan Indah\"\n },\n {\n \"value\": \"058\",\n \"text\": \"Bayan Baru\"\n },\n {\n \"value\": \"059\",\n \"text\": \"Pasar Borong, Selayang\"\n },\n {\n \"value\": \"060\",\n \"text\": \"IOI Boulevard Puchong\"\n },\n {\n \"value\": \"061\",\n \"text\": \"KLCC\"\n },\n {\n \"value\": \"062\",\n \"text\": \"Bandar Baru Ampang\"\n },\n {\n \"value\": \"063\",\n \"text\": \"Tangkak\"\n },\n {\n \"value\": \"064\",\n \"text\": \"Mentakab\"\n },\n {\n \"value\": \"065\",\n \"text\": \"Bandar Baru Klang\"\n },\n {\n \"value\": \"066\",\n \"text\": \"Wisma Mahmud, Kuching\"\n },\n {\n \"value\": \"067\",\n \"text\": \"First Avenue\"\n },\n {\n \"value\": \"068\",\n \"text\": \"Kuala Lumpur Main\"\n },\n {\n \"value\": \"069\",\n \"text\": \"Kuala Kedah\"\n },\n {\n \"value\": \"070\",\n \"text\": \"Kulim\"\n },\n {\n \"value\": \"073\",\n \"text\": \"Lahad Datu\"\n },\n {\n \"value\": \"074\",\n \"text\": \"The Trillium, Lakefields\"\n },\n {\n \"value\": \"075\",\n \"text\": \"Mergong, Alor Setar\"\n },\n {\n \"value\": \"076\",\n \"text\": \"Ampang Point\"\n },\n {\n \"value\": \"077\",\n \"text\": \"Ayer Itam\"\n },\n {\n \"value\": \"078\",\n \"text\": \"Bangsar Shopping Centre\"\n },\n {\n \"value\": \"079\",\n \"text\": \"Bekok\"\n },\n {\n \"value\": \"080\",\n \"text\": \"Butterworth\"\n },\n {\n \"value\": \"081\",\n \"text\": \"Gopeng\"\n },\n {\n \"value\": \"082\",\n \"text\": \"Gunung Rapat, Ipoh\"\n },\n {\n \"value\": \"083\",\n \"text\": \"Ipoh Garden South\"\n },\n {\n \"value\": \"084\",\n \"text\": \"Jln Bukit Bintang\"\n },\n {\n \"value\": \"086\",\n \"text\": \"Jln Ipoh\"\n },\n {\n \"value\": \"087\",\n \"text\": \"Jln Pasar\"\n },\n {\n \"value\": \"088\",\n \"text\": \"JALAN RAJA LAUT(WITH JIP)\"\n },\n {\n \"value\": \"089\",\n \"text\": \"Jln Raja Uda, Butterworth\"\n },\n {\n \"value\": \"091\",\n \"text\": \"Jementah\"\n },\n {\n \"value\": \"092\",\n \"text\": \"Tmn Sentosa, Johor Bahru\"\n },\n {\n \"value\": \"093\",\n \"text\": \"Kangar\"\n },\n {\n \"value\": \"094\",\n \"text\": \"Ketereh\"\n },\n {\n \"value\": \"095\",\n \"text\": \"Persiaran Sultan Ibrahim, Kelang\"\n },\n {\n \"value\": \"096\",\n \"text\": \"Kluang 2 (WITH KLU)\"\n },\n {\n \"value\": \"098\",\n \"text\": \"Jln Tun HS Lee\"\n },\n {\n \"value\": \"101\",\n \"text\": \"Jln Burma\"\n },\n {\n \"value\": \"102\",\n \"text\": \"Jln Hang Tuah\"\n },\n {\n \"value\": \"103\",\n \"text\": \"Plaza OSK, Jln Ampang\"\n },\n {\n \"value\": \"104\",\n \"text\": \"Meru\"\n },\n {\n \"value\": \"106\",\n \"text\": \"Permas Jaya, Johor Bahru\"\n },\n {\n \"value\": \"107\",\n \"text\": \"RHB SOHO IPOH\"\n },\n {\n \"value\": \"110\",\n \"text\": \"Rantau\"\n },\n {\n \"value\": \"111\",\n \"text\": \"Bandar Sri Permaisuri\"\n },\n {\n \"value\": \"112\",\n \"text\": \"Section 14, Petaling Jaya\"\n },\n {\n \"value\": \"113\",\n \"text\": \"Segamat\"\n },\n {\n \"value\": \"115\",\n \"text\": \"Senai\"\n },\n {\n \"value\": \"116\",\n \"text\": \"Seremban\"\n },\n {\n \"value\": \"118\",\n \"text\": \"Jln Tengku Ampuan Zabedah, Shah Alam\"\n },\n {\n \"value\": \"121\",\n \"text\": \"Bandar Sri Damansara\"\n },\n {\n \"value\": \"123\",\n \"text\": \"Sg. Bakap\"\n },\n {\n \"value\": \"124\",\n \"text\": \"Kg. Baru Sg. Buloh\"\n },\n {\n \"value\": \"125\",\n \"text\": \"Sg. Pelek\"\n },\n {\n \"value\": \"126\",\n \"text\": \"Tmn Pekan Baru, Sg. Petani\"\n },\n {\n \"value\": \"128\",\n \"text\": \"Sungkai\"\n },\n {\n \"value\": \"130\",\n \"text\": \"Tmn Indah\"\n },\n {\n \"value\": \"131\",\n \"text\": \"Tmn Megah\"\n },\n {\n \"value\": \"132\",\n \"text\": \"Tmn Molek, Johor Bahru\"\n },\n {\n \"value\": \"133\",\n \"text\": \"Dataran Wangsa\"\n },\n {\n \"value\": \"134\",\n \"text\": \"Tmn Shamelin\"\n },\n {\n \"value\": \"136\",\n \"text\": \"Tmn Taming Jaya\"\n },\n {\n \"value\": \"139\",\n \"text\": \"UEP Subang Jaya\"\n },\n {\n \"value\": \"140\",\n \"text\": \"Ulu Tiram\"\n },\n {\n \"value\": \"142\",\n \"text\": \"Bandar Baru Nilai\"\n },\n {\n \"value\": \"144\",\n \"text\": \"Menglembu\"\n },\n {\n \"value\": \"145\",\n \"text\": \"Bayan Point\"\n },\n {\n \"value\": \"150\",\n \"text\": \"Jln Masjid, Bintulu\"\n },\n {\n \"value\": \"153\",\n \"text\": \"Damansara Utama\"\n },\n {\n \"value\": \"158\",\n \"text\": \"Plentong, Johor Bahru\"\n },\n {\n \"value\": \"161\",\n \"text\": \"Bagan Serai\"\n },\n {\n \"value\": \"163\",\n \"text\": \"Bahau\"\n },\n {\n \"value\": \"165\",\n \"text\": \"Bukit Mertajam\"\n },\n {\n \"value\": \"169\",\n \"text\": \"Simpang Empat, Hutan Melintang\"\n },\n {\n \"value\": \"176\",\n \"text\": \"Jenjarom\"\n },\n {\n \"value\": \"177\",\n \"text\": \"Jinjang Utara\"\n },\n {\n \"value\": \"182\",\n \"text\": \"Kerteh\"\n },\n {\n \"value\": \"183\",\n \"text\": \"Jln Stesen, Kelang\"\n },\n {\n \"value\": \"187\",\n \"text\": \"Kuala Dungun\"\n },\n {\n \"value\": \"188\",\n \"text\": \"Kuala Kangsar\"\n },\n {\n \"value\": \"190\",\n \"text\": \"Kuala Pilah\"\n },\n {\n \"value\": \"195\",\n \"text\": \"Jln Tun Mustapha\"\n },\n {\n \"value\": \"196\",\n \"text\": \"Pulau Langkawi\"\n },\n {\n \"value\": \"198\",\n \"text\": \"LEBUH PANTAI 3 (WITH PNG)\"\n },\n {\n \"value\": \"202\",\n \"text\": \"Jln Abdullah, Muar\"\n },\n {\n \"value\": \"203\",\n \"text\": \"Overseas Union Garden\"\n },\n {\n \"value\": \"204\",\n \"text\": \"Padang Serai\"\n },\n {\n \"value\": \"205\",\n \"text\": \"Parit Buntar\"\n },\n {\n \"value\": \"207\",\n \"text\": \"Pasir Mas\"\n },\n {\n \"value\": \"208\",\n \"text\": \"Pontian Kecil\"\n },\n {\n \"value\": \"213\",\n \"text\": \"Segambut\"\n },\n {\n \"value\": \"216\",\n \"text\": \"SETAPAK 3 (WITH STP)\"\n },\n {\n \"value\": \"218\",\n \"text\": \"Simpang Renggam\"\n },\n {\n \"value\": \"219\",\n \"text\": \"Sitiawan\"\n },\n {\n \"value\": \"223\",\n \"text\": \"Sg. Siput\"\n },\n {\n \"value\": \"224\",\n \"text\": \"SS2 Petaling Jaya\"\n },\n {\n \"value\": \"225\",\n \"text\": \"Taiping\"\n },\n {\n \"value\": \"228\",\n \"text\": \"Tmn Midah\"\n },\n {\n \"value\": \"231\",\n \"text\": \"Tmn Tun Dr Ismail\"\n },\n {\n \"value\": \"232\",\n \"text\": \"Tanjong Karang\"\n },\n {\n \"value\": \"233\",\n \"text\": \"Tasek, Ipoh\"\n },\n {\n \"value\": \"235\",\n \"text\": \"Teluk Intan\"\n },\n {\n \"value\": \"237\",\n \"text\": \"Yong Peng\"\n },\n {\n \"value\": \"239\",\n \"text\": \"Plaza Damas 3\"\n },\n {\n \"value\": \"240\",\n \"text\": \"Putrajaya\"\n },\n {\n \"value\": \"242\",\n \"text\": \"Lawas\"\n },\n {\n \"value\": \"252\",\n \"text\": \"Melaka Raya\"\n },\n {\n \"value\": \"260\",\n \"text\": \"Prima Square, Sandakan\"\n },\n {\n \"value\": \"261\",\n \"text\": \"Jln Kulas, Kuching\"\n },\n {\n \"value\": \"264\",\n \"text\": \"Simpang Tiga, Kuching\"\n },\n {\n \"value\": \"266\",\n \"text\": \"Boulevard Centre, Miri\"\n },\n {\n \"value\": \"268\",\n \"text\": \"Lundu\"\n },\n {\n \"value\": \"269\",\n \"text\": \"Kanowit\"\n },\n {\n \"value\": \"271\",\n \"text\": \"Dalat\"\n },\n {\n \"value\": \"272\",\n \"text\": \"Kota Samarahan, Kuching\"\n },\n {\n \"value\": \"273\",\n \"text\": \"Sarikei\"\n },\n {\n \"value\": \"275\",\n \"text\": \"Tabuan Jaya, Kuching\"\n },\n {\n \"value\": \"276\",\n \"text\": \"Siburan\"\n },\n {\n \"value\": \"278\",\n \"text\": \"Matang Jaya, Kuching\"\n },\n {\n \"value\": \"280\",\n \"text\": \"Batu Kawah, Kuching\"\n },\n {\n \"value\": \"281\",\n \"text\": \"Lintas Station Complex, Kota Kinabalu\"\n },\n {\n \"value\": \"282\",\n \"text\": \"Limbang\"\n },\n {\n \"value\": \"286\",\n \"text\": \"Taipan Senawang\"\n },\n {\n \"value\": \"288\",\n \"text\": \"Kota Damansara\"\n },\n {\n \"value\": \"289\",\n \"text\": \"The Vertical, Bangsar South\"\n },\n {\n \"value\": \"290\",\n \"text\": \"Tmn Mount Austin, Johor Bahru\"\n },\n {\n \"value\": \"291\",\n \"text\": \"Menara Shell\"\n },\n {\n \"value\": \"293\",\n \"text\": \"Paradigm Mall, Kelana Jaya\"\n },\n {\n \"value\": \"294\",\n \"text\": \"Utropolis Mall, Glenmarie\"\n },\n {\n \"value\": \"295\",\n \"text\": \"Bandar Bukit Tinggi\"\n },\n {\n \"value\": \"296\",\n \"text\": \"Jitra\"\n },\n {\n \"value\": \"297\",\n \"text\": \"Air Putih, Kuantan\"\n },\n {\n \"value\": \"298\",\n \"text\": \"Sg. Merah, Sibu\"\n },\n {\n \"value\": \"299\",\n \"text\": \"Tmn Nusa Bestari, Johor Bahru\"\n },\n {\n \"value\": \"300\",\n \"text\": \"Keningau\"\n },\n {\n \"value\": \"301\",\n \"text\": \"1 Lagenda\"\n },\n {\n \"value\": \"302\",\n \"text\": \"Triang\"\n },\n {\n \"value\": \"303\",\n \"text\": \"Tmn Connaught\"\n },\n {\n \"value\": \"304\",\n \"text\": \"MetroTown, Kota Kinabalu\"\n },\n {\n \"value\": \"305\",\n \"text\": \"Kota Kemuning\"\n },\n {\n \"value\": \"306\",\n \"text\": \"Kota Tinggi\"\n },\n {\n \"value\": \"307\",\n \"text\": \"Setia Alam\"\n },\n {\n \"value\": \"308\",\n \"text\": \"Alam Avenue\"\n },\n {\n \"value\": \"309\",\n \"text\": \"Malim\"\n },\n {\n \"value\": \"310\",\n \"text\": \"Mukah\"\n },\n {\n \"value\": \"312\",\n \"text\": \"Bandar Mahkota Cheras\"\n },\n {\n \"value\": \"313\",\n \"text\": \"Seremban 2\"\n },\n {\n \"value\": \"314\",\n \"text\": \"Banting\"\n },\n {\n \"value\": \"315\",\n \"text\": \"IOI Resort City\"\n },\n {\n \"value\": \"316\",\n \"text\": \"Bandar Sri Petaling\"\n },\n {\n \"value\": \"317\",\n \"text\": \"Tanjung Tokong\"\n },\n {\n \"value\": \"319\",\n \"text\": \"Bandar Penawar\"\n },\n {\n \"value\": \"320\",\n \"text\": \"Kelana Jaya\"\n },\n {\n \"value\": \"321\",\n \"text\": \"RHB Bank Jalan Raja Laut, Kuala Lumpur\"\n },\n {\n \"value\": \"322\",\n \"text\": \"Auto City, Juru\"\n },\n {\n \"value\": \"323\",\n \"text\": \"Tmn Setia Tropika, Johor Bahru\"\n },\n {\n \"value\": \"389\",\n \"text\": \"Tmn Flora Utama, Batu Pahat\"\n },\n {\n \"value\": \"399\",\n \"text\": \"Caw. Utama\"\n },\n {\n \"value\": \"400\",\n \"text\": \"Caw. Jln Satok, Kuching\"\n },\n {\n \"value\": \"401\",\n \"text\": \"Caw. Kelana Jaya\"\n },\n {\n \"value\": \"402\",\n \"text\": \"Caw. Tmn Flora Utama, Batu Pahat\"\n },\n {\n \"value\": \"403\",\n \"text\": \"Caw. Kubang Kerian, Kota Bharu\"\n },\n {\n \"value\": \"404\",\n \"text\": \"Caw. Tmn Setia Tropika, Johor Bahru\"\n },\n {\n \"value\": \"405\",\n \"text\": \"Caw. Bandar Baru Bangi\"\n },\n {\n \"value\": \"407\",\n \"text\": \"Caw. Kuala Terengganu\"\n },\n {\n \"value\": \"408\",\n \"text\": \"Caw. Jln Raja Laut\"\n },\n {\n \"value\": \"409\",\n \"text\": \"Caw. Auto City\"\n },\n {\n \"value\": \"411\",\n \"text\": \"Caw. Lagenda Heights, Sg. Petani\"\n },\n {\n \"value\": \"412\",\n \"text\": \"Caw. Laman Seri, Shah Alam\"\n },\n {\n \"value\": \"457\",\n \"text\": \"RHB Bank Sales Centre AEON Taman Equine\"\n },\n {\n \"value\": \"473\",\n \"text\": \"RHB EASY - Kompleks Teruntum\"\n },\n {\n \"value\": \"479\",\n \"text\": \"RHB EASY - Giant Plentong\"\n },\n {\n \"value\": \"491\",\n \"text\": \"RHB EASY - Mydin Mall MITC Melaka\"\n },\n {\n \"value\": \"630\",\n \"text\": \"RHB EASY - Mydin Kubang Kerian\"\n },\n {\n \"value\": \"637\",\n \"text\": \"RHB EASY - Mydin Meru Raya\"\n },\n {\n \"value\": \"710\",\n \"text\": \"RHB EASY - E-Mart Commercial Centre\"\n },\n {\n \"value\": \"712\",\n \"text\": \"RHB EASY - Giant Hypermarket Bayan Baru\"\n },\n {\n \"value\": \"861\",\n \"text\": \"RHB EASY Warisan Square\"\n },\n {\n \"value\": \"931\",\n \"text\": \"CC EMBOSSING\"\n },\n {\n \"value\": \"RD08\",\n \"text\": \"PERAK REGION\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"bdmMoreThan2500kg\",\n \"displayName\": \"BDM More Than 2500kg\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"name\": \"chassisNo\",\n \"displayName\": \"Chassis Number\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"name\": \"engineNo\",\n \"displayName\": \"Engine Number\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"name\": \"marketValue\",\n \"displayName\": \"Market Value\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"12\"\n },\n {\n \"name\": \"modelOfVehicle\",\n \"displayName\": \"Model of Vehicle\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"type\": \"text\",\n \"name\": \"purchasePriceOTR\",\n \"title\": \"carPrice\",\n \"placeholder\": \"car Price (MYR)\",\n \"isRequired\": true,\n \"displayName\": \"Car Price (MYR)\",\n \"maxLength\": 23,\n \"min\": 2000,\n \"max\": 150000,\n \"inputType\": \"number\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a financing amount between 2,000 and 150,000.\",\n \"regex\": \"^(2000|[1-9][0-9]{3}|[1-9][0-9]{4}|150000)$\"\n },\n {\n \"type\": \"regex\",\n \"text\": \"Please enter an amount in increments of 1,000.\",\n \"regex\": \"^([1-9][0-9]*000|150000)$\"\n }\n ],\n \"category\": \"12\"\n },\n {\n \"name\": \"registrationDate\",\n \"displayName\": \"Registration Date\",\n \"type\": \"text\",\n \"inputType\": \"date\",\n \"category\": \"12\"\n },\n {\n \"name\": \"registrationNo\",\n \"displayName\": \"Registration Number\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"name\": \"vehicleCondition\",\n \"displayName\": \"Condition\",\n \"placeholder\": \"Vehicle Condition\",\n \"startWithNewLine\": false,\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"N\",\n \"text\": \"New\"\n },\n {\n \"value\": \"U\",\n \"text\": \"Used\"\n },\n {\n \"value\": \"UN\",\n \"text\": \"UnRegistered Recon\"\n },\n {\n \"value\": \"UR\",\n \"text\": \"Used Recon\"\n },\n {\n \"value\": \"PR\",\n \"text\": \"Pre-registered\"\n }\n ],\n \"category\": \"12\"\n },\n {\n \"name\": \"yearMake\",\n \"displayName\": \"Year Make\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"startWithNewLine\": false,\n \"placeholder\": \"Year\",\n \"min\": 2014,\n \"max\": 2100,\n \"category\": \"12\"\n },\n {\n \"name\": \"makeOfVehicle\",\n \"displayName\": \"Make of Vehicle\",\n \"type\": \"text\",\n \"category\": \"12\"\n },\n {\n \"name\": \"permanentaddressLine1\",\n \"displayName\": \"Permanent Address Line 1\",\n \"placeholder\": \"Permanent Address Line 1\",\n \"maxLength\": 40,\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"permanentaddressLine2\",\n \"displayName\": \"Permanent Address Line 2\",\n \"placeholder\": \"Permanent Address Line 2 (optional)\",\n \"isRequired\": false,\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"7\"\n },\n {\n \"name\": \"permanentaddressLine3\",\n \"displayName\": \"Permanent Address Line 3\",\n \"maxLength\": 40,\n \"placeholder\": \"Permanent Address Line 3 (optional)\",\n \"isRequired\": false,\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"permanentaddressType\",\n \"displayName\": \"Permanent Address Type\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"permanentcity\",\n \"displayName\": \"Permanent City\",\n \"placeholder\": \"City of the Permanent Address\",\n \"type\": \"text\",\n \"maxLength\": 20,\n \"startWithNewLine\": false,\n \"category\": \"7\"\n },\n {\n \"name\": \"permanentpostcode\",\n \"displayName\": \"Permanent Postcode\",\n \"placeholder\": \"Postcode of the Permanent Address\",\n \"type\": \"text\",\n \"maxLength\": 10,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialaddressLine1\",\n \"displayName\": \"Residential Address Line 1\",\n \"placeholder\": \"Residential Address Line 1\",\n \"visibleIf\": \"{residenceAddress} == false\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialaddressLine2\",\n \"displayName\": \"Residential Address Line 2\",\n \"placeholder\": \"Residential Address Line 2 (optional)\",\n \"isRequired\": false,\n \"visibleIf\": \"{residenceAddress} == false\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialaddressLine3\",\n \"displayName\": \"Residential Address Line 3\",\n \"placeholder\": \"Residential Address Line 3 (optional)\",\n \"isRequired\": false,\n \"startWithNewLine\": false,\n \"visibleIf\": \"{residenceAddress} == false\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialaddressType\",\n \"displayName\": \"Residential Address Type\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialcity\",\n \"displayName\": \"Residential City\",\n \"placeholder\": \"City of the Residential Address\",\n \"visibleIf\": \"{residenceAddress} == false\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 20,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialpostcode\",\n \"displayName\": \"Residential Postcode\",\n \"placeholder\": \"Postcode of the Residential Address\",\n \"visibleIf\": \"{residenceAddress} == false\",\n \"type\": \"text\",\n \"maxLength\": 10,\n \"category\": \"7\"\n },\n {\n \"name\": \"residentialstate\",\n \"displayName\": \"Residential State\",\n \"placeholder\": \"Select State Of The Residential Address\",\n \"startWithNewLine\": false,\n \"visibleIf\": \"{residenceAddress} == false\",\n \"type\": \"dropdown\",\n \"choices\": [\n {\n \"value\": \"A\",\n \"text\": \"PERAK\"\n },\n {\n \"value\": \"B\",\n \"text\": \"SELANGOR\"\n },\n {\n \"value\": \"C\",\n \"text\": \"PAHANG\"\n },\n {\n \"value\": \"D\",\n \"text\": \"KELANTAN\"\n },\n {\n \"value\": \"J\",\n \"text\": \"JOHOR\"\n },\n {\n \"value\": \"K\",\n \"text\": \"KEDAH\"\n },\n {\n \"value\": \"L\",\n \"text\": \"WP LABUAN\"\n },\n {\n \"value\": \"M\",\n \"text\": \"MELAKA\"\n },\n {\n \"value\": \"N\",\n \"text\": \"NEGERI SEMBILAN\"\n },\n {\n \"value\": \"P\",\n \"text\": \"PULAU PINANG\"\n },\n {\n \"value\": \"Q\",\n \"text\": \"SARAWAK\"\n },\n {\n \"value\": \"R\",\n \"text\": \"PERLIS\"\n },\n {\n \"value\": \"S\",\n \"text\": \"SABAH\"\n },\n {\n \"value\": \"T\",\n \"text\": \"TERENGGANU\"\n },\n {\n \"value\": \"U\",\n \"text\": \"WP PUTRAJAYA\"\n },\n {\n \"value\": \"W\",\n \"text\": \"WP KUALA LUMPUR\"\n }\n ],\n \"category\": \"7\"\n },\n {\n \"name\": \"officeaddressLine1\",\n \"displayName\": \"Employer Address Line 1\",\n \"placeholder\": \"Employer Address Line 1\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"category\": \"5\"\n },\n {\n \"name\": \"officeaddressLine2\",\n \"displayName\": \"Employer Address Line 2\",\n \"placeholder\": \"Employer Address Line 2 (optional)\",\n \"isRequired\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"5\"\n },\n {\n \"name\": \"officeaddressLine3\",\n \"displayName\": \"Employer Address Line 3\",\n \"placeholder\": \"Employer Address Line 3 (optional)\",\n \"startWithNewLine\": false,\n \"isRequired\": false,\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"text\",\n \"maxLength\": 40,\n \"category\": \"5\"\n },\n {\n \"name\": \"officeaddressType\",\n \"displayName\": \"Office Address Type\",\n \"type\": \"text\",\n \"category\": \"7\"\n },\n {\n \"name\": \"officecity\",\n \"displayName\": \"Employer City\",\n \"placeholder\": \"Employer City\",\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 20,\n \"category\": \"5\"\n },\n {\n \"name\": \"officepostcode\",\n \"displayName\": \"Employer Postcode\",\n \"placeholder\": \"Employer Postcode\",\n \"visibleIf\": \"{employmentType} anyof ['01', '02', '07', '08', '09', '10' ]\",\n \"type\": \"text\",\n \"maxLength\": 10,\n \"inputType\": \"number\",\n \"category\": \"5\"\n },\n {\n \"name\": \"computationMode\",\n \"displayName\": \"Computation Mode\",\n \"type\": \"text\",\n \"category\": \"10\"\n },\n {\n \"name\": \"countryOfPermanentResident\",\n \"displayName\": \"Country of Permanent Resident\",\n \"type\": \"text\",\n \"category\": \"2\"\n },\n {\n \"name\": \"foreignPR\",\n \"displayName\": \"Foreign PR\",\n \"type\": \"text\",\n \"category\": \"2\"\n },\n {\n \"name\": \"internationalExtensionPhoneNo\",\n \"displayName\": \"International Extension Phone No\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"8\"\n },\n {\n \"name\": \"internationalPhoneNo\",\n \"displayName\": \"International Phone No\",\n \"type\": \"text\",\n \"inputType\": \"tel\",\n \"category\": \"8\"\n },\n {\n \"name\": \"internationalPhoneNoAreaCode\",\n \"displayName\": \"International Phone No Area Code\",\n \"type\": \"text\",\n \"inputType\": \"tel\",\n \"category\": \"8\"\n },\n {\n \"name\": \"pRIDNo\",\n \"displayName\": \"PR ID No\",\n \"type\": \"text\",\n \"category\": \"2\"\n },\n {\n \"name\": \"dealerName\",\n \"displayName\": \"Dealer Name\",\n \"type\": \"text\",\n \"category\": \"3\"\n },\n {\n \"name\": \"cashDownpayment\",\n \"displayName\": \"Cash Downpayment\",\n \"placeholder\": \"Cash Downpayment\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"maxLength\": 20,\n \"category\": \"11\"\n },\n {\n \"name\": \"downpayment\",\n \"displayName\": \"Down Payment (%)\",\n \"placeholder\": \"Down Payment (%)\",\n \"type\": \"text\",\n \"category\": \"11\"\n },\n {\n \"name\": \"bankName\",\n \"displayName\": \"Bank Name\",\n \"placeholder\": \"Bank Name\",\n \"visible\": false,\n \"type\": \"text\",\n \"startWithNewLine\": false,\n \"category\": \"11\"\n },\n {\n \"name\": \"bankRates\",\n \"displayName\": \"Bank Rate\",\n \"placeholder\": \"Bank Rate\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"startWithNewLine\": false,\n \"category\": \"11\"\n },\n {\n \"name\": \"monthlyRepayment\",\n \"displayName\": \"Monthly Repayment\",\n \"placeholder\": \"Monthly Repayment\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"11\"\n },\n {\n \"name\": \"facilityTenureYears\",\n \"displayName\": \"Repayment Term (Years)\",\n \"placeholder\": \"Payment Term\",\n \"startWithNewLine\": false,\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid financing tenure from 1 to 7 years.\",\n \"regex\": \"^[1-7]$\"\n }\n ],\n \"category\": \"11\"\n },\n {\n \"name\": \"totalFinancing\",\n \"displayName\": \"Financing Amount (RM)\",\n \"placeholder\": \"How much do you want to borrow?\",\n \"type\": \"text\",\n \"maxLength\": 15,\n \"min\": 2000,\n \"max\": 150000,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a financing amount between 2,000 and 150,000.\",\n \"regex\": \"^(2000|[1-9][0-9]{3}|[1-9][0-9]{4}|150000)$\"\n },\n {\n \"type\": \"regex\",\n \"text\": \"Please enter an amount in increments of 1,000.\",\n \"regex\": \"^([1-9][0-9]*000|150000)$\"\n }\n ],\n \"inputType\": \"number\",\n \"category\": \"11\"\n },\n {\n \"name\": \"myKadOrPassport\",\n \"displayName\": \"MyKad or Passport\",\n \"type\": \"text\",\n \"category\": \"2\"\n },\n {\n \"name\": \"incomeEPF_iakaun\",\n \"displayName\": \"Income EPF i-Akaun\",\n \"type\": \"text\",\n \"category\": \"11\"\n },\n {\n \"name\": \"phoneNumber\",\n \"displayName\": \"Phone Number\",\n \"type\": \"text\",\n \"inputType\": \"tel\",\n \"category\": \"1\"\n },\n {\n \"name\": \"incorporatedDate\",\n \"displayName\": \"Incorporated Date\",\n \"type\": \"text\",\n \"inputType\": \"date\",\n \"category\": \"3\"\n },\n {\n \"name\": \"shareCapital\",\n \"displayName\": \"Share Capital\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"tangibleAssets\",\n \"displayName\": \"Tangible Assets\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"totalCurrentLiabilities\",\n \"displayName\": \"Total Current Liabilities\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"totalCurrentAssets\",\n \"displayName\": \"Total Current Assets\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"endOfYearCash\",\n \"displayName\": \"Cash and Cash Equivalent at end of the Financial Year or Period\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"shortTermLiabilities\",\n \"displayName\": \"Short Term Liabilities\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"ebitda\",\n \"displayName\": \"Earning Before Interest, Tax, Depreciation and Amortization (EBITDA)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"totalAssets\",\n \"displayName\": \"Total Assets\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"netOperatingCashFlow\",\n \"displayName\": \"Net Operating Cash Flow\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"netProfitT1\",\n \"displayName\": \"Net Profit/ Loss and Total Comprehensive Income (year T-1)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"totalEquityT1\",\n \"displayName\": \"Total Equity/Owner equity/Total Net (year T-1)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"netProfitT2\",\n \"displayName\": \"Net Profit/ Loss and Total Comprehensive Income (year T-2)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"totalEquityT2\",\n \"displayName\": \"Total Equity/Owner equity/Total Net (year T-2)\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"facilityInterestRate\",\n \"displayName\": \"Interest Rate\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"eppProduct\",\n \"displayName\": \"EPP Product Name\",\n \"type\": \"text\",\n \"category\": \"4\"\n },\n {\n \"name\": \"eppPrice\",\n \"displayName\": \"EPP Price\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"eppNoOfPax\",\n \"displayName\": \"EPP No. of Pax\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"housingLoanMonthlyInstallment\",\n \"displayName\": \"Housing Loan Monthly Installment\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"hirePurchaseMonthlyInstallment\",\n \"displayName\": \"Hire Purchase Monthly Installment\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"personalLoanMonthlyInstallment\",\n \"displayName\": \"Personal Loan Monthly Installment\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"creditCardMonthlyInstallment\",\n \"displayName\": \"Credit Card Monthly Installment\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"otherFinancingMonthlyInstallment\",\n \"displayName\": \"Other Financing Monthly Installment\",\n \"type\": \"text\",\n \"inputType\": \"number\",\n \"category\": \"4\"\n },\n {\n \"name\": \"bank_statement_t1\",\n \"displayName\": \"Bank Statement (Month T-1)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT1\",\n \"statementDateT1\",\n \"bankNameT1\",\n \"accountNumberT1\",\n \"totalCreditsT1\",\n \"totalDebitsT1\",\n \"openingBalanceT1\",\n \"bankBalanceT1\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 1,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"bank_statement_t2\",\n \"displayName\": \"Bank Statement (Month T-2)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT2\",\n \"statementDateT2\",\n \"bankNameT2\",\n \"accountNumberT2\",\n \"totalCreditsT2\",\n \"totalDebitsT2\",\n \"openingBalanceT2\",\n \"bankBalanceT2\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 2,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"bank_statement_t3\",\n \"displayName\": \"Bank Statement (Month T-3)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT3\",\n \"statementDateT3\",\n \"bankNameT3\",\n \"accountNumberT3\",\n \"totalCreditsT3\",\n \"totalDebitsT3\",\n \"openingBalanceT3\",\n \"bankBalanceT3\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 3,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"bank_statement_t4\",\n \"displayName\": \"Bank Statement (Month T-4)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT4\",\n \"statementDateT4\",\n \"bankNameT4\",\n \"accountNumberT4\",\n \"totalCreditsT4\",\n \"totalDebitsT4\",\n \"openingBalanceT4\",\n \"bankBalanceT4\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 4,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"bank_statement_t5\",\n \"displayName\": \"Bank Statement (Month T-5)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT5\",\n \"statementDateT5\",\n \"bankNameT5\",\n \"accountNumberT5\",\n \"totalCreditsT5\",\n \"totalDebitsT5\",\n \"openingBalanceT5\",\n \"bankBalanceT5\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 5,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"bank_statement_t6\",\n \"displayName\": \"Bank Statement (Month T-6)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"accountHolderNameT6\",\n \"statementDateT6\",\n \"bankNameT6\",\n \"accountNumberT6\",\n \"totalCreditsT6\",\n \"totalDebitsT6\",\n \"openingBalanceT6\",\n \"bankBalanceT6\"\n ],\n \"category\": \"13\",\n \"document_type\": \"bankStatements\",\n \"document_group\": \"bank_statements\",\n \"document_group_label\": \"Bank Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 6,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"financials\",\n \"displayName\": \"Audited Financial Statement\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"shareCapital\",\n \"totalEquityT1\",\n \"totalEquityT2\",\n \"totalCurrentLiabilities\",\n \"shortTermLiabilities\",\n \"totalAssets\",\n \"totalCurrentAssets\",\n \"tangibleAssets\",\n \"netProfitT1\",\n \"netProfitT2\",\n \"endOfYearCash\",\n \"netOperatingCashFlow\",\n \"ebitda\"\n ],\n \"category\": \"13\",\n \"document_type\": \"financialStatements\",\n \"document_group\": \"financials\",\n \"document_group_label\": \"Audited Financial Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 1,\n \"time_period_unit\": \"year\"\n },\n {\n \"name\": \"financials_fincap_t1\",\n \"displayName\": \"Audited Financial Statement (T-1) (FinCap)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"nonCurrentAssetsSubsidiaryCompaniesT1\",\n \"nonCurrentAssetsAssociatedCompaniesT1\",\n \"nonCurrentAssetsDevelopmentPropertiesOrExpenditureT1\",\n \"nonCurrentAssetInvestmentPropertiesT1\",\n \"nonCurrentAssetsInvestmentsT1\",\n \"nonCurrentAssetInvestmentSecuritiesT1\",\n \"nonCurrentAssetDeferredAssetsT1\",\n \"nonCurrentAssetDepositsT1\",\n \"nonCurrentAssetOwnGoodwillT1\",\n \"nonCurrentAssetGoodwillOnConsolidationT1\",\n \"nonCurrentAssetSinkingFundT1\",\n \"nonCurrentAssetPropertyPlantEquipmentT1\",\n \"nonCurrentAssetInventoriesT1\",\n \"nonCurrentAssetRightOfUseAssetsT1\",\n \"nonCurrentAssetIntangibleAssetsT1\",\n \"nonCurrentAssetPrepaidLeasePaymentsT1\",\n \"nonCurrentAssetFinancialAssetAtFairValueT1\",\n \"nonCurrentAssetLandUseRightT1\",\n \"nonCurrentAssetTradeReceivablesT1\",\n \"nonCurrentAssetOtherReceivablesT1\",\n \"nonCurrentAssetTradeAndOtherReceivablesT1\",\n \"nonCurrentAssetOtherReceivablesDepositsAndPrepaymentsT1\",\n \"totalNonCurrentAssetsT1\",\n \"currentAssetDevelopmentPropertiesOrExpenditureT1\",\n \"currentAssetShortTermInvestmentsT1\",\n \"currentAssetTradeDebtorsT1\",\n \"currentAssetShortTermDepositsT1\",\n \"currentAssetAmountDueFromHoldingCompanyT1\",\n \"currentAssetAmountDueFromSubsidiaryCompaniesT1\",\n \"currentAssetAmountDueFromAssociatedCompaniesT1\",\n \"currentAssetAmountDueFromDirectorT1\",\n \"currentAssetAmountDueFromCustomerT1\",\n \"currentAssetAmountOwingByShareholdersT1\",\n \"currentAssetInventoriesT1\",\n \"currentAssetFinancialAssetAtFairValueT1\",\n \"currentAssetLandUseRightT1\",\n \"currentAssetTaxRecoverableT1\",\n \"currentAssetContractAssetsT1\",\n \"currentAssetCurrentTaxAssetsT1\",\n \"currentAssetPrepaymentsT1\",\n \"currentAssetDerivativeT1\",\n \"currentAssetCashAndBankBalancesT1\",\n \"currentAssetOtherReceivablesT1\",\n \"currentAssetRestrictedCashT1\",\n \"currentAssetCashAndCashEquivalentsT1\",\n \"currentAssetDepositsCashAndBankBalancesT1\",\n \"currentAssetCashAtBanksT1\",\n \"currentAssetCashOnHandT1\",\n \"currentAssetDepositsAndPrepaymentsT1\",\n \"currentAssetTradeAndOtherReceivablesT1\",\n \"currentAssetOtherReceivablesDepositsAndPrepaymentsT1\",\n \"currentAssetOtherReceivablesAndDepositsT1\",\n \"currentAssetOtherReceivablesAndPrepaymentsT1\",\n \"currentAssetCashT1\",\n \"totalCurrentAssetsT1\",\n \"totalAssetsT1\",\n \"currentLiabilitiesTradeCreditorsT1\",\n \"currentLiabilitiesHirePurchasePayablesT1\",\n \"currentLiabilitiesBankOverdraftT1\",\n \"currentLiabilitiesBankAcceptanceT1\",\n \"currentLiabilitiesBorrowingsOrTermLoansT1\",\n \"currentLiabilitiesBankborrowingsT1\",\n \"currentLiabilitiesAmountsOwingToHoldingCompanyT1\",\n \"currentLiabilitiesAmountsOwingToSubsidiaryCompaniesT1\",\n \"currentLiabilitiesAmountOwingToAssociatedCompaniesT1\",\n \"currentLiabilitiesAmountsOwingToDirectorT1\",\n \"currentLiabilitiesProvisionForTaxationT1\",\n \"currentLiabilitiesLeasePayablesT1\",\n \"currentLiabilitiesFinanceLeasePayablesT1\",\n \"currentLiabilitiesOtherPayablesT1\",\n \"currentLiabilitiesDividendPayablesT1\",\n \"currentLiabilitiesTradeAndOtherPayablesT1\",\n \"currentLiabilitiesDepositsFromCustomersT1\",\n \"currentLiabilitiesOtherPayablesAccrualsAndDepositsT1\",\n \"currentLiabilitiesOtherPayablesAndAccrualsT1\",\n \"currentLiabilitiesContractLiabilitiesT1\",\n \"currentLiabilitiesDerivativeT1\",\n \"totalCurrentLiabilitiesT1\",\n \"shortTermLiabilitiesT1\",\n \"nonCurrentLiabilitiesBorrowingsOrTermLoansT1\",\n \"nonCurrentLiabilitiesBankBorrowingsT1\",\n \"nonCurrentLiabilitiesLeaseObligationsT1\",\n \"nonCurrentLiabilitiesFinanceLeaseObligationsT1\",\n \"nonCurrentLiabilitiesDeferredTaxationT1\",\n \"nonCurrentLiabilitiesRetirementBenefitsT1\",\n \"nonCurrentLiabilitiesHirePurchasePayablesT1\",\n \"nonCurrentLiabilitiesDepositsFromCustomersT1\",\n \"nonCurrentLiabilitiesContractLiabilitiesT1\",\n \"totalNonCurrentLiabilitiesT1\",\n \"totalLiabilitiesT1\",\n \"tangibleAssetsT1\",\n \"shareCapitalT1\",\n \"preferenceShareCapitalT1\",\n \"sharePremiumT1\",\n \"reservesT1\",\n \"capitalReservesT1\",\n \"revaluationReservesT1\",\n \"exchangeEqualisationOrFluctuationReservesT1\",\n \"retainedEarningsT1\",\n \"totalEquityT1\",\n \"revenueT1\",\n \"costOfGoodsSoldT1\",\n \"grossProfitT1\",\n \"otherIncomeT1\",\n \"profitFromOperationsT1\",\n \"financeCostT1\",\n \"ebitdaT1\",\n \"taxesT1\",\n \"zakatT1\",\n \"profitAfterTaxT1\",\n \"netProfitT1\",\n \"netOperatingCashFlowT1\",\n \"depreciationT1\",\n \"depreciationOfPropertyPlantEquipmentT1\",\n \"depreciationRightOfUseAssetsT1\",\n \"depreciationOfInvestmentPropertiesT1\",\n \"depreciationOfInvestmentSecuritiesT1\",\n \"endOfYearCashT1\",\n \"nonCurrentAssetsSubsidiaryCompaniesT2\",\n \"nonCurrentAssetsAssociatedCompaniesT2\",\n \"nonCurrentAssetsDevelopmentPropertiesOrExpenditureT2\",\n \"nonCurrentAssetInvestmentPropertiesT2\",\n \"nonCurrentAssetsInvestmentsT2\",\n \"nonCurrentAssetInvestmentSecuritiesT2\",\n \"nonCurrentAssetDeferredAssetsT2\",\n \"nonCurrentAssetDepositsT2\",\n \"nonCurrentAssetOwnGoodwillT2\",\n \"nonCurrentAssetGoodwillOnConsolidationT2\",\n \"nonCurrentAssetSinkingFundT2\",\n \"nonCurrentAssetPropertyPlantEquipmentT2\",\n \"nonCurrentAssetInventoriesT2\",\n \"nonCurrentAssetRightOfUseAssetsT2\",\n \"nonCurrentAssetIntangibleAssetsT2\",\n \"nonCurrentAssetPrepaidLeasePaymentsT2\",\n \"nonCurrentAssetFinancialAssetAtFairValueT2\",\n \"nonCurrentAssetLandUseRightT2\",\n \"nonCurrentAssetTradeReceivablesT2\",\n \"nonCurrentAssetOtherReceivablesT2\",\n \"nonCurrentAssetTradeAndOtherReceivablesT2\",\n \"nonCurrentAssetOtherReceivablesDepositsAndPrepaymentsT2\",\n \"totalNonCurrentAssetsT2\",\n \"currentAssetDevelopmentPropertiesOrExpenditureT2\",\n \"currentAssetShortTermInvestmentsT2\",\n \"currentAssetTradeDebtorsT2\",\n \"currentAssetShortTermDepositsT2\",\n \"currentAssetAmountDueFromHoldingCompanyT2\",\n \"currentAssetAmountDueFromSubsidiaryCompaniesT2\",\n \"currentAssetAmountDueFromAssociatedCompaniesT2\",\n \"currentAssetAmountDueFromDirectorT2\",\n \"currentAssetAmountDueFromCustomerT2\",\n \"currentAssetAmountOwingByShareholdersT2\",\n \"currentAssetInventoriesT2\",\n \"currentAssetFinancialAssetAtFairValueT2\",\n \"currentAssetLandUseRightT2\",\n \"currentAssetTaxRecoverableT2\",\n \"currentAssetContractAssetsT2\",\n \"currentAssetCurrentTaxAssetsT2\",\n \"currentAssetPrepaymentsT2\",\n \"currentAssetDerivativeT2\",\n \"currentAssetCashAndBankBalancesT2\",\n \"currentAssetOtherReceivablesT2\",\n \"currentAssetRestrictedCashT2\",\n \"currentAssetCashAndCashEquivalentsT2\",\n \"currentAssetDepositsCashAndBankBalancesT2\",\n \"currentAssetCashAtBanksT2\",\n \"currentAssetCashOnHandT2\",\n \"currentAssetDepositsAndPrepaymentsT2\",\n \"currentAssetTradeAndOtherReceivablesT2\",\n \"currentAssetOtherReceivablesDepositsAndPrepaymentsT2\",\n \"currentAssetOtherReceivablesAndDepositsT2\",\n \"currentAssetOtherReceivablesAndPrepaymentsT2\",\n \"currentAssetCashT2\",\n \"totalCurrentAssetsT2\",\n \"totalAssetsT2\",\n \"currentLiabilitiesTradeCreditorsT2\",\n \"currentLiabilitiesHirePurchasePayablesT2\",\n \"currentLiabilitiesBankOverdraftT2\",\n \"currentLiabilitiesBankAcceptanceT2\",\n \"currentLiabilitiesBorrowingsOrTermLoansT2\",\n \"currentLiabilitiesBankborrowingsT2\",\n \"currentLiabilitiesAmountsOwingToHoldingCompanyT2\",\n \"currentLiabilitiesAmountsOwingToSubsidiaryCompaniesT2\",\n \"currentLiabilitiesAmountOwingToAssociatedCompaniesT2\",\n \"currentLiabilitiesAmountsOwingToDirectorT2\",\n \"currentLiabilitiesProvisionForTaxationT2\",\n \"currentLiabilitiesLeasePayablesT2\",\n \"currentLiabilitiesFinanceLeasePayablesT2\",\n \"currentLiabilitiesOtherPayablesT2\",\n \"currentLiabilitiesDividendPayablesT2\",\n \"currentLiabilitiesTradeAndOtherPayablesT2\",\n \"currentLiabilitiesDepositsFromCustomersT2\",\n \"currentLiabilitiesOtherPayablesAccrualsAndDepositsT2\",\n \"currentLiabilitiesOtherPayablesAndAccrualsT2\",\n \"currentLiabilitiesContractLiabilitiesT2\",\n \"currentLiabilitiesDerivativeT2\",\n \"totalCurrentLiabilitiesT2\",\n \"shortTermLiabilitiesT2\",\n \"nonCurrentLiabilitiesBorrowingsOrTermLoansT2\",\n \"nonCurrentLiabilitiesBankBorrowingsT2\",\n \"nonCurrentLiabilitiesLeaseObligationsT2\",\n \"nonCurrentLiabilitiesFinanceLeaseObligationsT2\",\n \"nonCurrentLiabilitiesDeferredTaxationT2\",\n \"nonCurrentLiabilitiesRetirementBenefitsT2\",\n \"nonCurrentLiabilitiesHirePurchasePayablesT2\",\n \"nonCurrentLiabilitiesDepositsFromCustomersT2\",\n \"nonCurrentLiabilitiesContractLiabilitiesT2\",\n \"totalNonCurrentLiabilitiesT2\",\n \"totalLiabilitiesT2\",\n \"tangibleAssetsT2\",\n \"shareCapitalT2\",\n \"preferenceShareCapitalT2\",\n \"sharePremiumT2\",\n \"reservesT2\",\n \"capitalReservesT2\",\n \"revaluationReservesT2\",\n \"exchangeEqualisationOrFluctuationReservesT2\",\n \"retainedEarningsT2\",\n \"totalEquityT2\",\n \"revenueT2\",\n \"costOfGoodsSoldT2\",\n \"grossProfitT2\",\n \"otherIncomeT2\",\n \"profitFromOperationsT2\",\n \"financeCostT2\",\n \"ebitdaT2\",\n \"taxesT2\",\n \"zakatT2\",\n \"profitAfterTaxT2\",\n \"netProfitT2\",\n \"netOperatingCashFlowT2\",\n \"depreciationT2\",\n \"depreciationOfPropertyPlantEquipmentT2\",\n \"depreciationRightOfUseAssetsT2\",\n \"depreciationOfInvestmentPropertiesT2\",\n \"depreciationOfInvestmentSecuritiesT2\",\n \"endOfYearCashT2\"\n ],\n \"category\": \"13\",\n \"document_type\": \"financialStatements\",\n \"document_group\": \"financials\",\n \"document_group_label\": \"Audited Financial Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 1,\n \"time_period_unit\": \"year\"\n },\n {\n \"name\": \"financials_fincap_t2\",\n \"displayName\": \"Audited Financial Statement (T-2) (FinCap)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"nonCurrentAssetsSubsidiaryCompaniesT3\",\n \"nonCurrentAssetsAssociatedCompaniesT3\",\n \"nonCurrentAssetsDevelopmentPropertiesOrExpenditureT3\",\n \"nonCurrentAssetInvestmentPropertiesT3\",\n \"nonCurrentAssetsInvestmentsT3\",\n \"nonCurrentAssetInvestmentSecuritiesT3\",\n \"nonCurrentAssetDeferredAssetsT3\",\n \"nonCurrentAssetDepositsT3\",\n \"nonCurrentAssetOwnGoodwillT3\",\n \"nonCurrentAssetGoodwillOnConsolidationT3\",\n \"nonCurrentAssetSinkingFundT3\",\n \"nonCurrentAssetPropertyPlantEquipmentT3\",\n \"nonCurrentAssetInventoriesT3\",\n \"nonCurrentAssetRightOfUseAssetsT3\",\n \"nonCurrentAssetIntangibleAssetsT3\",\n \"nonCurrentAssetPrepaidLeasePaymentsT3\",\n \"nonCurrentAssetFinancialAssetAtFairValueT3\",\n \"nonCurrentAssetLandUseRightT3\",\n \"nonCurrentAssetTradeReceivablesT3\",\n \"nonCurrentAssetOtherReceivablesT3\",\n \"nonCurrentAssetTradeAndOtherReceivablesT3\",\n \"nonCurrentAssetOtherReceivablesDepositsAndPrepaymentsT3\",\n \"totalNonCurrentAssetsT3\",\n \"currentAssetDevelopmentPropertiesOrExpenditureT3\",\n \"currentAssetShortTermInvestmentsT3\",\n \"currentAssetTradeDebtorsT3\",\n \"currentAssetShortTermDepositsT3\",\n \"currentAssetAmountDueFromHoldingCompanyT3\",\n \"currentAssetAmountDueFromSubsidiaryCompaniesT3\",\n \"currentAssetAmountDueFromAssociatedCompaniesT3\",\n \"currentAssetAmountDueFromDirectorT3\",\n \"currentAssetAmountDueFromCustomerT3\",\n \"currentAssetAmountOwingByShareholdersT3\",\n \"currentAssetInventoriesT3\",\n \"currentAssetFinancialAssetAtFairValueT3\",\n \"currentAssetLandUseRightT3\",\n \"currentAssetTaxRecoverableT3\",\n \"currentAssetContractAssetsT3\",\n \"currentAssetCurrentTaxAssetsT3\",\n \"currentAssetPrepaymentsT3\",\n \"currentAssetDerivativeT3\",\n \"currentAssetCashAndBankBalancesT3\",\n \"currentAssetOtherReceivablesT3\",\n \"currentAssetRestrictedCashT3\",\n \"currentAssetCashAndCashEquivalentsT3\",\n \"currentAssetDepositsCashAndBankBalancesT3\",\n \"currentAssetCashAtBanksT3\",\n \"currentAssetCashOnHandT3\",\n \"currentAssetDepositsAndPrepaymentsT3\",\n \"currentAssetTradeAndOtherReceivablesT3\",\n \"currentAssetOtherReceivablesDepositsAndPrepaymentsT3\",\n \"currentAssetOtherReceivablesAndDepositsT3\",\n \"currentAssetOtherReceivablesAndPrepaymentsT3\",\n \"currentAssetCashT3\",\n \"totalCurrentAssetsT3\",\n \"totalAssetsT3\",\n \"currentLiabilitiesTradeCreditorsT3\",\n \"currentLiabilitiesHirePurchasePayablesT3\",\n \"currentLiabilitiesBankOverdraftT3\",\n \"currentLiabilitiesBankAcceptanceT3\",\n \"currentLiabilitiesBorrowingsOrTermLoansT3\",\n \"currentLiabilitiesBankborrowingsT3\",\n \"currentLiabilitiesAmountsOwingToHoldingCompanyT3\",\n \"currentLiabilitiesAmountsOwingToSubsidiaryCompaniesT3\",\n \"currentLiabilitiesAmountOwingToAssociatedCompaniesT3\",\n \"currentLiabilitiesAmountsOwingToDirectorT3\",\n \"currentLiabilitiesProvisionForTaxationT3\",\n \"currentLiabilitiesLeasePayablesT3\",\n \"currentLiabilitiesFinanceLeasePayablesT3\",\n \"currentLiabilitiesOtherPayablesT3\",\n \"currentLiabilitiesDividendPayablesT3\",\n \"currentLiabilitiesTradeAndOtherPayablesT3\",\n \"currentLiabilitiesDepositsFromCustomersT3\",\n \"currentLiabilitiesOtherPayablesAccrualsAndDepositsT3\",\n \"currentLiabilitiesOtherPayablesAndAccrualsT3\",\n \"currentLiabilitiesContractLiabilitiesT3\",\n \"currentLiabilitiesDerivativeT3\",\n \"totalCurrentLiabilitiesT3\",\n \"shortTermLiabilitiesT3\",\n \"nonCurrentLiabilitiesBorrowingsOrTermLoansT3\",\n \"nonCurrentLiabilitiesBankBorrowingsT3\",\n \"nonCurrentLiabilitiesLeaseObligationsT3\",\n \"nonCurrentLiabilitiesFinanceLeaseObligationsT3\",\n \"nonCurrentLiabilitiesDeferredTaxationT3\",\n \"nonCurrentLiabilitiesRetirementBenefitsT3\",\n \"nonCurrentLiabilitiesHirePurchasePayablesT3\",\n \"nonCurrentLiabilitiesDepositsFromCustomersT3\",\n \"nonCurrentLiabilitiesContractLiabilitiesT3\",\n \"totalNonCurrentLiabilitiesT3\",\n \"totalLiabilitiesT3\",\n \"tangibleAssetsT3\",\n \"shareCapitalT3\",\n \"preferenceShareCapitalT3\",\n \"sharePremiumT3\",\n \"reservesT3\",\n \"capitalReservesT3\",\n \"revaluationReservesT3\",\n \"exchangeEqualisationOrFluctuationReservesT3\",\n \"retainedEarningsT3\",\n \"totalEquityT3\",\n \"revenueT3\",\n \"costOfGoodsSoldT3\",\n \"grossProfitT3\",\n \"otherIncomeT3\",\n \"profitFromOperationsT3\",\n \"financeCostT3\",\n \"ebitdaT3\",\n \"taxesT3\",\n \"zakatT3\",\n \"profitAfterTaxT3\",\n \"netProfitT3\",\n \"netOperatingCashFlowT3\",\n \"depreciationT3\",\n \"depreciationOfPropertyPlantEquipmentT3\",\n \"depreciationRightOfUseAssetsT3\",\n \"depreciationOfInvestmentPropertiesT3\",\n \"depreciationOfInvestmentSecuritiesT3\",\n \"endOfYearCashT3\"\n ],\n \"category\": \"13\",\n \"document_type\": \"financialStatements\",\n \"document_group\": \"financials\",\n \"document_group_label\": \"Audited Financial Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 2,\n \"time_period_unit\": \"year\"\n },\n {\n \"name\": \"form9\",\n \"displayName\": \"Form 9 / Section 17 / Form D\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"incorporatedDate\",\n \"companyName\",\n \"companyRegNo\"\n ],\n \"category\": \"13\",\n \"document_type\": \"form9\",\n \"document_group\": \"form9\",\n \"document_group_label\": \"Form 9 / Section 17 / Form D\",\n \"wire_format\": \"url_string\"\n },\n {\n \"name\": \"ssm\",\n \"displayName\": \"SSM Company Profile\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"ssmCompanyName\",\n \"ssmCompanyRegNo\",\n \"incorporatedDate\",\n \"businessCommencementDate\",\n \"businessNature\",\n \"ssmCompanyEntityType\",\n \"ssmPaidUpCapital\",\n \"companyStatus\",\n \"shareholders\",\n \"directors\",\n \"previousDirectors\",\n \"totalShareIssued\",\n \"companyLastOldName\",\n \"companyNameDateOfChange\",\n \"businessOrigin\",\n \"registeredAddress\"\n ],\n \"category\": \"13\",\n \"document_type\": \"ssm\",\n \"document_group\": \"ssm_documents\",\n \"document_group_label\": \"SSM Company Information\",\n \"wire_format\": \"url_string\"\n },\n {\n \"name\": \"ic\",\n \"displayName\": \"Identification Card (Front)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"icNumber\",\n \"icName\",\n \"icAddress\",\n \"icGender\",\n \"icReligion\",\n \"icDateOfBirth\",\n \"icPlaceOfBirth\",\n \"icNationality\",\n \"icRace\"\n ],\n \"category\": \"13\",\n \"document_type\": \"ic\",\n \"document_group\": \"ic_documents\",\n \"document_group_label\": \"Identification Card\",\n \"wire_format\": \"url_string\"\n },\n {\n \"name\": \"epf_statement_t1\",\n \"displayName\": \"Employees' Provident Fund (T-1)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"epfAccountHolderNameT1\",\n \"epfAccountHolderAddressT1\",\n \"epfStatementYearT1\",\n \"epfKwspMemberNumberT1\",\n \"epfIcNumberT1\",\n \"epfEmployerNumberT1\",\n \"epfDateOfStatementT1\",\n \"epfTotalContributionT1\",\n \"epfTotalCurrentContributionT1\"\n ],\n \"category\": \"13\",\n \"document_type\": \"epfStatements\",\n \"document_group\": \"epf_statements\",\n \"document_group_label\": \"EPF Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 1,\n \"time_period_unit\": \"year\"\n },\n {\n \"name\": \"epf_statement_t2\",\n \"displayName\": \"Employees' Provident Fund (T-2)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"epfAccountHolderNameT2\",\n \"epfAccountHolderAddressT2\",\n \"epfStatementYearT2\",\n \"epfKwspMemberNumberT2\",\n \"epfIcNumberT2\",\n \"epfEmployerNumberT2\",\n \"epfDateOfStatementT2\",\n \"epfTotalContributionT2\",\n \"epfTotalCurrentContributionT2\"\n ],\n \"category\": \"13\",\n \"document_type\": \"epfStatements\",\n \"document_group\": \"epf_statements\",\n \"document_group_label\": \"EPF Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 2,\n \"time_period_unit\": \"year\"\n },\n {\n \"name\": \"payslip_statement_t1\",\n \"displayName\": \"Payslip Statement (Month T-1)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT1\",\n \"payslipEmployeeNameT1\",\n \"payslipPayPeriodT1\",\n \"payslipPayDateT1\",\n \"payslipGrossPayT1\",\n \"payslipDeductionT1\",\n \"payslipEmployeeEpfContributionT1\",\n \"payslipEmployeeSocsoContributionT1\",\n \"payslipNetPayT1\",\n \"payslipBasicPayT1\",\n \"payslipFixedAllowancesT1\",\n \"payslipVariableIncomeT1\",\n \"payslipEmployeeEisContributionT1\",\n \"payslipEmployeeTaxT1\",\n \"payslipOtherDeductionT1\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 1,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"payslip_statement_t2\",\n \"displayName\": \"Payslip Statement (Month T-2)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT2\",\n \"payslipEmployeeNameT2\",\n \"payslipPayPeriodT2\",\n \"payslipPayDateT2\",\n \"payslipGrossPayT2\",\n \"payslipDeductionT2\",\n \"payslipEmployeeEpfContributionT2\",\n \"payslipEmployeeSocsoContributionT2\",\n \"payslipNetPayT2\",\n \"payslipBasicPayT2\",\n \"payslipFixedAllowancesT2\",\n \"payslipVariableIncomeT2\",\n \"payslipEmployeeEisContributionT2\",\n \"payslipEmployeeTaxT2\",\n \"payslipOtherDeductionT2\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 2,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"payslip_statement_t3\",\n \"displayName\": \"Payslip Statement (Month T-3)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT3\",\n \"payslipEmployeeNameT3\",\n \"payslipPayPeriodT3\",\n \"payslipPayDateT3\",\n \"payslipGrossPayT3\",\n \"payslipDeductionT3\",\n \"payslipEmployeeEpfContributionT3\",\n \"payslipEmployeeSocsoContributionT3\",\n \"payslipNetPayT3\",\n \"payslipBasicPayT3\",\n \"payslipFixedAllowancesT3\",\n \"payslipVariableIncomeT3\",\n \"payslipEmployeeEisContributionT3\",\n \"payslipEmployeeTaxT3\",\n \"payslipOtherDeductionT3\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 3,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"payslip_statement_t4\",\n \"displayName\": \"Payslip Statement (Month T-4)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT4\",\n \"payslipEmployeeNameT4\",\n \"payslipPayPeriodT4\",\n \"payslipPayDateT4\",\n \"payslipGrossPayT4\",\n \"payslipDeductionT4\",\n \"payslipEmployeeEpfContributionT4\",\n \"payslipEmployeeSocsoContributionT4\",\n \"payslipNetPayT4\",\n \"payslipBasicPayT4\",\n \"payslipFixedAllowancesT4\",\n \"payslipVariableIncomeT4\",\n \"payslipEmployeeEisContributionT4\",\n \"payslipEmployeeTaxT4\",\n \"payslipOtherDeductionT4\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 4,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"payslip_statement_t5\",\n \"displayName\": \"Payslip Statement (Month T-5)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT5\",\n \"payslipEmployeeNameT5\",\n \"payslipPayPeriodT5\",\n \"payslipPayDateT5\",\n \"payslipGrossPayT5\",\n \"payslipDeductionT5\",\n \"payslipEmployeeEpfContributionT5\",\n \"payslipEmployeeSocsoContributionT5\",\n \"payslipNetPayT5\",\n \"payslipBasicPayT5\",\n \"payslipFixedAllowancesT5\",\n \"payslipVariableIncomeT5\",\n \"payslipEmployeeEisContributionT5\",\n \"payslipEmployeeTaxT5\",\n \"payslipOtherDeductionT5\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 5,\n \"time_period_unit\": \"month\"\n },\n {\n \"name\": \"payslip_statement_t6\",\n \"displayName\": \"Payslip Statement (Month T-6)\",\n \"type\": \"file\",\n \"ihs_column_names\": [\n \"payslipEmployerNameT6\",\n \"payslipEmployeeNameT6\",\n \"payslipPayPeriodT6\",\n \"payslipPayDateT6\",\n \"payslipGrossPayT6\",\n \"payslipDeductionT6\",\n \"payslipEmployeeEpfContributionT6\",\n \"payslipEmployeeSocsoContributionT6\",\n \"payslipNetPayT6\",\n \"payslipBasicPayT6\",\n \"payslipFixedAllowancesT6\",\n \"payslipVariableIncomeT6\",\n \"payslipEmployeeEisContributionT6\",\n \"payslipEmployeeTaxT6\",\n \"payslipOtherDeductionT6\"\n ],\n \"category\": \"13\",\n \"document_type\": \"payslips\",\n \"document_group\": \"payslip_statements\",\n \"document_group_label\": \"Payslip Statements\",\n \"wire_format\": \"path_array\",\n \"document_slot\": 6,\n \"time_period_unit\": \"month\"\n }\n ]\n}\n","{\n \"version\": 2,\n \"types\": [\n {\n \"displayName\": \"Text\",\n \"name\": \"text\"\n },\n {\n \"displayName\": \"Number\",\n \"name\": \"number\"\n },\n {\n \"displayName\": \"Email\",\n \"name\": \"email\"\n },\n {\n \"displayName\": \"Dropdown\",\n \"name\": \"dropdown\"\n },\n {\n \"displayName\": \"Checkbox\",\n \"name\": \"checkbox\"\n },\n {\n \"displayName\": \"Radio Group\",\n \"name\": \"radiogroup\"\n },\n {\n \"displayName\": \"Boolean\",\n \"name\": \"boolean\"\n },\n {\n \"displayName\": \"File\",\n \"name\": \"file\"\n },\n {\n \"displayName\": \"Slider\",\n \"name\": \"slider\"\n },\n {\n \"displayName\": \"Range\",\n \"name\": \"range\"\n },\n {\n \"displayName\": \"Long Text (Comment)\",\n \"name\": \"comment\"\n },\n {\n \"displayName\": \"HTML Content\",\n \"name\": \"html\"\n }\n ],\n \"input_types\": [\n {\n \"displayName\": \"Text\",\n \"name\": \"text\"\n },\n {\n \"displayName\": \"Number\",\n \"name\": \"number\"\n },\n {\n \"displayName\": \"Email\",\n \"name\": \"email\"\n },\n {\n \"displayName\": \"Tel\",\n \"name\": \"tel\"\n },\n {\n \"displayName\": \"Date\",\n \"name\": \"date\"\n },\n {\n \"displayName\": \"Password\",\n \"name\": \"password\"\n },\n {\n \"displayName\": \"URL\",\n \"name\": \"url\"\n }\n ]\n}\n","{\n \"version\": 1,\n \"options\": [\n {\n \"id\": 1,\n \"displayName\": \"Numeric Validator\",\n \"class\": \"NumericValidator\",\n \"description\": \"Ensures the answer is a number within the specified range of minValue and maxValue.\",\n \"isRequired\": true,\n \"validators\": [\n {\n \"type\": \"numeric\",\n \"text\": \"Value must be within the range of 0 to 100\",\n \"minValue\": 0,\n \"maxValue\": 100\n }\n ]\n },\n {\n \"id\": 2,\n \"displayName\": \"Text Length Validator\",\n \"class\": \"TextValidator\",\n \"description\": \"Confirms the length of entered text is between minLength and maxLength.\",\n \"isRequired\": true,\n \"validators\": [\n {\n \"type\": \"text\",\n \"minLength\": 10,\n \"maxLength\": 280\n }\n ]\n },\n {\n \"id\": 3,\n \"displayName\": \"Regex Validator\",\n \"class\": \"RegexValidator\",\n \"description\": \"Throws an error if an entered value does not match a regular expression defined in the regex property.\",\n \"isRequired\": true,\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"The value must match the required pattern.\",\n \"regex\": \"your-regex-pattern-here\"\n }\n ]\n },\n {\n \"id\": 4,\n \"displayName\": \"Email Validator\",\n \"class\": \"EmailValidator\",\n \"description\": \"Confirms that the entered value is a valid e-mail address.\",\n \"isRequired\": true,\n \"validators\": [\n {\n \"type\": \"email\",\n \"text\": \"Value must be a valid email\"\n }\n ]\n },\n {\n \"id\": 5,\n \"displayName\": \"Expression Validator\",\n \"class\": \"ExpressionValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures that the field's expression always evaluates to true.\",\n \"validators\": [\n {\n \"type\": \"expression\",\n \"expression\": \"{fields} = true\",\n \"text\": \"The value must be true and cannot be false.\"\n }\n ]\n },\n {\n \"id\": 6,\n \"displayName\": \"Answer Count Validator\",\n \"class\": \"AnswerCountValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures selection of an appropriate number of choices, keeping responses within the minCount and maxCount range.\",\n \"validators\": [\n {\n \"type\": \"answercount\",\n \"minCount\": 2,\n \"maxCount\": 4\n }\n ]\n },\n {\n \"id\": 7,\n \"displayName\": \"Full Name Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures that the entered value is a valid full name.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please make sure the name doesn't include extra spaces, numbers, or invalid symbols\",\n \"regex\": \"^[A-Za-z'-]+(?:\\\\s[A-Za-z'-]+)*\\\\s?[A-Za-z'-]+$\"\n }\n ]\n },\n {\n \"id\": 8,\n \"displayName\": \"Mobile Phone No Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures valid Malaysia phone number is entered.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"A valid Malaysia phone number is required.\",\n \"regex\": \"^(011[0-9]{8}|01[2346789][0-9]{7}|[2-9][0-9]{0,8})$\"\n }\n ]\n },\n {\n \"id\": 9,\n \"displayName\": \"IC Number Total Digits Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures exactly 12 digits are entered for the IC number.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d{12}$\",\n \"text\": \"Please enter exactly 12 digits numbers\"\n }\n ]\n },\n {\n \"id\": 10,\n \"displayName\": \"IC Number Valid Birth Year, Month, and Date Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures valid birth year, month, and day are entered for the IC number.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^(\\\\d{2})(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])\\\\d{6}$\",\n \"text\": \"First 6 digits must be valid birth year (00-99), month (01-12), and day (01-31)\"\n }\n ]\n },\n {\n \"id\": 11,\n \"displayName\": \"Duration in Current Residence (Months) Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures duration includes a number between 0-11.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^([0-9]|10|11)$\",\n \"text\": \"Value must be a number between 0-11.\"\n }\n ]\n },\n {\n \"id\": 12,\n \"displayName\": \"Duration in Current Residence (Years) Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures duration includes a number between 0-99.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^([0-9]|[1-9][0-9])$\",\n \"text\": \"Value must be a number between 0-99.\"\n }\n ]\n },\n {\n \"id\": 13,\n \"displayName\": \"Office Phone No. Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures office phone number is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"The phone number must be a valid Malaysian number\",\n \"regex\": \"^(011[0-9]{8}|(60[4-7]|004|005|006|007|009|609|012|013|014|016|017|019)[0-9]{7})$\"\n }\n ]\n },\n {\n \"id\": 14,\n \"displayName\": \"Age Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures age entered is between 21-55.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid whole number age between 21 and 55.\",\n \"regex\": \"^(2[1-9]|[3-4][0-9]|55)$\"\n }\n ]\n },\n {\n \"id\": 15,\n \"displayName\": \"Consent(s) Expression Validator\",\n \"class\": \"ExpressionValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures that the field's expression always evaluates to true.\",\n \"validators\": [\n {\n \"type\": \"expression\",\n \"expression\": \"{consentCrossSelling} = true\",\n \"text\": \"You must provide consent to Consent Cross-Selling.\"\n }\n ]\n },\n {\n \"id\": 16,\n \"displayName\": \"Date Joined Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures date joined is in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\",\n \"text\": \"Date must be in YYYY-MM-DD format\"\n }\n ]\n },\n {\n \"id\": 17,\n \"displayName\": \"Date Joined Custom Validator\",\n \"class\": \"CustomValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures date joined is not in the future.\",\n \"validators\": [\n {\n \"type\": \"custom\",\n \"validator\": \"validateNotFutureDate\",\n \"text\": \"Date of joining cannot be in the future\"\n }\n ]\n },\n {\n \"id\": 18,\n \"displayName\": \"Emergency Contact No. Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures emergency contact number is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"A valid Malaysia phone number is required.\",\n \"regex\": \"^((60[4-79]|0[4-79])[0-9]{7}|011[0-9]{8}|01[2346789][0-9]{7})$\"\n }\n ]\n },\n {\n \"id\": 19,\n \"displayName\": \"Monthly Gross Income Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures monthly gross income is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"regex\": \"^\\\\d+(\\\\.\\\\d+)?$\",\n \"text\": \"Please enter a valid non-negative number.\"\n }\n ]\n },\n {\n \"id\": 20,\n \"displayName\": \"Monthly Gross Income Expression Validator\",\n \"class\": \"ExpressionValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures monthly gross income is at least RM 2000.\",\n \"validators\": [\n {\n \"type\": \"expression\",\n \"expression\": \"{monthlyGrossIncome} >= 2000\",\n \"text\": \"Income must be at least RM 2000.\"\n }\n ]\n },\n {\n \"id\": 21,\n \"displayName\": \"No of Dependants Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures number of dependants is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid whole number between 0 and 99.\",\n \"regex\": \"^[0-9][0-9]?$\"\n }\n ]\n },\n {\n \"id\": 22,\n \"displayName\": \"Financing Tenure (Years) Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures financing tenure is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a valid financing tenure from 1 to 7 years.\",\n \"regex\": \"^[1-7]$\"\n }\n ]\n },\n {\n \"id\": 23,\n \"displayName\": \"Financing Amount Range Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures financing amount is entered in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter a financing amount between 2,000 and 150,000.\",\n \"regex\": \"^(2000|[1-9][0-9]{3}|[1-9][0-9]{4}|150000)$\"\n }\n ]\n },\n {\n \"id\": 24,\n \"displayName\": \"Financing Amount Incrementals Regex Validator\",\n \"class\": \"RegexValidator\",\n \"isRequired\": true,\n \"description\": \"Ensures financing amount is entered incrementally in the correct format.\",\n \"validators\": [\n {\n \"type\": \"regex\",\n \"text\": \"Please enter an amount in increments of 1,000.\",\n \"regex\": \"^([1-9][0-9]*000|150000)$\"\n }\n ]\n }\n ]\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { FieldData, Category } from \"./survey-generator.js\";\nimport type { FormFieldTypeDefinitions, EditorValidator } from \"./form-field.js\";\nimport type { FormValidatorDefinitions } from \"./form-field-validator.js\";\nimport FormField from \"./form-field.js\";\nimport baseSpecsData from \"./data/form-field-base-specs.json\" with { type: \"json\" };\nimport typeDefsData from \"./data/form-field-types.json\" with { type: \"json\" };\nimport validatorDefsData from \"./data/form-field-validators.json\" with { type: \"json\" };\n\nexport const BASE_FIELD_SPECS: {\n schemaVersion: string;\n categories: Category[];\n fields: FieldData[];\n} = baseSpecsData as any;\n\nexport const FIELD_TYPE_DEFINITIONS: FormFieldTypeDefinitions = typeDefsData as FormFieldTypeDefinitions;\n\nexport const DEFAULT_VALIDATOR_DEFINITIONS: FormValidatorDefinitions = {\n version: (validatorDefsData as any).version,\n options: (validatorDefsData as any).options as EditorValidator[],\n};\n\nexport function getBaseFieldSpecs(): FieldData[] {\n return BASE_FIELD_SPECS.fields;\n}\n\nexport function getBaseCategories(): Category[] {\n return BASE_FIELD_SPECS.categories;\n}\n\nlet cachedFieldSpecMap: Map<string, FieldData> | null = null;\n\n/**\n * Returns a cached Map of base field name → FieldData.\n * Keyed by each field's `name` property from the base specs.\n */\nexport function getBaseFieldSpecMap(): Map<string, FieldData> {\n if (cachedFieldSpecMap) {\n return cachedFieldSpecMap;\n }\n\n const map = new Map<string, FieldData>();\n for (const field of BASE_FIELD_SPECS.fields) {\n if (field.name) {\n map.set(field.name, field);\n }\n }\n\n cachedFieldSpecMap = map;\n return cachedFieldSpecMap;\n}\n\nlet cachedFieldNames: string[] | null = null;\n\nexport function getBaseFieldNames(): string[] {\n if (cachedFieldNames) {\n return cachedFieldNames;\n }\n\n const fields = BASE_FIELD_SPECS.fields;\n const names: string[] = [];\n\n for (const field of fields) {\n try {\n const formField = FormField.fromObject(field);\n names.push(...formField.getFieldNames());\n } catch {\n // Skip fields that fail to parse\n }\n }\n\n cachedFieldNames = [...new Set(names)];\n return cachedFieldNames;\n}\n","/*\n * IHS data processing types.\n * Used by finsys-client and finhub-adonisjs to render application details.\n */\n\nexport enum IhsValueFormat {\n STRING = 'string',\n CURRENCY = 'currency',\n NUMBER = 'number',\n PERCENTAGE = 'percentage',\n DATE = 'date',\n TABLE = 'table',\n}\n\nexport interface IhsFieldDetail {\n name: string\n displayName: string\n category: string\n value: unknown\n valueFormat: IhsValueFormat\n}\n\nexport interface IhsDetailCategory {\n category: string\n items: { name: string; displayName: string; value: unknown; valueFormat: IhsValueFormat }[]\n}\n\nexport enum FileFieldTableType {\n TIME_SERIES = 'timeSeries',\n KEY_VALUE = 'keyValue',\n}\n\n/**\n * Per-field extraction provenance (SYS-2737/SYS-2741). The single canonical\n * envelope — finsys-api writes it (ihs_field_metadata), finsys-core surfaces it\n * onto detail cells, both consumers render it. Vocabulary mirrors adapter_runs\n * (SYS-2441) so FinXtract + adapter provenance converge at SYS-2499 Phase 5.\n *\n * source — who produced the value, e.g. \"finxtract:ssm\"\n * confidence — normalized 0..1; null when derived/computed (no score)\n * observedAt — ISO wall-clock of the extraction run\n * sourceRunId — the extraction run/job id that wrote it\n * origin — \"extracted\" (a real {value,confidence} leaf) vs \"derived\"\n * (computed / no-confidence path) vs \"manual\" (SYS-2806, a\n * lender-entered correction, committed once its edit overlay\n * is approved). A \"derived\" field must render as \"no\n * confidence available\", never a fabricated low score; a\n * \"manual\" field must render as an edit indicator, not a\n * confidence dot — confidence is always null for it too.\n */\n/**\n * Canonical origin values, single source of truth (Gemini-review finding:\n * avoids duplicating the literal strings between the type and the runtime\n * guard) -- mirrors the IhsStatus/IHS_VALID_STATUSES pattern in\n * ihs-status.ts.\n */\nexport const IHS_FIELD_ORIGINS = ['extracted', 'derived', 'manual'] as const\nexport type IhsFieldOrigin = (typeof IHS_FIELD_ORIGINS)[number]\n\nexport interface IhsFieldProvenance {\n source: string\n confidence: number | null\n observedAt: string\n sourceRunId: string | null\n origin: IhsFieldOrigin\n}\n\n/**\n * Type guard: narrows an unknown value to `IhsFieldOrigin` iff it is one of\n * the three canonical origin strings. `origin` was previously validated\n * only by the TS union — this is the first runtime check.\n */\nexport function isValidIhsFieldOrigin(origin: unknown): origin is IhsFieldOrigin {\n return typeof origin === 'string' && (IHS_FIELD_ORIGINS as readonly string[]).includes(origin)\n}\n\nexport interface FileFieldTableItem {\n displayName: string\n timePeriods: string[]\n data: Record<string, unknown>\n formattedData: Record<string, string>\n type: FileFieldTableType\n isNumeric: boolean\n /**\n * SYS-2741: per-cell extraction provenance, keyed exactly like `data` (period\n * key for TIME_SERIES, `'value'` for KEY_VALUE). `confidence` carries only\n * scored (origin 'extracted') cells so a numeric dot never renders for a\n * derived value; `provenance` carries the full envelope for every known cell.\n */\n confidence?: Record<string, number>\n provenance?: Record<string, IhsFieldProvenance>\n}\n\nexport interface FileFieldTableData {\n name: string\n displayName: string\n type: FileFieldTableType\n items: FileFieldTableItem[]\n hasData: boolean\n}\n\n/**\n * One sibling-table row as finsys-api's `docInstanceStorageService` writes\n * it (SYS-2842) -- the unbounded counterpart to a T{n}-suffixed wide-table\n * slot. `instanceKey` is the real, collision-free per-document key;\n * `sourceLabel` is a human label when the doc type has one (e.g. a bank\n * name); `timePeriod` is the same descriptive value column the legacy\n * T{n} scheme used, kept for period-labeling and legacy provenance lookup\n * (SYS-2886 Phase 5) -- no longer the row's key. Metric fields are the\n * category's own base (unsuffixed) column names.\n */\nexport interface InstanceRow {\n instanceKey: string\n sourceLabel?: string | null\n timePeriod?: string | null\n [metricKey: string]: unknown\n}\n\n// ── Documents table (SYS-2765 / SYS-2766) ──────────────────────\n\n/**\n * Per-document File metadata attached by finsys-api `getIhsDetailsById` as the\n * `documentMetadata` sibling map (SYS-2765), keyed by the document's raw stored\n * path. The single source for the documents table's Type / Size / Uploaded\n * columns — the IHS doc fields themselves carry only the path.\n */\nexport interface DocumentFileMetadata {\n fileName: string | null\n fileType: string | null\n fileSize: number | null\n createdAt: string | null\n}\n\n/**\n * Intrinsic, data-derived capability eligibility for a document row. Reflects\n * ONLY what the IHS payload implies (doc type + a resolvable file); the consumer\n * ANDs in its own runtime gates (readOnly, allowReupload, and — for viewJson —\n * whether extraction has actually completed) before showing a control.\n */\nexport interface DocumentRowCapabilities {\n /** A downloadable original exists (a resolvable documentId). */\n download: boolean\n /** The doc type produces extracted JSON (consumer still gates on \"Extracted\"). */\n viewJson: boolean\n /** The doc type can be re-extracted. */\n reExtract: boolean\n /** The doc type accepts a replacement upload (finsys-api /ihs/client/update/document). */\n reUpload: boolean\n}\n\n/**\n * One uploaded document, presentation-agnostic — built by `buildDocumentRows`\n * from the IHS payload + its `documentMetadata` map. Rendered identically by\n * FinHub (React) and finsys-client (Edge). Live extraction status + confidence\n * are NOT payload-derived; the consumer overlays them by matching\n * `(docType, timePeriod)`.\n */\nexport interface DocumentRow {\n /** IHS field key, e.g. 'bankStatements'. */\n docType: string\n /** Human label for the doc-type group, e.g. 'Bank Statements'. */\n label: string\n /** 0-based position within the docType group. */\n index: number\n /** Best display name (resolved file name, or a label + period/index fallback). */\n displayName: string\n /** Id for the download link; null when no file path is resolvable. */\n documentId: string | null\n /** Raw stored path — the join key back to `documentMetadata`. */\n path: string | null\n /** Extraction time-period token: 'T{month|year}' or 'ALL'. */\n timePeriod: string\n /** Human period label ('Jan 2026' / 'Year 2024') or null. */\n periodLabel: string | null\n /** Resolved file name; null when the stored name looks like an opaque id. */\n fileName: string | null\n /** File type label (extension → MIME subtype, upper-cased) or null. */\n fileType: string | null\n /** File size in bytes, or null when unknown. */\n fileSize: number | null\n /** ISO upload timestamp (File.createdAt) or null. */\n uploadedAt: string | null\n /** Intrinsic capability eligibility (consumer overlays its runtime gates). */\n capabilities: DocumentRowCapabilities\n}\n","/*\n * Document type registry.\n *\n * Single source of truth for \"which FinXtract document types exist,\"\n * derived directly from the field-spec catalog (form-field-base-specs.json)\n * instead of hand-synchronized code. This replaces four previously-separate\n * structures that had to be edited together by hand:\n * - extraction.ts's closed ExtractionFileType enum\n * - extraction-status.ts's FILE_TYPE_TO_GROUP map\n * - ihs-processing.ts's FIELD_GROUP_PREFIXES + GROUP_DISPLAY_NAMES\n *\n * Adding a new document type (e.g. invoices) is now a data-only edit to\n * form-field-base-specs.json -- tag its `type: 'file'` entries with\n * document_type/document_group/document_group_label/wire_format, no\n * TypeScript union to edit, no exhaustive map to keep in sync by hand.\n *\n * Six distinct properties, because real consumer code depends on each\n * independently (confirmed by direct trace, not assumed):\n * - document_type: the wire/dispatch value (e.g. \"bankStatements\") --\n * what File.type, processIhsUpdate's switch, and ocrValidator's\n * allowlist key on.\n * - document_group: the render/table grouping key (e.g. \"ssm_documents\")\n * -- what buildFileFieldTables's output is keyed by. finsys-client's\n * ihs_controller.ts specifically special-cases the literal string\n * \"ssm_documents\" (skips it in favor of a dedicated partial), so this\n * must stay a distinct, stable value from document_type, not merged.\n * - document_group_label: human-friendly table/status display label.\n * - wire_format: reserved for a future @finsys/borrower-client\n * consolidation of its own payload-transfer.ts registry (not consumed\n * by anything in this package yet) -- 'path_array' | 'url_string' |\n * 'path_only', mirroring the shapes borrower-client already uses.\n * - document_slot: which UPLOAD position this field represents (1st\n * document, 2nd, etc.) -- known at upload time, before extraction\n * ever runs. Distinct from a \"time period slot\" (which final\n * displayed period the EXTRACTED DATA populates): for bank\n * statements/EPF/payslips these are always 1:1 (one document, one\n * period), but for financial statements one document can supply TWO\n * periods' worth of data (audited financials show two comparative\n * years per document) -- that reconciliation is genuinely\n * extraction-time behavior, not catalog data, and is NOT captured\n * by document_slot. document_slot is exactly what\n * @finsys/borrower-client's payload-transfer.ts currently has to\n * regex-capture out of the field name (e.g. `bank_statement_t(\\d+)`)\n * -- reserved here for that future consolidation, not consumed by\n * anything in this package yet. `financials` (slot 1) and\n * `financials_fincap_t1` (also slot 1) are NOT a duplicate-slot bug:\n * they're alternate catalog entries for different form variants\n * (confirmed by direct read -- both share document_group \"financials\"\n * but represent mutually exclusive form paths, never populated\n * together on one IHS), so both correctly describe \"the first\n * physical document uploaded\" for their respective variant.\n * - time_period_unit: what unit document_slot's number measures for\n * this field -- 'month' | 'year'. Confirmed by the actual catalog\n * data, not assumed: bank statements and payslips are monthly,\n * financial statements and EPF statements are annual (EPF's own\n * column names literally contain \"Year\", e.g. epfStatementYearT1).\n *\n * Mirrors the AdapterCategory pattern (SYS-2500): runtime lookup/grouping\n * derived from JSON data, no compile-time exhaustiveness. Same trade-off\n * applies -- no autocomplete on a document-type string; a wrong one is\n * caught by isDocumentType/assertDocumentType at the trust boundary\n * instead of by the compiler.\n */\n\nimport { getBaseFieldSpecs } from './catalogs.js'\nimport type { FieldData } from './survey-generator.js'\n\nexport type WireFormat = 'path_array' | 'url_string' | 'path_only'\nexport type TimePeriodUnit = 'month' | 'year'\n\nexport interface DocumentTypeGroup {\n /** Wire/dispatch value, e.g. \"bankStatements\". */\n readonly documentType: string\n /** Render/table grouping key, e.g. \"ssm_documents\". Distinct from documentType -- see module doc. */\n readonly documentGroup: string\n /** Human-friendly label, e.g. \"Bank Statements\". */\n readonly label: string\n /** Reserved for a future borrower-client payload-routing consolidation. Taken from the group's first entry; not enforced consistent across entries (all groups agree today, but a future mixed-format group would silently inherit the first entry's value). */\n readonly wireFormat?: WireFormat\n /**\n * The catalog's own `type: 'file'` entries belonging to this group, in\n * catalog order. Each entry may carry its own document_slot/\n * time_period_unit -- see TaggedFieldData and the module doc.\n */\n readonly fields: readonly TaggedFieldData[]\n}\n\nexport interface TaggedFieldData extends FieldData {\n document_type?: string\n document_group?: string\n document_group_label?: string\n wire_format?: WireFormat\n /** Which upload position this field represents (1st document, 2nd, etc). See module doc for why this is distinct from a \"time period\". */\n document_slot?: number\n /** What unit document_slot's number measures for this field. */\n time_period_unit?: TimePeriodUnit\n}\n\nlet cached: readonly DocumentTypeGroup[] | null = null\n\nfunction buildDocumentTypeGroups(): readonly DocumentTypeGroup[] {\n const fileFields = getBaseFieldSpecs().filter(\n (f): f is TaggedFieldData => f.type === 'file' && !!f.name,\n )\n\n const order: string[] = []\n const byDocumentType = new Map<\n string,\n {\n documentGroup: string\n label: string\n wireFormat: WireFormat | undefined\n fields: TaggedFieldData[]\n }\n >()\n\n for (const f of fileFields) {\n // Untagged entries (none exist today, but future-proofed): fall back\n // to the entry's own name/displayName as a single-entry group.\n const documentType = f.document_type ?? f.name!\n const documentGroup = f.document_group ?? documentType\n const label = f.document_group_label ?? f.displayName ?? documentType\n\n if (!byDocumentType.has(documentType)) {\n order.push(documentType)\n byDocumentType.set(documentType, {\n documentGroup,\n label,\n wireFormat: f.wire_format,\n fields: [],\n })\n }\n byDocumentType.get(documentType)!.fields.push(f)\n }\n\n return order.map((documentType) => {\n const entry = byDocumentType.get(documentType)!\n return {\n documentType,\n documentGroup: entry.documentGroup,\n label: entry.label,\n wireFormat: entry.wireFormat,\n fields: entry.fields,\n }\n })\n}\n\n/** Every registered document type, in catalog declaration order. */\nexport function getDocumentTypeGroups(): readonly DocumentTypeGroup[] {\n if (!cached) cached = buildDocumentTypeGroups()\n return cached\n}\n\n/** True if `id` is a registered document type (the wire/dispatch value). */\nexport function isDocumentType(id: string): boolean {\n return getDocumentTypeGroups().some((g) => g.documentType === id)\n}\n\n/** Returns `id` if it's a registered document type, otherwise throws. */\nexport function assertDocumentType(id: string): string {\n if (!isDocumentType(id)) {\n const known = getDocumentTypeGroups().map((g) => g.documentType)\n throw new Error(`Unknown document type: \"${id}\". Available: ${known.join(', ')}`)\n }\n return id\n}\n","{\n \"accountHolderName\": \"Account Holder Name\",\n \"statementDate\": \"Statement Date\",\n \"bankName\": \"Bank Name\",\n \"accountNumber\": \"Account Number\",\n \"totalCredits\": \"Total Credits\",\n \"totalDebits\": \"Total Debits\",\n \"openingBalance\": \"Opening Balance\",\n \"bankBalance\": \"Bank Balance\",\n \"nonCurrentAssetsSubsidiaryCompanies\": \"Subsidiary Companies (Non-Current Assets)\",\n \"nonCurrentAssetsAssociatedCompanies\": \"Associated Companies (Non-Current Assets)\",\n \"nonCurrentAssetsDevelopmentPropertiesOrExpenditure\": \"Development Properties/Expenditure (Non-Current Assets)\",\n \"nonCurrentAssetInvestmentProperties\": \"Investment Properties (Non-Current Assets)\",\n \"nonCurrentAssetsInvestments\": \"Investments (Non-Current Assets)\",\n \"nonCurrentAssetInvestmentSecurities\": \"Investment Securities (Non-Current Assets)\",\n \"nonCurrentAssetDeferredAssets\": \"Deferred Assets (Non-Current Assets)\",\n \"nonCurrentAssetDeposits\": \"Deposits (Non-Current Assets)\",\n \"nonCurrentAssetOwnGoodwill\": \"Own Goodwill (Non-Current Assets)\",\n \"nonCurrentAssetGoodwillOnConsolidation\": \"Goodwill on Consolidation (Non-Current Assets)\",\n \"nonCurrentAssetSinkingFund\": \"Sinking Fund (Non-Current Assets)\",\n \"nonCurrentAssetPropertyPlantEquipment\": \"Property, Plant & Equipment (Non-Current Assets)\",\n \"nonCurrentAssetInventories\": \"Inventories (Non-Current Assets)\",\n \"nonCurrentAssetRightOfUseAssets\": \"Right of Use Assets (Non-Current Assets)\",\n \"nonCurrentAssetIntangibleAssets\": \"Intangible Assets (Non-Current Assets)\",\n \"nonCurrentAssetPrepaidLeasePayments\": \"Prepaid Lease Payments (Non-Current Assets)\",\n \"nonCurrentAssetFinancialAssetAtFairValue\": \"Financial Assets at Fair Value (Non-Current Assets)\",\n \"nonCurrentAssetLandUseRight\": \"Land Use Rights (Non-Current Assets)\",\n \"nonCurrentAssetTradeReceivables\": \"Trade Receivables (Non-Current Assets)\",\n \"nonCurrentAssetOtherReceivables\": \"Other Receivables (Non-Current Assets)\",\n \"nonCurrentAssetTradeAndOtherReceivables\": \"Trade and Other Receivables (Non-Current Assets)\",\n \"nonCurrentAssetOtherReceivablesDepositsAndPrepayments\": \"Other Receivables, Deposits and Prepayments (Non-Current Assets)\",\n \"totalNonCurrentAssets\": \"Total Non-Current Assets\",\n \"currentAssetDevelopmentPropertiesOrExpenditure\": \"Development Properties/Expenditure (Current Assets)\",\n \"currentAssetShortTermInvestments\": \"Short Term Investments (Current Assets)\",\n \"currentAssetTradeDebtors\": \"Trade Debtors (Current Assets)\",\n \"currentAssetShortTermDeposits\": \"Short Term Deposits (Current Assets)\",\n \"currentAssetAmountDueFromHoldingCompany\": \"Amount Due from Holding Company (Current Assets)\",\n \"currentAssetAmountDueFromSubsidiaryCompanies\": \"Amount Due from Subsidiary Companies (Current Assets)\",\n \"currentAssetAmountDueFromAssociatedCompanies\": \"Amount Due from Associated Companies (Current Assets)\",\n \"currentAssetAmountDueFromDirector\": \"Amount Due from Director (Current Assets)\",\n \"currentAssetAmountDueFromCustomer\": \"Amount Due from Customer (Current Assets)\",\n \"currentAssetAmountOwingByShareholders\": \"Amount Owing by Shareholders (Current Assets)\",\n \"currentAssetInventories\": \"Inventories (Current Assets)\",\n \"currentAssetFinancialAssetAtFairValue\": \"Financial Assets at Fair Value (Current Assets)\",\n \"currentAssetLandUseRight\": \"Land Use Rights (Current Assets)\",\n \"currentAssetTaxRecoverable\": \"Tax Recoverable (Current Assets)\",\n \"currentAssetContractAssets\": \"Contract Assets (Current Assets)\",\n \"currentAssetCurrentTaxAssets\": \"Current Tax Assets (Current Assets)\",\n \"currentAssetPrepayments\": \"Prepayments (Current Assets)\",\n \"currentAssetDerivative\": \"Derivatives (Current Assets)\",\n \"currentAssetCashAndBankBalances\": \"Cash and Bank Balances (Current Assets)\",\n \"currentAssetOtherReceivables\": \"Other Receivables (Current Assets)\",\n \"currentAssetRestrictedCash\": \"Restricted Cash (Current Assets)\",\n \"currentAssetCashAndCashEquivalents\": \"Cash and Cash Equivalents (Current Assets)\",\n \"currentAssetDepositsCashAndBankBalances\": \"Deposits, Cash and Bank Balances (Current Assets)\",\n \"currentAssetCashAtBanks\": \"Cash at Banks (Current Assets)\",\n \"currentAssetCashOnHand\": \"Cash on Hand (Current Assets)\",\n \"currentAssetDepositsAndPrepayments\": \"Deposits and Prepayments (Current Assets)\",\n \"currentAssetTradeAndOtherReceivables\": \"Trade and Other Receivables (Current Assets)\",\n \"currentAssetOtherReceivablesDepositsAndPrepayments\": \"Other Receivables, Deposits and Prepayments (Current Assets)\",\n \"currentAssetOtherReceivablesAndDeposits\": \"Other Receivables and Deposits (Current Assets)\",\n \"currentAssetOtherReceivablesAndPrepayments\": \"Other Receivables and Prepayments (Current Assets)\",\n \"currentAssetCash\": \"Cash (Current Assets)\",\n \"totalCurrentAssets\": \"Total Current Assets\",\n \"totalAssets\": \"Total Assets\",\n \"currentLiabilitiesTradeCreditors\": \"Trade Creditors (Current Liabilities)\",\n \"currentLiabilitiesHirePurchasePayables\": \"Hire Purchase Payables (Current Liabilities)\",\n \"currentLiabilitiesBankOverdraft\": \"Bank Overdraft (Current Liabilities)\",\n \"currentLiabilitiesBankAcceptance\": \"Bank Acceptance (Current Liabilities)\",\n \"currentLiabilitiesBorrowingsOrTermLoans\": \"Borrowings/Term Loans (Current Liabilities)\",\n \"currentLiabilitiesBankborrowings\": \"Bank Borrowings (Current Liabilities)\",\n \"currentLiabilitiesAmountsOwingToHoldingCompany\": \"Amounts Owing to Holding Company (Current Liabilities)\",\n \"currentLiabilitiesAmountsOwingToSubsidiaryCompanies\": \"Amounts Owing to Subsidiary Companies (Current Liabilities)\",\n \"currentLiabilitiesAmountOwingToAssociatedCompanies\": \"Amount Owing to Associated Companies (Current Liabilities)\",\n \"currentLiabilitiesAmountsOwingToDirector\": \"Amounts Owing to Director (Current Liabilities)\",\n \"currentLiabilitiesProvisionForTaxation\": \"Provision for Taxation (Current Liabilities)\",\n \"currentLiabilitiesLeasePayables\": \"Lease Payables (Current Liabilities)\",\n \"currentLiabilitiesFinanceLeasePayables\": \"Finance Lease Payables (Current Liabilities)\",\n \"currentLiabilitiesOtherPayables\": \"Other Payables (Current Liabilities)\",\n \"currentLiabilitiesDividendPayables\": \"Dividend Payables (Current Liabilities)\",\n \"currentLiabilitiesTradeAndOtherPayables\": \"Trade and Other Payables (Current Liabilities)\",\n \"currentLiabilitiesDepositsFromCustomers\": \"Deposits from Customers (Current Liabilities)\",\n \"currentLiabilitiesOtherPayablesAccrualsAndDeposits\": \"Other Payables, Accruals and Deposits (Current Liabilities)\",\n \"currentLiabilitiesOtherPayablesAndAccruals\": \"Other Payables and Accruals (Current Liabilities)\",\n \"currentLiabilitiesContractLiabilities\": \"Contract Liabilities (Current Liabilities)\",\n \"currentLiabilitiesDerivative\": \"Derivative Liabilities (Current Liabilities)\",\n \"totalCurrentLiabilities\": \"Total Current Liabilities\",\n \"shortTermLiabilities\": \"Short Term Liabilities\",\n \"nonCurrentLiabilitiesBorrowingsOrTermLoans\": \"Borrowings/Term Loans (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesBankBorrowings\": \"Bank Borrowings (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesLeaseObligations\": \"Lease Obligations (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesFinanceLeaseObligations\": \"Finance Lease Obligations (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesDeferredTaxation\": \"Deferred Taxation (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesRetirementBenefits\": \"Retirement Benefits (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesHirePurchasePayables\": \"Hire Purchase Payables (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesDepositsFromCustomers\": \"Deposits from Customers (Non-Current Liabilities)\",\n \"nonCurrentLiabilitiesContractLiabilities\": \"Contract Liabilities (Non-Current Liabilities)\",\n \"totalNonCurrentLiabilities\": \"Total Non-Current Liabilities\",\n \"totalLiabilities\": \"Total Liabilities\",\n \"tangibleAssets\": \"Tangible Assets\",\n \"shareCapital\": \"Share Capital\",\n \"preferenceShareCapital\": \"Preference Share Capital\",\n \"sharePremium\": \"Share Premium\",\n \"reserves\": \"Reserves\",\n \"capitalReserves\": \"Capital Reserves\",\n \"revaluationReserves\": \"Revaluation Reserves\",\n \"exchangeEqualisationOrFluctuationReserves\": \"Exchange Equalisation/Fluctuation Reserves\",\n \"retainedEarnings\": \"Retained Earnings\",\n \"totalEquity\": \"Total Equity\",\n \"revenue\": \"Revenue\",\n \"costOfGoodsSold\": \"Cost of Goods Sold\",\n \"grossProfit\": \"Gross Profit\",\n \"otherIncome\": \"Other Income\",\n \"profitFromOperations\": \"Profit from Operations\",\n \"financeCost\": \"Finance Cost\",\n \"ebitda\": \"Profit Before Tax\",\n \"taxes\": \"Taxes\",\n \"zakat\": \"Zakat\",\n \"profitAfterTax\": \"Profit After Tax\",\n \"netProfit\": \"Net Profit\",\n \"netOperatingCashFlow\": \"Net Operating Cash Flow\",\n \"depreciation\": \"Depreciation\",\n \"depreciationOfPropertyPlantEquipment\": \"Depreciation of Property, Plant & Equipment\",\n \"depreciationRightOfUseAssets\": \"Depreciation of Right of Use Assets\",\n \"depreciationOfInvestmentProperties\": \"Depreciation of Investment Properties\",\n \"depreciationOfInvestmentSecurities\": \"Depreciation of Investment Securities\",\n \"endOfYearCash\": \"End of Year Cash\",\n \"epfAccountHolderName\": \"Account Holder Name\",\n \"epfAccountHolderAddress\": \"Account Holder Address\",\n \"epfStatementYear\": \"Statement Year\",\n \"epfKwspMemberNumber\": \"KWSP Member Number\",\n \"epfIcNumber\": \"IC No.\",\n \"epfEmployerNumber\": \"Employer Number\",\n \"epfDateOfStatement\": \"Date Of Statement\",\n \"epfTotalContribution\": \"Total Contribution\",\n \"epfTotalCurrentContribution\": \"Total Current Contribution\",\n \"payslipEmployerName\": \"Employer Name\",\n \"payslipEmployeeName\": \"Employee Name\",\n \"payslipPayPeriod\": \"Pay Period\",\n \"payslipPayDate\": \"Pay Date\",\n \"payslipGrossPay\": \"Gross Pay\",\n \"payslipDeduction\": \"Deduction\",\n \"payslipEmployeeEpfContribution\": \"Employee EPF Contribution\",\n \"payslipEmployeeSocsoContribution\": \"Employee SOCSO Contribution\",\n \"payslipNetPay\": \"Net Pay\",\n \"incorporatedDate\": \"Incorporated Date\",\n \"companyName\": \"Company Name\",\n \"companyRegNo\": \"Company Registration No.\",\n \"ssmCompanyName\": \"Company Name (SSM)\",\n \"ssmCompanyRegNo\": \"Registration No. (SSM)\",\n \"ssmCompanyEntityType\": \"Entity Type (SSM)\",\n \"ssmPaidUpCapital\": \"Paid-Up Capital (SSM)\",\n \"businessCommencementDate\": \"Business Commencement Date\",\n \"businessNature\": \"Business Nature\",\n \"companyStatus\": \"Company Status\",\n \"shareholders\": \"Shareholders\",\n \"directors\": \"Directors\",\n \"previousDirectors\": \"Previous Directors\",\n \"totalShareIssued\": \"Total Shares Issued\",\n \"companyLastOldName\": \"Previous Company Name\",\n \"companyNameDateOfChange\": \"Company Name Change Date\",\n \"businessOrigin\": \"Business Origin\",\n \"registeredAddress\": \"Registered Address\",\n \"icName\": \"Name (IC)\",\n \"icNumber\": \"IC Number\",\n \"icAddress\": \"Address (IC)\",\n \"icGender\": \"Gender (IC)\",\n \"icReligion\": \"Religion (IC)\",\n \"icDateOfBirth\": \"Date of Birth (IC)\",\n \"icPlaceOfBirth\": \"Place of Birth (IC)\",\n \"icNationality\": \"Nationality (IC)\",\n \"icRace\": \"Race (IC)\"\n}\n","/*\n * IHS data processing functions.\n *\n * Pure data transformations for extracting structured detail and\n * file-field table data from raw IHS API responses. Used by both\n * finsys-client and finhub-adonisjs.\n */\n\nimport type { FieldData } from './survey-generator.js'\nimport {\n IhsValueFormat,\n FileFieldTableType,\n} from './ihs-types.js'\nimport type {\n IhsFieldDetail,\n IhsDetailCategory,\n FileFieldTableData,\n FileFieldTableItem,\n IhsFieldProvenance,\n DocumentRow,\n DocumentFileMetadata,\n InstanceRow,\n} from './ihs-types.js'\nimport { getBaseFieldSpecs, getBaseCategories, getBaseFieldSpecMap } from './catalogs.js'\nimport { getDocumentTypeGroups } from './document-types.js'\nimport type { TaggedFieldData } from './document-types.js'\nimport displayNamesData from './data/form-field-display-names.json' with { type: 'json' }\n\n// ── Display names ──────────────────────────────────────────────\n\nconst displayNames: Record<string, string> = displayNamesData as Record<string, string>\n\n/** Returns the full display name registry (extraction column → human label). */\nexport function getDisplayNames(): Record<string, string> {\n return displayNames\n}\n\n/** Looks up a display name. Falls back to camelCase → Title Case conversion. */\nexport function getDisplayName(fieldName: string): string {\n if (displayNames[fieldName]) return displayNames[fieldName]\n return fieldName\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (s) => s.toUpperCase())\n .trim()\n}\n\n// ── Time-period utilities ──────────────────────────────────────\n\nconst TIME_PERIOD_REGEX = /T(\\d+)$/\n\nexport function extractTimePeriods(columnNames: string[]): string[] {\n const periods = new Set<string>()\n for (const col of columnNames) {\n const match = TIME_PERIOD_REGEX.exec(col)\n if (match) periods.add(`T${match[1]}`)\n }\n return [...periods].sort((a, b) => {\n const numA = parseInt(a.slice(1), 10)\n const numB = parseInt(b.slice(1), 10)\n return numA - numB\n })\n}\n\nexport function groupColumnsByTimePeriod(\n columnNames: string[]\n): Record<string, Record<string, string>> {\n const groups: Record<string, Record<string, string>> = {}\n for (const col of columnNames) {\n const match = /^(.+?)(T\\d+)$/.exec(col)\n if (!match) continue\n const [, baseName, period] = match\n if (!groups[baseName]) groups[baseName] = {}\n groups[baseName][period] = col\n }\n return groups\n}\n\n// ── Field grouping ─────────────────────────────────────────────\n\n/**\n * Groups fields by their catalog-declared document_group (falling back to\n * the field's own name for anything untagged). Was a hardcoded, closed\n * prefix-matching table (FIELD_GROUP_PREFIXES) requiring a code edit for\n * every new document type; now reads the same document_group tag the\n * catalog already carries for document-types.ts, so adding a document\n * type is a catalog-only data change.\n */\nexport function groupFieldsByPattern(fields: FieldData[]): Record<string, FieldData[]> {\n const groups: Record<string, FieldData[]> = {}\n for (const field of fields) {\n if (!field.name) continue\n const groupName = (field as TaggedFieldData).document_group ?? field.name\n if (!groups[groupName]) groups[groupName] = []\n groups[groupName].push(field)\n }\n return groups\n}\n\n/**\n * Human-friendly display names for field groups (when a group combines\n * multiple fields), derived from document-types.ts's catalog-backed\n * registry instead of a hardcoded map.\n */\nlet cachedGroupDisplayNames: Record<string, string> | null = null\n\nexport function getGroupDisplayNames(): Record<string, string> {\n if (!cachedGroupDisplayNames) {\n const names: Record<string, string> = {}\n for (const group of getDocumentTypeGroups()) {\n names[group.documentGroup] = group.label\n }\n cachedGroupDisplayNames = names\n }\n return cachedGroupDisplayNames\n}\n\n// ── File-field table building ──────────────────────────────────\n\nfunction isNumericField(fieldName: string): boolean {\n const patterns = [\n 'balance',\n 'amount',\n 'credit',\n 'debit',\n 'total',\n 'revenue',\n 'cost',\n 'income',\n 'expense',\n 'liability',\n 'asset',\n 'equity',\n 'profit',\n 'loss',\n 'cash',\n 'tax',\n 'interest',\n ]\n const lower = fieldName.toLowerCase()\n return patterns.some((p) => lower.includes(p))\n}\n\nfunction formatValue(value: unknown, numeric: boolean): string {\n if (value === null || value === undefined || value === '') return '-'\n if (numeric) {\n const num = Number(value)\n if (!isNaN(num))\n return num.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })\n }\n return String(value)\n}\n\nfunction buildTableForGroup(\n groupName: string,\n fields: FieldData[],\n ihsData: Record<string, unknown>,\n fieldProvenance?: Record<string, IhsFieldProvenance>\n): FileFieldTableData | null {\n const allColumns: string[] = []\n for (const field of fields) {\n if (field.ihs_column_names) {\n allColumns.push(...field.ihs_column_names)\n }\n }\n if (allColumns.length === 0) return null\n\n const periods = extractTimePeriods(allColumns)\n const isTimeSeries = periods.length > 0\n const tableType = isTimeSeries ? FileFieldTableType.TIME_SERIES : FileFieldTableType.KEY_VALUE\n const groupDisplayName =\n getGroupDisplayNames()[groupName] || fields[0]?.displayName || getDisplayName(groupName)\n\n if (isTimeSeries) {\n const columnGroups = groupColumnsByTimePeriod(allColumns)\n const items: FileFieldTableItem[] = []\n\n for (const [baseName, periodMap] of Object.entries(columnGroups)) {\n const numeric = isNumericField(baseName)\n const data: Record<string, unknown> = {}\n const formattedData: Record<string, string> = {}\n const confidence: Record<string, number> = {}\n const provenance: Record<string, IhsFieldProvenance> = {}\n\n for (const period of periods) {\n const colName = periodMap[period]\n const value = colName ? (ihsData[colName] ?? null) : null\n data[period] = value\n formattedData[period] = formatValue(value, numeric)\n // SYS-2741: colName is the exact ihs_field_metadata key (incl. T{n} suffix).\n const prov = colName ? fieldProvenance?.[colName] : undefined\n if (prov) {\n provenance[period] = prov\n if (\n prov.origin === 'extracted' &&\n typeof prov.confidence === 'number' &&\n !Number.isNaN(prov.confidence)\n ) {\n confidence[period] = prov.confidence\n }\n }\n }\n\n items.push({\n displayName: getDisplayName(baseName),\n timePeriods: periods,\n data,\n formattedData,\n type: tableType,\n isNumeric: numeric,\n ...(Object.keys(confidence).length ? { confidence } : {}),\n ...(Object.keys(provenance).length ? { provenance } : {}),\n })\n }\n\n const hasData = items.some((item) =>\n Object.values(item.data).some((v) => v !== null && v !== undefined && v !== '')\n )\n return { name: groupName, displayName: groupDisplayName, type: tableType, items, hasData }\n } else {\n const items: FileFieldTableItem[] = []\n for (const colName of allColumns) {\n const value = ihsData[colName] ?? null\n const numeric = isNumericField(colName)\n // SYS-2741: single-doc columns (ssmCompanyName, companyName, icName, …) are\n // keyed directly in ihs_field_metadata — lit up here (the value-match interim\n // had to skip these because filename-based OCR lookup was unreliable).\n const prov = fieldProvenance?.[colName]\n items.push({\n displayName: getDisplayName(colName),\n timePeriods: [],\n data: { value },\n formattedData: { value: formatValue(value, numeric) },\n type: tableType,\n isNumeric: numeric,\n ...(prov &&\n prov.origin === 'extracted' &&\n typeof prov.confidence === 'number' &&\n !Number.isNaN(prov.confidence)\n ? { confidence: { value: prov.confidence } }\n : {}),\n ...(prov ? { provenance: { value: prov } } : {}),\n })\n }\n const hasData = items.some((item) => {\n const v = item.data['value']\n return v !== null && v !== undefined && v !== ''\n })\n return { name: groupName, displayName: groupDisplayName, type: tableType, items, hasData }\n }\n}\n\nexport function buildFileFieldTables(\n ihsData: Record<string, unknown>,\n fieldProvenance?: Record<string, IhsFieldProvenance>\n): Record<string, FileFieldTableData> {\n const specs = getBaseFieldSpecs()\n const fileFields = specs.filter((f) => f.type === 'file' && f.ihs_column_names?.length)\n const grouped = groupFieldsByPattern(fileFields)\n\n const tables: Record<string, FileFieldTableData> = {}\n for (const [groupName, fields] of Object.entries(grouped)) {\n const table = buildTableForGroup(groupName, fields, ihsData, fieldProvenance)\n if (table && table.hasData) {\n tables[groupName] = table\n }\n }\n return tables\n}\n\n// ── Instance-based field grouping (SYS-2886 / Phase 5) ──────────\n//\n// The catalog's T{n}-suffixed columns (bankBalanceT1..T6) declare a FIXED\n// cardinality per category -- at most 6 bank statements, 3 financial-year\n// slots, etc (buildFileFieldTables/groupColumnsByTimePeriod above are\n// bound to that fixed declaration). groupColumnsByInstance is the\n// unbounded counterpart: it takes the RAW sibling-table rows finsys-api\n// now exposes per category (SYS-2842's docInstanceStorageService -- one\n// row per uploaded document, keyed by a real instanceKey, not a\n// pre-declared T{n} slot) and groups them by base metric name, with one\n// column per ROW rather than per pre-declared period.\n//\n// Deliberately requires NO new catalog entries: every T{n} slot for a\n// given category declares the identical base column names (verified\n// across bank_statement_t1..t6 and the analogous financial/epf/payslip\n// entries), so the base names are derived by stripping the existing\n// suffixed specs' ihs_column_names rather than duplicating them in the\n// catalog. The 129 T{n}-suffixed wide-table columns and their catalog\n// entries stay exactly as they are (frozen, not migrated, per the\n// epic's Phase 6 scope) -- this is purely additive.\n\n/**\n * Human label for one instance column: \"Mar 2026 · Maybank\" when a\n * sourceLabel is known, else the bare period/instanceKey.\n */\nfunction instanceColumnLabel(row: InstanceRow): string {\n const period = row.timePeriod || row.instanceKey\n return row.sourceLabel ? `${period} · ${row.sourceLabel}` : period\n}\n\n/**\n * Adversarial-review finding (Phase 5): instanceColumnLabel is NOT\n * collision-free -- two distinct rows (distinct instanceKey) can share\n * the same timePeriod + sourceLabel (e.g. two same-bank, same-month\n * statements, or any row lacking sourceLabel that shares a period).\n * Since every consumer keys data/confidence/provenance BY this label\n * (matching FileFieldTableItem's existing contract, where timePeriods'\n * entries are literal object keys into `data`), an undisambiguated\n * collision doesn't just look wrong -- it silently drops one row's\n * value entirely (last-write-wins into the same object key) while\n * `timePeriods` keeps a duplicate entry pointing at the SURVIVING row's\n * value twice. Disambiguates by appending \"(2)\", \"(3)\", ... to every\n * occurrence after the first, keeping the common (non-colliding) case's\n * label exactly as before. Both groupColumnsByInstance and\n * buildInstanceTable call this SAME function on the SAME instanceRows\n * array (never the raw per-row instanceColumnLabel directly), so the\n * two independently-computed label lists always agree with each other.\n */\nfunction instanceColumnLabels(rows: InstanceRow[]): string[] {\n const seenCounts = new Map<string, number>()\n return rows.map((row) => {\n const raw = instanceColumnLabel(row)\n const occurrence = (seenCounts.get(raw) ?? 0) + 1\n seenCounts.set(raw, occurrence)\n return occurrence === 1 ? raw : `${raw} (${occurrence})`\n })\n}\n\n/**\n * Groups instance rows by base metric name -- the unbounded analog of\n * groupColumnsByTimePeriod. `baseColumnNames` is the category's base\n * (unsuffixed) field list; each returned group maps instance column\n * label -> that metric's value on that row. Labels are disambiguated\n * (see instanceColumnLabels) so two rows can never collide into the\n * same key.\n */\nexport function groupColumnsByInstance(\n baseColumnNames: string[],\n instanceRows: InstanceRow[]\n): Record<string, Record<string, unknown>> {\n const groups: Record<string, Record<string, unknown>> = {}\n for (const baseName of baseColumnNames) {\n groups[baseName] = {}\n }\n if (!instanceRows?.length) return groups\n const labels = instanceColumnLabels(instanceRows)\n instanceRows.forEach((row, i) => {\n const label = labels[i]\n for (const baseName of baseColumnNames) {\n if (Object.prototype.hasOwnProperty.call(row, baseName)) {\n groups[baseName][label] = row[baseName]\n }\n }\n })\n return groups\n}\n\n/**\n * Instance-based counterpart to buildFileFieldTables: builds one table\n * per category present in `instancesByCategory`, with one column per\n * instance row (unbounded) instead of one column per pre-declared T{n}\n * slot. Categories absent from `instancesByCategory` are simply skipped\n * -- callers merge this output with buildFileFieldTables' own (or use it\n * standalone once a category has fully cut over).\n *\n * Provenance stays keyed the legacy way (`${baseName}${timePeriod}`, per\n * the epic's established SYS-2842 rule that @finsys/core's exact-string\n * lookup can't change format without a coordinated release) -- so only\n * instances whose timePeriod maps onto a legacy T{n} slot carry a\n * confidence dot; instances beyond that (the very capability this\n * function exists for) simply render with no confidence, same limitation\n * buildFileFieldTables already has today for anything past T6.\n */\nfunction buildInstanceTable(\n groupName: string,\n baseNames: string[],\n groupDisplayName: string,\n instanceRows: InstanceRow[],\n fieldProvenance?: Record<string, IhsFieldProvenance>\n): FileFieldTableData | null {\n const columnGroups = groupColumnsByInstance(baseNames, instanceRows)\n const instanceLabels = instanceColumnLabels(instanceRows)\n\n const items: FileFieldTableItem[] = []\n for (const [baseName, labelMap] of Object.entries(columnGroups)) {\n const hasAny = Object.values(labelMap).some((v) => v !== null && v !== undefined && v !== '')\n if (!hasAny) continue\n\n const numeric = isNumericField(baseName)\n const data: Record<string, unknown> = {}\n const formattedData: Record<string, string> = {}\n const confidence: Record<string, number> = {}\n const provenance: Record<string, IhsFieldProvenance> = {}\n\n for (const [i, row] of instanceRows.entries()) {\n const label = instanceLabels[i]\n const value = labelMap[label] ?? null\n data[label] = value\n formattedData[label] = formatValue(value, numeric)\n\n const legacyKey = row.timePeriod ? `${baseName}${row.timePeriod}` : undefined\n const prov = legacyKey ? fieldProvenance?.[legacyKey] : undefined\n if (prov) {\n provenance[label] = prov\n if (\n prov.origin === 'extracted' &&\n typeof prov.confidence === 'number' &&\n !Number.isNaN(prov.confidence)\n ) {\n confidence[label] = prov.confidence\n }\n }\n }\n\n items.push({\n displayName: getDisplayName(baseName),\n timePeriods: instanceLabels,\n data,\n formattedData,\n type: FileFieldTableType.TIME_SERIES,\n isNumeric: numeric,\n ...(Object.keys(confidence).length ? { confidence } : {}),\n ...(Object.keys(provenance).length ? { provenance } : {}),\n })\n }\n\n const hasData = items.some((item) =>\n Object.values(item.data).some((v) => v !== null && v !== undefined && v !== '')\n )\n if (!items.length || !hasData) return null\n\n return {\n name: groupName,\n displayName: groupDisplayName,\n type: FileFieldTableType.TIME_SERIES,\n items,\n hasData,\n }\n}\n\n/**\n * Explicit base-column declaration for a category with NO catalog `file`\n * spec -- e.g. invoice (SYS-2842 Phase 3), which was deliberately never\n * registered in form-field-base-specs.json because getDocumentTypeGroups()\n * is shared with resolveExtractionStatus, which assumes a category's wide-\n * table columns exist to check \"is this populated\" against -- invoice has\n * none (sibling-table only, no wideTableMirror). Registering it there would\n * silently break resolveExtractionStatus's invoice status reporting. This\n * override lets a category be instance-rendered without entering that\n * shared registry at all.\n */\nexport interface CategorySpec {\n displayName: string\n baseColumnNames: string[]\n}\n\nexport function buildFileFieldTablesFromInstances(\n instancesByCategory: Record<string, InstanceRow[]> = {},\n fieldProvenance?: Record<string, IhsFieldProvenance>,\n categoryOverrides?: Record<string, CategorySpec>\n): Record<string, FileFieldTableData> {\n const specs = getBaseFieldSpecs()\n const fileFields = specs.filter((f) => f.type === 'file' && f.ihs_column_names?.length)\n const grouped = groupFieldsByPattern(fileFields)\n\n const tables: Record<string, FileFieldTableData> = {}\n\n for (const [groupName, fields] of Object.entries(grouped)) {\n const instanceRows = instancesByCategory[groupName]\n if (!instanceRows?.length) continue\n\n const baseNames = new Set<string>()\n for (const field of fields) {\n for (const col of field.ihs_column_names ?? []) {\n baseNames.add(col.replace(TIME_PERIOD_REGEX, ''))\n }\n }\n const groupDisplayName =\n getGroupDisplayNames()[groupName] || fields[0]?.displayName || getDisplayName(groupName)\n\n const table = buildInstanceTable(\n groupName, [...baseNames], groupDisplayName, instanceRows, fieldProvenance\n )\n if (table) tables[groupName] = table\n }\n\n for (const [groupName, spec] of Object.entries(categoryOverrides ?? {})) {\n if (Object.prototype.hasOwnProperty.call(tables, groupName)) continue // catalog-derived takes precedence\n const instanceRows = instancesByCategory[groupName]\n if (!instanceRows?.length) continue\n\n const table = buildInstanceTable(\n groupName, spec.baseColumnNames, spec.displayName, instanceRows, fieldProvenance\n )\n if (table) tables[groupName] = table\n }\n\n return tables\n}\n\n// ── Documents table (SYS-2766) ─────────────────────────────────\n//\n// Presentation-agnostic model of the per-document table on the IHS detail page.\n// Absorbs the doc-type maps/rules FinHub used to own inline so FinHub and\n// finsys-client render the SAME table. Pure transform: file metadata is attached\n// upstream by finsys-api (the `documentMetadata` sibling map, SYS-2765).\n\n/** IHS doc-field key → human label. Its keys drive which fields become sections. */\nconst DOC_DISPLAY_NAMES: Record<string, string> = {\n bankStatements: 'Bank Statements',\n financialStatements: 'Financial Statements',\n form9: 'Form 9',\n epfStatements: 'EPF Statements',\n payslips: 'Payslips',\n ssm: 'SSM Company Profile',\n ic: 'Identity Card',\n ssm_registration_documents: 'Form 9',\n ic_documents: 'Identity Documents (Supplementary)',\n consentForm: 'Consent Form',\n supplementaryDoc: 'Supplementary Documents',\n coreIncomeDoc: 'Core Income Document',\n incomeSupportingDoc: 'Income Supporting Document',\n incomeEPF_iakaun: 'EPF i-Akaun',\n photocopyRegistrationCard: 'Registration Card',\n bankStatementOrSavingPassbook: 'Bank Passbook',\n tnbBills: 'TNB Bills',\n}\n\n/** Doc types finsys-api can run extraction on (→ re-extract / view-JSON eligible). */\nconst EXTRACTABLE_DOC_TYPES = new Set<string>([\n 'bankStatements',\n 'financialStatements',\n 'form9',\n 'epfStatements',\n 'payslips',\n 'ssm',\n 'ic',\n 'ssm_registration_documents',\n 'ic_documents',\n])\n\n/** Doc types that accept a replacement upload (SYS-2229 — finsys-api ignores the rest). */\nconst REUPLOADABLE_DOC_TYPES = new Set<string>(['bankStatements', 'financialStatements'])\n\n/** IHS doc-field key → human label (the fields that become document sections). */\nexport function getDocDisplayNames(): Record<string, string> {\n return DOC_DISPLAY_NAMES\n}\n\n/** Doc types eligible for extraction (re-extract / view-JSON). */\nexport function getExtractableDocTypes(): Set<string> {\n return EXTRACTABLE_DOC_TYPES\n}\n\n/** Doc types eligible for a replacement upload. */\nexport function getReuploadableDocTypes(): Set<string> {\n return REUPLOADABLE_DOC_TYPES\n}\n\n/** Heuristic: does a string look like an opaque id (UUID / long hex), not a real name? */\nfunction isProbablyId(str?: string | null): boolean {\n if (!str) return false\n const clean = str.split('.')[0] // ignore extension\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(clean)) return true\n if (/^[0-9a-f]{32,128}$/i.test(clean)) return true\n return false\n}\n\ninterface ParsedDocFile {\n path?: string\n fileName?: string\n documentId?: string\n fileSize?: number | string\n fileType?: string\n createdAt?: string\n month?: number\n year?: number\n}\n\n/**\n * Parse one IHS doc field into file entries. Handles the shapes the field takes:\n * a JSON-array string (bank/financial/…, possibly inline-enriched like\n * supplementaryDoc), an already-parsed array, or a bare URL string (ssm/form9/ic).\n */\nexport function parseFileField(value: unknown): ParsedDocFile[] {\n if (!value) return []\n if (Array.isArray(value)) return value as ParsedDocFile[]\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value)\n return Array.isArray(parsed) ? (parsed as ParsedDocFile[]) : []\n } catch {\n // Plain URL string (form9, ssm, ic) — wrap as a single entry.\n if (value.startsWith('http')) {\n return [{ path: value, documentId: value.split('/').pop() || undefined }]\n }\n return []\n }\n }\n return []\n}\n\nfunction toBytes(value: unknown): number | null {\n if (typeof value === 'number') return Number.isNaN(value) ? null : value\n if (typeof value === 'string') {\n const n = parseInt(value, 10)\n return Number.isNaN(n) ? null : n\n }\n return null\n}\n\n/**\n * Build the presentation-agnostic document rows for an IHS. Reads the doc fields\n * named in DOC_DISPLAY_NAMES + the `documentMetadata` sibling map (SYS-2765) and\n * emits a flat DocumentRow[] (all sections, in DOC_DISPLAY_NAMES order). Metadata\n * is taken inline off the entry first (supplementaryDoc is enriched inline), then\n * from `documentMetadata[path]`.\n */\nexport function buildDocumentRows(ihsData: Record<string, unknown>): DocumentRow[] {\n const metaMap = (ihsData.documentMetadata ?? {}) as Record<string, DocumentFileMetadata>\n const rows: DocumentRow[] = []\n\n for (const docType of Object.keys(DOC_DISPLAY_NAMES)) {\n const files = parseFileField(ihsData[docType])\n if (files.length === 0) continue\n\n const label = DOC_DISPLAY_NAMES[docType]\n const extractable = EXTRACTABLE_DOC_TYPES.has(docType)\n const reUploadable = extractable && REUPLOADABLE_DOC_TYPES.has(docType)\n\n files.forEach((file, index) => {\n const path = file.path ?? null\n const meta = path ? metaMap[path] : undefined\n\n const documentId = file.documentId || (path ? path.split('/').pop() || null : null)\n const timePeriod = file.month ? `T${file.month}` : file.year ? `T${file.year}` : 'ALL'\n\n const rawName = file.fileName ?? meta?.fileName ?? undefined\n const fileName = rawName && !isProbablyId(rawName) ? rawName : null\n\n const rawExt = (rawName ?? '').split('.').pop()\n const ext =\n rawExt && rawExt.length <= 5 && !isProbablyId(rawExt) ? rawExt.toUpperCase() : null\n const mime = file.fileType ?? meta?.fileType\n const fileType = ext || (mime?.split('/').pop()?.toUpperCase() ?? null)\n\n const fileSize = toBytes(file.fileSize) ?? meta?.fileSize ?? null\n const uploadedAt = file.createdAt ?? meta?.createdAt ?? null\n\n const periodLabel =\n file.month && file.year\n ? new Date(file.year, file.month - 1).toLocaleDateString('en-MY', {\n year: 'numeric',\n month: 'short',\n })\n : file.year\n ? `Year ${file.year}`\n : null\n\n const displayName =\n fileName ||\n (periodLabel\n ? `${label} — ${periodLabel}`\n : files.length > 1\n ? `${label} ${index + 1}`\n : label)\n\n rows.push({\n docType,\n label,\n index,\n displayName,\n documentId,\n path,\n timePeriod,\n periodLabel,\n fileName,\n fileType,\n fileSize,\n uploadedAt,\n capabilities: {\n download: !!documentId,\n viewJson: extractable,\n reExtract: extractable,\n reUpload: reUploadable,\n },\n })\n })\n }\n\n return rows\n}\n\n// ── Documents-table cell formatters (empty-state rules live here) ──\n// Single source for the Type / Size / Uploaded strings so FinHub + finsys-client\n// render identical cells (em-dash on unknown).\n\nconst EM_DASH = '—'\n\n/** Type column: the resolved type label, or em-dash. */\nexport function formatDocumentType(row: Pick<DocumentRow, 'fileType'>): string {\n return row.fileType ?? EM_DASH\n}\n\n/** Size column: human bytes (B / KB / MB), or em-dash when unknown. */\nexport function formatDocumentSize(bytes: number | null | undefined): string {\n if (!bytes || Number.isNaN(bytes)) return EM_DASH\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\n/** Uploaded column: the upload date, else the period label, else em-dash. */\nexport function formatDocumentUploaded(\n row: Pick<DocumentRow, 'uploadedAt' | 'periodLabel'>\n): string {\n if (row.uploadedAt) {\n const d = new Date(row.uploadedAt)\n if (!Number.isNaN(d.getTime())) {\n return d.toLocaleDateString('en-MY', { year: 'numeric', month: 'short', day: 'numeric' })\n }\n }\n return row.periodLabel ?? EM_DASH\n}\n\n// ── IHS detail processing ──────────────────────────────────────\n\nfunction isFileOrFinancialColumn(fieldName: string, fileColumnSet: Set<string>): boolean {\n return (\n fileColumnSet.has(fieldName) ||\n fieldName.startsWith('financials') ||\n fieldName.startsWith('bank_statement')\n )\n}\n\n\nfunction inferValueFormat(fieldName: string, value: unknown): IhsValueFormat {\n const currencyFields = new Set([\n 'totalFinancing',\n 'monthlyGrossIncome',\n 'approvedAmount',\n 'monthlyInstallment',\n ])\n if (currencyFields.has(fieldName)) return IhsValueFormat.CURRENCY\n\n const numberFields = new Set([\n 'age',\n 'noOfDependants',\n 'financingTenure',\n 'ihsId',\n 'programId',\n 'borrowerAgentId',\n ])\n if (numberFields.has(fieldName)) return IhsValueFormat.NUMBER\n\n const tableFields = new Set(['shareholders', 'directors', 'previousDirectors'])\n if (tableFields.has(fieldName)) return IhsValueFormat.TABLE\n\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) return IhsValueFormat.DATE\n\n return IhsValueFormat.STRING\n}\n\nconst EXCLUDED_FIELDS = new Set([\n 'updatedAt',\n 'programIds',\n 'borrowerAgentId',\n 'programId',\n '__v',\n '_id',\n 'id',\n])\n\nexport function processIhsDetails(ihsData: Record<string, unknown>): IhsFieldDetail[] {\n const specs = getBaseFieldSpecs()\n const fileColumnSet = new Set<string>()\n for (const field of specs) {\n if (field.type === 'file') {\n if (field.name) fileColumnSet.add(field.name)\n if (field.ihs_column_names) {\n for (const col of field.ihs_column_names) {\n fileColumnSet.add(col)\n }\n }\n }\n }\n\n const specMap = getBaseFieldSpecMap()\n const categories = getBaseCategories()\n const categoryNameMap: Record<string, string> = {}\n for (const cat of categories) {\n categoryNameMap[String(cat.id)] = cat.name\n }\n\n const details: IhsFieldDetail[] = []\n\n for (const [key, value] of Object.entries(ihsData)) {\n if (value === null || value === undefined || value === '' || value === 'Not Specified') continue\n if (value === false) continue\n if (EXCLUDED_FIELDS.has(key)) continue\n if (isFileOrFinancialColumn(key, fileColumnSet)) continue\n\n const spec = specMap.get(key)\n const categoryId = spec?.category ? String(spec.category) : '0'\n const category = categoryNameMap[categoryId] || 'General'\n\n details.push({\n name: key,\n displayName: getDisplayName(key),\n category,\n value,\n valueFormat: inferValueFormat(key, value),\n })\n }\n\n return details\n}\n\nexport function groupDetailsByCategory(details: IhsFieldDetail[]): IhsDetailCategory[] {\n const groups: Record<string, IhsFieldDetail[]> = {}\n for (const detail of details) {\n if (!groups[detail.category]) groups[detail.category] = []\n groups[detail.category].push(detail)\n }\n\n return Object.entries(groups)\n .filter(([cat]) => cat !== 'Default Category' && cat !== 'General')\n .map(([category, items]) => ({\n category,\n items: items.map((d) => ({\n name: d.name,\n displayName: d.displayName,\n value: d.value,\n valueFormat: d.valueFormat,\n })),\n }))\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Program access roles — shared across finsys-api and finhub-adonisjs.\n * Values must match the database enum column in the `programaccess` table.\n */\nexport enum Role {\n ADMIN = 'Admin',\n BORROWER_AGENT = 'Borrower Agent',\n LENDER_AGENT = 'Lender Agent',\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Status of a document extraction job.\n * Used by finsys-api (writes) and finhub/finsys-client (reads/displays).\n */\nexport enum ExtractionJobStatus {\n Queued = 'queued',\n Processing = 'processing',\n Succeeded = 'succeeded',\n Failed = 'failed',\n}\n\n/**\n * Document types that go through FinXtract extraction. Values must match\n * the `type` field on finsys-api's File entity and the config keys in\n * finXtractApi.api.\n *\n * Was a closed enum (FinancialStatement/BankStatement/Epf/Payslip/Ssm/\n * Form9/Ic) requiring a core release to add a new document type, even\n * though nothing outside finsys-api's own request validation actually\n * needed it to be a closed set (confirmed: zero external consumers\n * import a specific member by name). Now an open string, matching the\n * AdapterCategory precedent (SYS-2500) -- the authoritative set of valid\n * values lives in document-types.ts, derived from the field-spec catalog.\n * Use isDocumentType()/assertDocumentType() from document-types.ts for\n * the runtime validation that used to be the enum's job.\n */\nexport type ExtractionFileType = string\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * IHS application status — canonical source of truth, mirroring finsys-api's\n * `IHS_STATUS` enum and `allowedIhsStatus` list in src/utils/appHelper.ts.\n *\n * finsys-api originates these values (it writes them to the `ihs.status`\n * column). Consumer apps (finhub-adonisjs, finsys-client) read them off the\n * wire and use them for validation and display.\n *\n * Lender rejection is not represented by a distinct status: when a lender\n * rejects an application, finsys-api transitions the record back to\n * `APPLICATION_FINALIZED` from `LENDER_EVALUATION`.\n *\n * `EditingApplication` (SYS-2806) is a lender-scoped detour off\n * `LenderEvaluation` for manually editing extracted field values — not\n * reachable from `ApplicationFinalized`. A lender toggles into it and back\n * out to `LenderEvaluation`; it never appears on a record no lender has\n * claimed. See finsys-api's `updateIhsStatusByLender` for the transition\n * guard.\n */\nexport enum IhsStatus {\n CreatingApplication = 'CREATING_APPLICATION',\n ApplicationFinalized = 'APPLICATION_FINALIZED',\n LenderEvaluation = 'LENDER_EVALUATION',\n EditingApplication = 'EDITING_APPLICATION',\n Approved = 'APPROVED',\n LouDelivered = 'LOU_DELIVERED',\n AwaitingDisbursement = 'AWAITING_DISBURSEMENT',\n Disbursement = 'DISBURSEMENT',\n Declined = 'DECLINED',\n Expired = 'EXPIRED',\n Canceled = 'CANCELED',\n}\n\n/**\n * All valid IHS status values, in display order (earliest lifecycle stage\n * first, terminal states last).\n */\nexport const IHS_VALID_STATUSES: readonly IhsStatus[] = [\n IhsStatus.CreatingApplication,\n IhsStatus.ApplicationFinalized,\n IhsStatus.LenderEvaluation,\n IhsStatus.EditingApplication,\n IhsStatus.Approved,\n IhsStatus.LouDelivered,\n IhsStatus.AwaitingDisbursement,\n IhsStatus.Disbursement,\n IhsStatus.Declined,\n IhsStatus.Expired,\n IhsStatus.Canceled,\n] as const\n\n/**\n * Terminal statuses — the application lifecycle has completed and no further\n * transitions are expected. Useful for suppressing action UI (e.g. re-extract,\n * status update controls) on the application detail view.\n */\nexport const IHS_TERMINAL_STATUSES: readonly IhsStatus[] = [\n IhsStatus.Disbursement,\n IhsStatus.Declined,\n IhsStatus.Expired,\n IhsStatus.Canceled,\n] as const\n\n/**\n * Failure statuses — a subset of terminal statuses that represent an\n * unsuccessful outcome. Useful for badge colour / messaging.\n */\nexport const IHS_FAILURE_STATUSES: readonly IhsStatus[] = [\n IhsStatus.Declined,\n IhsStatus.Expired,\n IhsStatus.Canceled,\n] as const\n\n/**\n * Type guard: narrows an unknown value to `IhsStatus` iff it is one of the\n * canonical status strings.\n */\nexport function isValidIhsStatus(status: unknown): status is IhsStatus {\n return (\n typeof status === 'string' &&\n (IHS_VALID_STATUSES as readonly string[]).includes(status)\n )\n}\n\n/**\n * Type guard: terminal (no further transitions expected).\n */\nexport function isTerminalIhsStatus(status: unknown): status is IhsStatus {\n return (\n typeof status === 'string' &&\n (IHS_TERMINAL_STATUSES as readonly string[]).includes(status)\n )\n}\n\n/**\n * Type guard: terminal and unsuccessful.\n */\nexport function isFailureIhsStatus(status: unknown): status is IhsStatus {\n return (\n typeof status === 'string' &&\n (IHS_FAILURE_STATUSES as readonly string[]).includes(status)\n )\n}\n","/*\n * Extraction status resolution.\n *\n * Determines per-document extraction status from IHS record data\n * and optional extraction job records. Pure synchronous function —\n * no HTTP, no async, trivially testable.\n *\n * For multi-file document types (bank statements, financial statements,\n * EPF, payslips), produces one result per time period (T1, T2, …).\n * For single-file types (SSM, Form 9, IC), produces one result.\n */\n\nimport { ExtractionFileType, ExtractionJobStatus } from './extraction.js'\nimport { getDocumentTypeGroups } from './document-types.js'\nimport type { FieldData } from './survey-generator.js'\n\n// ── Types ──────────────────────────────────────────────────\n\nexport enum DocExtractionStatus {\n NotUploaded = 'not_uploaded',\n Uploaded = 'uploaded',\n Queued = 'queued',\n Processing = 'processing',\n Extracted = 'extracted',\n Failed = 'failed',\n Unknown = 'unknown',\n}\n\nexport interface ExtractionJobRecord {\n fileType: string\n status: string\n errorMessage?: string | null\n}\n\nexport interface DocExtractionResult {\n fileType: ExtractionFileType\n status: DocExtractionStatus\n displayName: string\n populatedColumns: string[]\n totalColumns: number\n errorMessage?: string | null\n}\n\nexport interface ExtractionStatusResult {\n documents: DocExtractionResult[]\n summary: {\n total: number\n extracted: number\n failed: number\n pending: number\n notUploaded: number\n }\n}\n\n// ── Helpers ────────────────────────────────────────────────\n\nfunction isPopulated(value: unknown): boolean {\n if (value === null || value === undefined || value === '') return false\n if (value === 'Not Specified') return false\n return true\n}\n\nfunction countUploadedFiles(ihsRecord: Record<string, unknown>, aggregateKey: string): number {\n const raw = ihsRecord[aggregateKey]\n if (!raw) return 0\n\n // JSON array string (multi-file types like bankStatements)\n if (typeof raw === 'string') {\n try {\n const parsed = JSON.parse(raw)\n if (Array.isArray(parsed)) return parsed.length\n } catch {\n // Plain URL string (single-file type) — count as 1\n return 1\n }\n }\n\n if (Array.isArray(raw)) return raw.length\n\n // Single object or URL string\n return 1\n}\n\nfunction hasUploadedFile(\n fields: FieldData[],\n ihsRecord: Record<string, unknown>,\n aggregateKey: string\n): boolean {\n if (countUploadedFiles(ihsRecord, aggregateKey) > 0) return true\n\n // Fall back to individual field names for single-file types (ssm, form9, ic)\n return fields.some((field) => {\n if (!field.name) return false\n return isPopulated(ihsRecord[field.name])\n })\n}\n\nfunction getPopulatedColumns(\n columns: string[],\n ihsRecord: Record<string, unknown>\n): string[] {\n return columns.filter((col) => isPopulated(ihsRecord[col]))\n}\n\n/**\n * Resolve status for a single document (one field / one time period).\n */\nfunction resolveDocStatus(\n columns: string[],\n ihsRecord: Record<string, unknown>,\n uploaded: boolean,\n jobRecord: ExtractionJobRecord | undefined,\n hasJobRecords: boolean\n): { status: DocExtractionStatus; errorMessage?: string | null } {\n const populated = getPopulatedColumns(columns, ihsRecord)\n const hasExtractedData = populated.length > 0\n\n let status: DocExtractionStatus\n let errorMessage: string | null | undefined\n\n if (!uploaded) {\n status = DocExtractionStatus.NotUploaded\n } else if (hasJobRecords) {\n if (jobRecord) {\n if (jobRecord.status === ExtractionJobStatus.Queued) {\n status = DocExtractionStatus.Queued\n } else if (jobRecord.status === ExtractionJobStatus.Processing) {\n status = DocExtractionStatus.Processing\n } else if (jobRecord.status === ExtractionJobStatus.Failed) {\n if (hasExtractedData) {\n status = DocExtractionStatus.Extracted\n errorMessage = jobRecord.errorMessage\n } else {\n status = DocExtractionStatus.Failed\n errorMessage = jobRecord.errorMessage\n }\n } else if (jobRecord.status === ExtractionJobStatus.Succeeded || hasExtractedData) {\n status = DocExtractionStatus.Extracted\n } else {\n status = DocExtractionStatus.Uploaded\n }\n } else if (hasExtractedData) {\n status = DocExtractionStatus.Extracted\n } else {\n status = DocExtractionStatus.Uploaded\n }\n } else if (hasExtractedData) {\n status = DocExtractionStatus.Extracted\n } else {\n status = DocExtractionStatus.Unknown\n }\n\n return { status, errorMessage }\n}\n\n// ── Main function ──────────────────────────────────────────\n\n/**\n * Determines per-document extraction status from IHS record data.\n *\n * For multi-file document types (bank statements, financial statements, EPF,\n * payslips) the result contains one entry per uploaded file, indexed in the\n * same order as the files appear in the IHS record's aggregate array.\n * For single-file types (SSM, Form 9, IC) there is one entry.\n *\n * @param ihsRecord - The IHS application record (any shape satisfying Record<string, unknown>)\n * @param jobRecords - Extraction job records for this IHS. Pass the array (even if empty)\n * when job records were fetched. Omit or pass undefined when job records are unavailable;\n * this produces `Unknown` status for uploaded-but-unextracted documents rather than `Uploaded`.\n */\nexport function resolveExtractionStatus(\n ihsRecord: Record<string, unknown>,\n jobRecords?: ExtractionJobRecord[]\n): ExtractionStatusResult {\n const documents: DocExtractionResult[] = []\n const hasJobRecords = jobRecords !== undefined\n\n for (const group of getDocumentTypeGroups()) {\n const fileType = group.documentType\n const fields = group.fields\n const displayName = group.label\n\n const uploadedCount = countUploadedFiles(ihsRecord, fileType)\n const isUploaded = uploadedCount > 0 || fields.some((f) => f.name && isPopulated(ihsRecord[f.name]))\n\n // For multi-file types, match job records by fileType (there can be multiple)\n const matchingJobs = jobRecords?.filter((j) => j.fileType === fileType) ?? []\n\n if (fields.length <= 1) {\n // Single-file type (ssm, form9, ic): one result\n const field = fields[0]\n const columns = field?.ihs_column_names ?? []\n const populated = getPopulatedColumns(columns, ihsRecord)\n const { status, errorMessage } = resolveDocStatus(\n columns, ihsRecord, isUploaded, matchingJobs[0], hasJobRecords\n )\n\n documents.push({\n fileType,\n status,\n displayName,\n populatedColumns: populated,\n totalColumns: columns.length,\n errorMessage,\n })\n } else {\n // Multi-file type (bank statements T1-T6, etc.): one result per uploaded file.\n // Fields are sorted by name (bank_statement_t1, t2, …) so idx aligns with\n // the file array order in the IHS record.\n const count = Math.max(uploadedCount, 1)\n for (let idx = 0; idx < count; idx++) {\n const field = fields[idx]\n const columns = field?.ihs_column_names ?? []\n const populated = getPopulatedColumns(columns, ihsRecord)\n const fileUploaded = idx < uploadedCount\n const { status, errorMessage } = resolveDocStatus(\n columns, ihsRecord, fileUploaded, matchingJobs[idx], hasJobRecords\n )\n\n documents.push({\n fileType,\n status,\n displayName,\n populatedColumns: populated,\n totalColumns: columns.length,\n errorMessage,\n })\n }\n }\n }\n\n const summary = documents.reduce(\n (acc, d) => {\n if (d.status === DocExtractionStatus.Extracted) acc.extracted++\n else if (d.status === DocExtractionStatus.Failed) acc.failed++\n else if (d.status === DocExtractionStatus.NotUploaded) acc.notUploaded++\n else acc.pending++\n return acc\n },\n { total: documents.length, extracted: 0, failed: 0, pending: 0, notUploaded: 0 }\n )\n\n return { documents, summary }\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Source Adapter contract — the framework for ingesting unstructured\n * or partner-specific inputs and producing canonical field values that\n * the eval engine + CRA report consume.\n *\n * The contract has no vendor-specific knowledge. Generic categories\n * (telco-carrier, payment-network, document-extractor, social-presence,\n * …) are declared here; specific vendor implementations live OUTSIDE\n * this open-source package, in private extension directories loaded\n * by the host app at runtime (see SYS-2444 plugin discovery).\n *\n * Design notes:\n * - extract() is async — every real adapter does I/O (HTTP, OCR, LLM).\n * - Errors are thrown as `AdapterError` instances. We DELIBERATELY\n * don't use a Result<> type — the rest of finsys-core uses throw/\n * catch, and bringing a Result idiom in for one subsystem creates\n * dialect inconsistency.\n * - The contract makes no statement about persistence. The host app's\n * adapter runner catches the return value, persists canonical fields\n * + raw payload to the storage tables (SYS-2441), and writes\n * provenance to `ihs_extraction_runs`. Adapters are pure functions\n * of (raw payload) → (canonical fields). This separation lets\n * adapters be swapped, replayed, and tested without DB state.\n */\n\nimport type { AdapterCategory, CanonicalFieldName } from \"./adapter-categories.js\";\n\n/**\n * An adapter receives a raw payload — opaque to the framework. The\n * shape is whatever the vendor's source produces: a JSON object from a\n * partner API, a base64 PDF blob, a web-scrape result. Vendor adapters\n * narrow this type internally. The host app's adapter runner is\n * responsible for putting the bytes/structure in front of the adapter;\n * what those bytes are is the adapter's problem.\n */\nexport type RawPayload = unknown;\n\n/**\n * Canonical field values produced by an adapter for ONE instance.\n * Keys MUST be drawn from the field set declared by the adapter's\n * category (see `categoryFieldsOf` in adapter-categories.ts). Values\n * are typed narrowly per field by the category schema; this loose TS\n * type is runtime-validated against the category schema by the host\n * app at registration time, AND at every extract() call result.\n *\n * The framework rejects:\n * - Field names not declared by the adapter's category\n * - Values whose runtime type doesn't match the category schema\n *\n * Adapters MAY return a partial set — not every category field has to\n * be produced on every applicant (telco fields may be absent if the\n * borrower didn't opt in, for instance). Missing fields are aggregated\n * as zero / null in the eval engine; that's a feature, not a defect.\n */\nexport type CanonicalFieldValues = Partial<Record<CanonicalFieldName, CanonicalFieldValue>>;\n\n/**\n * One extraction \"instance\" — the framework supports multi-instance\n * per applicant per adapter. Examples:\n * - 6 bank statements from one bank (one adapter call, 6 instances)\n * - 12 monthly payment-summary snapshots from one payment network\n * - 3 mobile lines from one telco carrier\n *\n * For multi-VENDOR cases (3 different telco carriers), use separate\n * adapter registrations — each vendor is its own SourceAdapter with\n * its own id. For multi-INSTANCE-from-one-vendor (6 statements from\n * one bank), the adapter returns multiple AdapterExtraction entries\n * in a single extract() call.\n *\n * `instanceKey` is the within-adapter discriminator: free-form, but\n * MUST be stable across re-extractions so the storage layer can\n * replace-in-place rather than accumulating duplicates. Conventions:\n * - For periodic data: encode the period (`'2026-Q1'`, `'2026-03'`)\n * - For per-line data: encode the line id (`'msisdn-60123456789'`,\n * `'card-last4-1234'`)\n * - For natively single-instance adapters: use the empty string `''`\n * (the framework treats `''` as \"this adapter only ever has one\n * instance per applicant\").\n */\nexport interface AdapterExtraction {\n /**\n * Stable within-adapter instance discriminator. Empty string for\n * adapters that only ever produce one instance per applicant.\n */\n readonly instanceKey: string;\n\n /**\n * The canonical field values for this instance.\n */\n readonly values: CanonicalFieldValues;\n\n /**\n * SYS-2502: when this instance's data was OBSERVED at the source\n * (ISO-8601) — the statement's own date, the partner snapshot's\n * timestamp — as distinct from when the adapter RAN. Optional for\n * backward compatibility with already-shipped adapters (the host\n * falls back to the run's ranAt when absent, exactly the inference\n * it always did), but new adapters should treat it as required:\n * ranAt-inference conflates \"when we fetched\" with \"when it was\n * true\", which corrupts recency ordering for backfilled or delayed\n * data. Expected to become mandatory at the next major version.\n */\n readonly observedAt?: string;\n\n /**\n * SYS-2502 (prototyped in finsys-api under SYS-2977): optional\n * per-field extraction confidence, 0..1, keyed by canonical field\n * name. This is the provenance slot SYS-2819 identified as the\n * missing precondition for FinXtract-as-adapter — probabilistic\n * extractors (OCR/LLM) carry real per-field confidence; partner-API\n * adapters (a telco returning a number) simply omit it. `null` marks\n * a field whose value is derived/computed rather than directly\n * extracted (renders as \"no confidence\" rather than low confidence,\n * matching IhsFieldProvenance.origin semantics).\n */\n readonly confidence?: Partial<Record<CanonicalFieldName, number | null>>;\n}\n\n/**\n * Allowed value shapes for canonical fields. Per-field type narrowing\n * happens at the category schema level — telcoOnTimePaymentRatio24m is\n * a number 0..1; telcoHandsetFinancingActive is a boolean; etc.\n * Numbers + booleans + strings cover everything we expect from credit\n * signals; nested objects are intentionally excluded to keep canonical\n * fields atomic + queryable.\n */\nexport type CanonicalFieldValue = number | string | boolean | null;\n\n/**\n * The interface every adapter implements. Adapters are loaded by the\n * host app's discovery mechanism (SYS-2444); the host app constructs\n * the adapter from its manifest + extract module, then registers it\n * against the registry by `id`.\n *\n * Type parameter `E` lets adapter authors declare the partner-specific\n * extension shape on ApplicantIdentity. v2.7.0+ — defaults to `{}` so\n * v2.6.0 adapters (which didn't have fetch and never read identity)\n * stay assignment-compatible. A telco adapter that needs an MSISDN\n * declares it once at the interface level:\n *\n * interface CelcomExt { msisdn: string }\n * const celcomTelco: SourceAdapter<CelcomExt> = {\n * async fetch(identity) {\n * identity.msisdn // string (typed via E)\n * identity.ic // string (core)\n * },\n * ...\n * }\n *\n * The generic flows from interface → method, so implementations\n * don't have to redeclare it on fetch.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface SourceAdapter<E extends Record<string, unknown> = {}> {\n /**\n * Globally unique id for this adapter instance. By convention:\n * `<vendor>-<category-short>-v<n>` — e.g. `celcom-telco-v1`. Vendor\n * names appear here in deployment-specific code, NEVER in\n * finsys-core. The id is what the registry uses to dedupe + what\n * provenance records pin to.\n */\n readonly id: string;\n\n /**\n * Which generic category this adapter implements. Determines which\n * canonical fields the adapter MAY produce + how its output is\n * persisted (each category has its own canonical sibling table —\n * `ihs_alt_data_telco`, `ihs_alt_data_payments`, etc.).\n */\n readonly category: AdapterCategory;\n\n /**\n * Monotonic version per adapter. Bumped whenever the adapter's\n * payload shape, field-mapping logic, or output semantics change.\n * Versions are stored alongside each extraction run for replay /\n * audit; the framework allows multiple versions of the same adapter\n * to coexist in the registry (deployment-controlled).\n */\n readonly version: number;\n\n /**\n * Subset of the adapter's category fields that this adapter promises\n * to produce. Used by the host app at boot to log adapter capability\n * + by the CRA report to render \"provided by adapter X\" badges.\n * MUST be a subset of `categoryFieldsOf(category)`; the host app\n * validates this at registration time and refuses to load adapters\n * that promise fields outside their category.\n */\n readonly produces: ReadonlyArray<CanonicalFieldName>;\n\n /**\n * Transform a raw payload into canonical field values. The host app\n * calls this once per applicant per adapter, passes the result to\n * the persistence layer (one row per AdapterExtraction in the\n * canonical sibling table), and writes provenance.\n *\n * The return is ALWAYS a list, even when the adapter produces only\n * one instance per applicant — return a one-element array in that\n * case with `instanceKey: ''`. The list shape exists to support\n * inherently multi-instance sources (6 bank statements, 12 monthly\n * payment snapshots, 3 mobile lines) without forcing adapters to\n * batch their own calls.\n *\n * Throw `AdapterError` for any failure path — network timeout,\n * schema mismatch, partner API rate limit, malformed payload. The\n * host's adapter runner catches AdapterError + records the failure\n * on `ihs_extraction_runs` so the operator sees what happened\n * without losing the applicant.\n *\n * Adapters MUST NOT throw plain `Error` or unknown types — the\n * runner will treat those as adapter implementation bugs and surface\n * them to logs separately. Stick to AdapterError for the\n * expected-failure path.\n */\n extract(raw: RawPayload): Promise<AdapterExtraction[]>;\n\n /**\n * Optional partner-data fetch path. v2.7.0+ — adapters that own their\n * partner-API integration declare this method; the host invokes it\n * before extract() and passes the result through. Adapters that\n * receive raw payload from elsewhere (e.g., bank-statement adapters\n * reading FinXtract OCR output, or webhook-driven push ingest) omit\n * fetch() entirely and the host treats raw as already-staged.\n *\n * The host builds `identity` from the IHS row (ic, fullName, etc.)\n * plus any partner-specific fields the adapter declared via the\n * manifest's `requiredIdentityFields`. If a required field is missing\n * from the IHS, the host logs + skips this adapter for the run\n * (no extract call, no canonical rows).\n *\n * Implementations should:\n * - Throw AdapterError('source_unavailable') ONLY on transient,\n * retryable upstream failures (timeouts, 5xx, rate limits). The\n * host runner is free to retry these; misclassifying a permanent\n * failure here will burn retry budget for nothing.\n * - Throw AdapterError('not_applicable') on permanent\n * no-relationship signals — 404 (\"applicant unknown to partner\"),\n * 410, an explicit \"not a subscriber\" response. Communicates\n * 'we asked and they said no' so the host records the run + skips\n * retry. This is the correct reason for most non-retryable\n * upstream conditions.\n * - Throw AdapterError('payload_invalid') if the partner returned\n * a malformed response (200 with garbage body, schema violation).\n * - Return a RawPayload that extract() will translate. The same\n * adapter's extract() is the only consumer; the host doesn't\n * inspect the shape.\n *\n * Strict additive — v2.6.0 read-only adapters that omit fetch()\n * keep working without change.\n *\n * @example WRONG — recurses into the adapter method:\n * ```ts\n * const adapter: SourceAdapter = {\n * async fetch(identity) {\n * const res = await fetch(`/api/lookup/${identity.ic}`) // infinite recursion\n * return res.json()\n * },\n * ...\n * }\n * ```\n *\n * @example RIGHT — explicit globalThis access:\n * ```ts\n * const adapter: SourceAdapter = {\n * async fetch(identity) {\n * const res = await globalThis.fetch(`/api/lookup/${identity.ic}`)\n * return res.json()\n * },\n * ...\n * }\n * ```\n *\n * Implementation note: this method is named `fetch` which shadows\n * the global `fetch()` inside the method body — see the @example\n * blocks above. The fake-* reference adapters in\n * @finsys/adapter-toolkit use the explicit-globalThis pattern.\n * Partner repos can also pin this with the lint rule\n * `no-restricted-syntax`: `CallExpression[callee.name='fetch']`\n * inside any method literal named `fetch`.\n */\n fetch?(identity: ApplicantIdentity<E>): Promise<RawPayload>;\n}\n\n/**\n * Identity payload the host hands to fetch() so adapters can call\n * partner APIs with the right per-applicant identifiers.\n *\n * The shape is an intersection of three pieces:\n * - Core fields (`ihsId`, `ic`, `fullName`) — always present, the\n * host populates them from the IHS row before invoking fetch().\n * - Partner extensions (`E`) — typed declaratively per adapter.\n * Defaults to `{}` (no extra typed fields) for adapters that only\n * need the core trio.\n * - Open index signature (`[k: string]: unknown`) — catches any\n * ad-hoc field a host might pass through; reads land on `unknown`\n * so partners must validate before use.\n *\n * Narrowing example (the ergonomics win this type is designed to deliver):\n *\n * interface CelcomExt { msisdn: string; accountRef: string }\n *\n * // declare adapter with the extension shape baked in:\n * const celcom: SourceAdapter<CelcomExt> = {\n * async fetch(identity) {\n * identity.ic // string\n * identity.msisdn // string (NOT unknown — narrowed by E)\n * identity.foo // unknown (falls through to index signature)\n * // ...\n * },\n * // ...\n * }\n *\n * The intersection puts narrowed members at the root, so partners get\n * `identity.msisdn` (not `identity.extensions?.msisdn`) — matching the\n * pattern the host actually uses (it spreads partner-required fields\n * onto the root identity object, no nested 'extensions' envelope).\n *\n * Examples:\n * - Telco adapter declares `requiredIdentityFields: ['msisdn']`.\n * Identity arrives with msisdn populated; adapter calls partner API.\n * (Don't include 'ihsId', 'ic', or 'fullName' in\n * `requiredIdentityFields` — those are core fields. `ic` in\n * particular can be legitimately empty for non-MY scope, so\n * declaring it required would cause the host to skip every applicant.)\n * - Payment-network adapter declares `requiredIdentityFields:\n * ['businessRegistrationNumber']`. Adapter looks it up + calls.\n * - An adapter that only needs the IHS id declares no extra\n * fields; identity has just the core trio.\n */\nexport type ApplicantIdentity<\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n E extends Record<string, unknown> = {},\n> = {\n /** Internal IHS id — always present. */\n readonly ihsId: number;\n /** Malaysian IC (or analogous national id). May be empty for non-MY scope. */\n readonly ic: string;\n /** Applicant full legal name. */\n readonly fullName: string;\n} & E & {\n /** Catch-all for ad-hoc reads (typed `unknown` — validate before use). */\n readonly [key: string]: unknown;\n};\n\n/**\n * Typed error thrown by adapters on expected failure paths. The\n * `reason` discriminator lets the host app's adapter runner classify\n * failures (transient vs permanent, partner-side vs schema-side)\n * without parsing strings.\n */\nexport class AdapterError extends Error {\n public readonly reason: AdapterErrorReason;\n public readonly cause?: unknown;\n\n constructor(reason: AdapterErrorReason, message: string, cause?: unknown) {\n super(message);\n this.name = \"AdapterError\";\n this.reason = reason;\n this.cause = cause;\n }\n}\n\n/**\n * Discriminator for adapter failure modes. The runner uses this to\n * decide whether to retry, surface to the operator, or write off the\n * extraction run.\n *\n * payload_invalid — the raw payload didn't conform to the\n * adapter's expected source shape. Permanent;\n * re-running won't help. Likely a partner-side\n * schema change → bump adapter version.\n *\n * source_unavailable — the upstream source was unreachable or\n * returned a transient error (timeout, 5xx,\n * rate limit). Transient; safe to retry.\n *\n * mapping_failed — extraction logic raised a domain-specific\n * failure (e.g. value out of expected range).\n * Permanent for this payload; surface to the\n * operator.\n *\n * not_applicable — the applicant doesn't have data for this\n * adapter (e.g. no telco opt-in). Not a\n * failure per se — the runner records a\n * no-op extraction run, eval engine sees no\n * canonical fields, components score zero.\n */\nexport type AdapterErrorReason =\n | \"payload_invalid\"\n | \"source_unavailable\"\n | \"mapping_failed\"\n | \"not_applicable\";\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Aggregation operators applied by the eval engine when a scoring\n * component reads a canonical field that has multiple instances\n * persisted for the same applicant.\n *\n * Multi-instance is the framework's first-class shape — an adapter\n * may produce 6 bank-statement instances, 12 monthly payment\n * snapshots, 3 mobile lines, etc., per applicant. Eval components\n * must declare HOW they want those instances collapsed into a single\n * scoring value. This module declares the operator set + the runtime\n * helper that applies one to a value list.\n *\n * Consumer is the eval engine (today: finsys-client + FinSim sim-\n * runner; tomorrow: anywhere else evaluating against canonical\n * fields). finsys-core publishes the operator surface so policy\n * fixtures across all consumers reference the same set.\n *\n * v1 operator set, in order of expected use frequency:\n *\n * sum — total across instances. Bank balance sum across t1..tN.\n * mean — arithmetic mean. Average monthly payment volume.\n * latest — the instance with the most recent observed_at. Telco\n * snapshot when only the latest matters.\n * max — maximum value across instances. Worst-case suspension\n * count when multiple telco lines exist.\n * count — number of instances with a non-null value for this\n * field. Useful for \"how many bank statements does this\n * applicant have on file\" as a score input.\n */\n\nimport type { CanonicalFieldValue } from \"./adapter.js\";\n\nexport type AggregationOp = \"sum\" | \"mean\" | \"latest\" | \"max\" | \"count\";\n\n/** Every operator declared in this version of finsys-core. */\nexport const ALL_AGGREGATION_OPS: ReadonlyArray<AggregationOp> = [\n \"sum\",\n \"mean\",\n \"latest\",\n \"max\",\n \"count\",\n] as const;\n\n/**\n * One value contributed by one instance. The eval engine builds a\n * list of these (one per instance, in observed-at order — the\n * persistence layer is the source of truth on ordering) and passes\n * to applyAggregation.\n */\nexport interface InstanceValue {\n readonly value: CanonicalFieldValue;\n /**\n * The instance's observed-at timestamp. MUST be an ISO-8601 UTC\n * string (`Z`-suffixed, e.g. `2026-04-01T00:00:00Z`). The `latest`\n * operator compares these lexicographically, which is only\n * monotonic with wall-time when all timestamps share the UTC\n * offset — mixed offsets (e.g. `+08:00` vs `Z`) can yield\n * incorrect ordering. Other operators ignore this field; pass an\n * empty string if the operator in question doesn't need it.\n */\n readonly observedAt: string;\n}\n\n/**\n * Apply an aggregation operator to a list of instance values.\n *\n * Behaviour for empty + null-only lists:\n * - empty list → `null`\n * - all-null values → `null`\n * - `count` on either of the above → `0`\n *\n * Returns:\n * - `sum`, `mean`, `max`, `count` → `number | null`\n * - `latest` → matches the value type of the most-recent instance\n * (number / boolean / string / null)\n *\n * Throws on operators that don't apply to the value types present\n * (e.g. `sum` of booleans). Eval-policy authors are expected to pair\n * operators with appropriate field types; this is a guardrail against\n * silent garbage rather than an error-recovery mechanism.\n */\nexport function applyAggregation(\n op: AggregationOp,\n instances: ReadonlyArray<InstanceValue>,\n): CanonicalFieldValue {\n if (instances.length === 0) {\n return op === \"count\" ? 0 : null;\n }\n\n if (op === \"count\") {\n // Single-pass count of non-null/undefined values; avoids the\n // intermediate array filter().length would allocate.\n return instances.reduce(\n (acc, i) =>\n i.value !== null && i.value !== undefined ? acc + 1 : acc,\n 0,\n );\n }\n\n if (op === \"latest\") {\n // Newest by observedAt wins. Stable for tied timestamps (first\n // in list — caller controls input ordering).\n let pick = instances[0]!;\n for (let i = 1; i < instances.length; i++) {\n if (instances[i]!.observedAt > pick.observedAt) pick = instances[i]!;\n }\n return pick.value;\n }\n\n // Numeric operators below this point. Filter to numeric values.\n // Null/undefined values are silently dropped (consistent with the\n // contract's \"no usable data → null\" semantics). Non-null,\n // non-numeric values throw — the operator was misused at policy-\n // authoring time and silent zero-coercion would mask the bug.\n const nums: number[] = [];\n for (const i of instances) {\n if (typeof i.value === \"number\" && Number.isFinite(i.value)) {\n nums.push(i.value);\n } else if (i.value !== null && typeof i.value !== \"undefined\") {\n throw new Error(\n `applyAggregation: '${op}' requires numeric values; got ${typeof i.value}`,\n );\n }\n }\n\n if (nums.length === 0) return null;\n\n switch (op) {\n case \"sum\":\n return nums.reduce((a, b) => a + b, 0);\n case \"mean\":\n return nums.reduce((a, b) => a + b, 0) / nums.length;\n case \"max\":\n // `Math.max(...nums)` spreads through the call stack — V8 throws\n // RangeError once `nums.length` crosses the engine's argument\n // limit (~65k on current V8). Reduce form is safe for any size.\n return nums.reduce((a, b) => (a > b ? a : b));\n }\n}\n","{\n \"schemaVersion\": \"1.0.0\",\n \"categories\": [\n {\n \"id\": \"telco-carrier\",\n \"displayName\": \"Telco Carrier\",\n \"description\": \"Mobile carrier bill-payment + account-history signals. Any mobile carrier implementing this category produces the same canonical field set.\",\n \"canonicalTable\": \"ihs_alt_data_telco\",\n \"fields\": [\n {\n \"name\": \"telcoOnTimePaymentRatio24m\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of bills paid on time over the last 24 months. Strongest single telco predictor; ≥0.95 is the clean-history signal.\"\n },\n {\n \"name\": \"telcoTenureMonths\",\n \"type\": \"number\",\n \"unit\": \"months\",\n \"range\": [0, 600],\n \"description\": \"Account age. ≥48 months is the thin-file uplift trigger.\"\n },\n {\n \"name\": \"telcoSuspensionsCount24m\",\n \"type\": \"number\",\n \"unit\": \"count\",\n \"range\": [0, 100],\n \"description\": \"Non-payment-driven account suspensions in the last 24 months. ≥3 is a strong distress signal.\"\n },\n {\n \"name\": \"telcoLateDays24m\",\n \"type\": \"number\",\n \"unit\": \"days\",\n \"range\": [0, 800],\n \"description\": \"Cumulative days late across all bills in the trailing 24-month window.\"\n },\n {\n \"name\": \"telcoHandsetFinancingActive\",\n \"type\": \"boolean\",\n \"description\": \"Has an active handset-EMI account currently. Proxy for financing capacity already extended.\"\n },\n {\n \"name\": \"telcoHandsetFinancingDelinquent\",\n \"type\": \"boolean\",\n \"description\": \"Recent handset-EMI delinquency in the last 24 months. Distress signal even with otherwise clean bill payment.\"\n },\n {\n \"name\": \"telcoArpuMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 10000],\n \"description\": \"Average Revenue Per User (monthly) in Malaysian Ringgit. Coarse spending-capacity proxy.\"\n }\n ]\n },\n {\n \"id\": \"payment-network\",\n \"displayName\": \"Payment Network\",\n \"description\": \"Merchant-side payment-flow signals from POS / payment-gateway networks. Captures actual transaction velocity rather than self-reported revenue.\",\n \"canonicalTable\": \"ihs_alt_data_payments\",\n \"fields\": [\n {\n \"name\": \"paymentsMonthlyVolumeMyrT3\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 100000000],\n \"description\": \"Mean monthly inbound transaction volume (RM) over the trailing 3 months.\"\n },\n {\n \"name\": \"paymentsMonthlyVolumeMyrT12\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 100000000],\n \"description\": \"Mean monthly inbound transaction volume (RM) over the trailing 12 months. Pair with T3 for trend direction.\"\n },\n {\n \"name\": \"paymentsArpuStability12m\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Coefficient-of-variation inverse over monthly ARPU in the trailing 12 months. Closer to 1 = steadier; closer to 0 = volatile.\"\n },\n {\n \"name\": \"paymentsDisputeRate12m\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of transactions disputed or refunded in the trailing 12 months.\"\n },\n {\n \"name\": \"paymentsCustomerConcentrationTop5Pct\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Revenue share from the top-5 recurring customers. Above ~0.7 is concentration risk.\"\n },\n {\n \"name\": \"paymentsActiveTenureMonths\",\n \"type\": \"number\",\n \"unit\": \"months\",\n \"range\": [0, 600],\n \"description\": \"Months since first transaction on the payment network. Establishment / continuity proxy.\"\n }\n ]\n },\n {\n \"id\": \"bank-statement\",\n \"displayName\": \"Bank Statement\",\n \"description\": \"Per-month bank-statement extractions. Naturally multi-instance: one statement per (account, month). Eval components typically aggregate across instances (sum closing balance, max debit, count of bounced transactions).\",\n \"canonicalTable\": \"ihs_alt_data_bank_statements\",\n \"fields\": [\n {\n \"name\": \"bankStatementMonth\",\n \"type\": \"string\",\n \"description\": \"Statement period in YYYY-MM format. Used as the instance_key discriminator + by the `latest` aggregation operator.\"\n },\n {\n \"name\": \"bankClosingBalanceMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [-100000000, 100000000],\n \"description\": \"Closing balance for the statement period.\"\n },\n {\n \"name\": \"bankTotalCreditsMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 100000000],\n \"description\": \"Sum of credit transactions during the period.\"\n },\n {\n \"name\": \"bankTotalDebitsMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 100000000],\n \"description\": \"Sum of debit transactions during the period.\"\n },\n {\n \"name\": \"bankLargestSingleCreditMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 100000000],\n \"description\": \"Largest single inbound transaction in the period. Useful for spotting one-off injections vs steady revenue.\"\n },\n {\n \"name\": \"bankBouncedTransactionsCount\",\n \"type\": \"number\",\n \"unit\": \"count\",\n \"range\": [0, 1000],\n \"description\": \"Bounced / returned transactions in the period. Distress signal at counts > 0.\"\n }\n ]\n },\n {\n \"id\": \"social-media\",\n \"displayName\": \"Social Media Presence\",\n \"description\": \"Public business-presence signals from social / commerce platforms — establishment, reach, engagement authenticity, customer reputation, and account standing. Vendor-agnostic: any platform exposing a public business profile maps its data to this canonical field set. Useful as thin-file corroboration of a borrower's operating reality where formal financials are sparse.\",\n \"canonicalTable\": \"ihs_alt_data_social_media\",\n \"fields\": [\n {\n \"name\": \"socialAccountTenureMonths\",\n \"type\": \"number\",\n \"unit\": \"months\",\n \"range\": [0, 600],\n \"description\": \"Age of the oldest verified public business presence across linked profiles. Establishment / continuity proxy, parallel to telco + payment-network tenure.\"\n },\n {\n \"name\": \"socialFollowerCount\",\n \"type\": \"number\",\n \"unit\": \"count\",\n \"range\": [0, 100000000],\n \"description\": \"Aggregate audience size across linked public profiles. Coarse reach / scale proxy — gameable on its own, so read alongside socialEngagementRate90d.\"\n },\n {\n \"name\": \"socialEngagementRate90d\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Mean interactions per impression over the trailing 90 days. Authenticity signal: a large follower count with near-zero engagement indicates a bought or dormant audience.\"\n },\n {\n \"name\": \"socialPostingConsistency12m\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of weeks in the trailing 12 months with at least one public post. Ongoing-operation signal — distinguishes an active business from a stale listing.\"\n },\n {\n \"name\": \"socialVerifiedBusinessAccount\",\n \"type\": \"boolean\",\n \"description\": \"Has at least one platform-verified business / commerce profile. Legitimacy signal — the platform has performed its own business-identity check.\"\n },\n {\n \"name\": \"socialCustomerRatingAvg\",\n \"type\": \"number\",\n \"unit\": \"rating\",\n \"range\": [0, 5],\n \"description\": \"Mean public customer rating (normalised to a 0–5 scale) across review-bearing profiles. Reputation signal; especially predictive for consumer-facing SMEs.\"\n },\n {\n \"name\": \"socialNegativeSentimentRatio90d\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of public mentions / reviews classified as negative over the trailing 90 days. Reputation-risk / distress signal independent of overall rating volume.\"\n },\n {\n \"name\": \"socialAccountFlags24m\",\n \"type\": \"number\",\n \"unit\": \"count\",\n \"range\": [0, 100],\n \"description\": \"Policy strikes, suspensions, or content takedowns across linked profiles in the last 24 months. Distress signal, parallel to telcoSuspensionsCount24m.\"\n }\n ]\n },\n {\n \"id\": \"trade-credit\",\n \"displayName\": \"Trade Credit (Accounting)\",\n \"description\": \"Accounts-receivable / accounts-payable aging and ledger-derived working-capital signals sourced from a business's accounting / ERP system. Captures how promptly the business collects from its debtors and pays its creditors, the aging profile and concentration of its receivables, and P&L / cash-conversion efficiency. Vendor-agnostic: any accounting or ERP system that exposes an AR/AP aging report plus a P&L summary maps its data to this canonical field set. A direct, high-signal view of trade-obligation behaviour — closer to formal credit history than most alternative data — and the anchor for cross-referencing self-reported accounting figures against bank-statement reality.\",\n \"canonicalTable\": \"ihs_alt_data_trade_credit\",\n \"fields\": [\n {\n \"name\": \"arDaysSalesOutstanding\",\n \"type\": \"number\",\n \"unit\": \"days\",\n \"range\": [0, 400],\n \"description\": \"Days Sales Outstanding — average days to collect a receivable. The headline collection-efficiency metric; lower is healthier, and a rising DSO is an early liquidity-stress signal.\"\n },\n {\n \"name\": \"apDaysPayableOutstanding\",\n \"type\": \"number\",\n \"unit\": \"days\",\n \"range\": [0, 400],\n \"description\": \"Days Payable Outstanding — average days the business takes to pay its suppliers. Context for DSO; a very high DPO can indicate the business is stretching its creditors to fund operations.\"\n },\n {\n \"name\": \"arTotalOutstandingMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 1000000000],\n \"description\": \"Total accounts-receivable balance outstanding (RM). The size of the debtor book the business is carrying.\"\n },\n {\n \"name\": \"arCurrentRatio\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of the receivables book that is current (within payment terms, not yet overdue). Higher is healthier; the complement is the overdue share across all aging buckets.\"\n },\n {\n \"name\": \"arOverdue90PlusRatio\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of the receivables book aged more than 90 days past terms. The key impairment / bad-debt risk signal from the AR aging report; elevated values indicate collection difficulty.\"\n },\n {\n \"name\": \"debtorConcentrationTop5Ratio\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Share of total receivables owed by the top-5 debtors. Above ~0.6 is single-customer concentration risk — one debtor default would materially impair cash flow.\"\n },\n {\n \"name\": \"tradeReferenceDefaults12m\",\n \"type\": \"number\",\n \"unit\": \"count\",\n \"range\": [0, 1000],\n \"description\": \"Count of supplier-reported defaults or dishonoured / returned payments against the business in the trailing 12 months. Direct distress signal, parallel to a bureau default record.\"\n },\n {\n \"name\": \"accountingRevenue12mMyr\",\n \"type\": \"number\",\n \"unit\": \"MYR\",\n \"range\": [0, 1000000000],\n \"description\": \"Trailing-12-month turnover per the general ledger (RM). The cross-reference anchor: comparing this self-reported accounting revenue against payment-network volume and bank-statement inflows surfaces book-vs-reality inconsistencies.\"\n },\n {\n \"name\": \"grossMarginPct\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Gross margin from the P&L (gross profit / revenue). Profitability-quality signal; a thin or declining margin constrains debt-service capacity even at healthy revenue.\"\n },\n {\n \"name\": \"cashConversionCycleDays\",\n \"type\": \"number\",\n \"unit\": \"days\",\n \"range\": [-200, 600],\n \"description\": \"Cash Conversion Cycle (DSO + days-inventory-outstanding − DPO). Working-capital efficiency; negative values (collect before paying suppliers) are strongest, very high values indicate cash tied up in operations.\"\n }\n ]\n },\n {\n \"id\": \"geolocation\",\n \"displayName\": \"Geolocation\",\n \"description\": \"Hourly-granularity movement track plus derived mobility signals for an applicant, sourced from any location-capable provider (telco network location, mobile-SDK GPS, GIS / address-verification services). Two instance kinds share this category: point instances (instanceKey 'pt:<ISO-hour>') carry one observed position per hourly bucket, mirroring the bank-statement multi-instance pattern; a single summary instance (instanceKey 'summary') carries adapter-derived behaviour signals — most importantly work-pattern regularity (sustained weekday dwell at a stable work anchor corroborates income reliability), residential stability, vacation windows, and dwell in operator-flagged hotspot zones. Vendor-agnostic: the source classifies or the adapter infers place labels; no provider-specific semantics leak into the field set. Raw coordinates are sensitive personal data — product-plane persistence is gated on PDPA consent + CRA Act 710 s25 retention review.\",\n \"canonicalTable\": \"ihs_alt_data_geolocation\",\n \"fields\": [\n {\n \"name\": \"geoLatitude\",\n \"type\": \"number\",\n \"unit\": \"deg\",\n \"range\": [-90, 90],\n \"description\": \"Observed latitude for this hourly bucket (point instances only).\"\n },\n {\n \"name\": \"geoLongitude\",\n \"type\": \"number\",\n \"unit\": \"deg\",\n \"range\": [-180, 180],\n \"description\": \"Observed longitude for this hourly bucket (point instances only).\"\n },\n {\n \"name\": \"geoAccuracyM\",\n \"type\": \"number\",\n \"unit\": \"meters\",\n \"range\": [0, 100000],\n \"description\": \"Source-reported horizontal accuracy radius of the observation. Cell-tower fixes are typically hundreds of meters; GPS fixes tens.\"\n },\n {\n \"name\": \"geoBucket\",\n \"type\": \"string\",\n \"description\": \"ISO-8601 hour bucket of the observation, e.g. '2026-06-01T08'. Redundant with the instance key (pt:<bucket>) so consumers can query without parsing keys.\"\n },\n {\n \"name\": \"geoPlaceLabel\",\n \"type\": \"string\",\n \"description\": \"Classified place for the bucket: home | work | commute | leisure | travel | hotspot | other. Classified by the source or inferred by the adapter from anchor dwell.\"\n },\n {\n \"name\": \"geoWorkAttendanceRatio30d\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Fraction of the last 30 weekdays with >= 6 hours of dwell at the inferred work anchor. The income-reliability headline: regular full-time work patterns corroborate declared employment income (summary instance only).\"\n },\n {\n \"name\": \"geoWorkDailyHoursAvg30d\",\n \"type\": \"number\",\n \"unit\": \"hours\",\n \"range\": [0, 24],\n \"description\": \"Mean daily hours of work-anchor dwell across the last 30 weekdays (summary instance only).\"\n },\n {\n \"name\": \"geoLocationStabilityScore\",\n \"type\": \"number\",\n \"unit\": \"score\",\n \"range\": [0, 1],\n \"description\": \"Residential stability: share of nights spent at the primary home anchor over the observation window. 1 = every night at home (summary instance only).\"\n },\n {\n \"name\": \"geoCommuteRegularityRatio\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Consistency of the weekday home->work->home rhythm: fraction of weekdays matching the dominant commute pattern within an hour's tolerance (summary instance only).\"\n },\n {\n \"name\": \"geoVacationDays90d\",\n \"type\": \"number\",\n \"unit\": \"days\",\n \"range\": [0, 90],\n \"description\": \"Days in the last 90 spent fully away from both home and work anchors (contiguous travel windows; summary instance only).\"\n },\n {\n \"name\": \"geoHotspotDwellRatio\",\n \"type\": \"number\",\n \"unit\": \"ratio\",\n \"range\": [0, 1],\n \"description\": \"Share of observed buckets spent inside operator-flagged hotspot zones (known fraud / illicit-activity locations supplied to the adapter). Non-zero values warrant review, not automatic decline (summary instance only).\"\n },\n {\n \"name\": \"geoPrimaryStateCode\",\n \"type\": \"string\",\n \"description\": \"Malaysian state / federal-territory code of the primary home anchor, e.g. PNG, KUL, JHR (summary instance only).\"\n },\n {\n \"name\": \"geoAddressMatchScore\",\n \"type\": \"number\",\n \"unit\": \"score\",\n \"range\": [0, 1],\n \"description\": \"Agreement between the inferred home anchor and the applicant's registered residential address. 1 = same premises, 0 = different state (summary instance only).\"\n }\n ]\n }\n ]\n}\n","/*\n * Copyright 2025 Sisters Inspire Sdn Bhd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Generic adapter category catalogue.\n *\n * Each category declares the canonical field set produced by any\n * adapter of that category — regardless of vendor. This is the\n * public, vendor-agnostic vocabulary that clients (finhub views,\n * finsys-client eval engine, CRA report renderer) read so they know\n * what data shape to expect from a given alt-data source TYPE.\n *\n * Specific vendor implementations (e.g. \"Celcom telco v1\", \"iPay88\n * payments v1\") live OUTSIDE this open-source package, in private\n * extension directories loaded by the host app. The category schemas\n * are the publication boundary — vendors map their raw payload to\n * these canonical fields; clients render against these canonical\n * fields. Vendor identity never crosses that boundary.\n *\n * SYS-2500 (extensible categories)\n * --------------------------------\n * The category id set used to be a hardcoded TypeScript union, kept in\n * sync by hand with the data file and the manifest JSON-schema enum\n * (three sources of truth, a drift test, and a deliberate edit in each\n * place to add a category). It is now backed by a single source of\n * truth: this package's `data/adapter-categories.json`, loaded +\n * validated into a runtime registry at module load. Adding a category\n * is a JSON-file edit plus a finsys-core minor bump — no union edit, no\n * schema enum edit. `AdapterCategory` is an open `string`; membership\n * is validated at trust boundaries via `isAdapterCategory()` /\n * `assertAdapterCategory()`.\n */\n\nimport categoriesData from \"./data/adapter-categories.json\" with { type: \"json\" };\n\n/**\n * Adapter category identifier.\n *\n * Open `string` type (SYS-2500). The authoritative set lives in the\n * runtime registry built from `data/adapter-categories.json`; there is\n * no compile-time union to enumerate. The trade-off vs. the old\n * literal union is the loss of autocomplete + exhaustiveness on\n * category ids — validate at boundaries with `isAdapterCategory()` /\n * `assertAdapterCategory()` instead, and read the canonical set from\n * `ADAPTER_CATEGORY_IDS` / `allCategories()`.\n */\nexport type AdapterCategory = string;\n\n/**\n * Union of all canonical field names declared by any category. Loose-\n * typed (string) because the set grows with each category-added minor;\n * the runtime registry narrows against the data file.\n *\n * Adapter `produces` lists are typed as ReadonlyArray<CanonicalFieldName>\n * — the host validates membership against the adapter's category at\n * registration time, refusing adapters that promise fields outside\n * their category.\n */\nexport type CanonicalFieldName = string;\n\n/**\n * Per-field metadata for a canonical field declared by a category.\n * Frozen at module load — the data file is authoritative.\n */\nexport interface CanonicalFieldSpec {\n readonly name: CanonicalFieldName;\n readonly type: \"number\" | \"boolean\" | \"string\";\n readonly unit?: string;\n readonly range?: readonly [number, number];\n readonly description: string;\n}\n\n/**\n * Per-category schema bundle. Used by:\n * - host app: validate adapter `produces` lists at registration\n * - clients (finhub, finsys-client): render UI conditionally on\n * category activation\n * - CRA report: render provenance metadata\n */\nexport interface CategorySchema {\n readonly id: AdapterCategory;\n readonly displayName: string;\n readonly description: string;\n readonly canonicalTable: string;\n readonly fields: ReadonlyArray<CanonicalFieldSpec>;\n}\n\n// ── Raw data shape (as it appears in the JSON file) ──────────────────\n\ninterface RawCategoryField {\n name: string;\n type: \"number\" | \"boolean\" | \"string\";\n unit?: string;\n range?: [number, number];\n description: string;\n}\n\ninterface RawCategory {\n id: string;\n displayName: string;\n description: string;\n canonicalTable: string;\n fields: RawCategoryField[];\n}\n\ninterface RawCategoryData {\n schemaVersion: string;\n categories: RawCategory[];\n}\n\n// ── Registry: load-time validation + indexing ────────────────────────\n\nconst VALID_FIELD_TYPES: ReadonlyArray<CanonicalFieldSpec[\"type\"]> = [\n \"number\",\n \"boolean\",\n \"string\",\n];\n\n/**\n * The validated, indexed, immutable category registry. Built once at\n * module load from the bundled data file (and rebuildable from any\n * conforming data object in tests via `buildCategoryRegistry`).\n */\nexport interface CategoryRegistry {\n /** All category schemas, in data-file order. */\n readonly all: ReadonlyArray<CategorySchema>;\n /** Category ids, in data-file order. */\n readonly ids: ReadonlyArray<AdapterCategory>;\n /** id → schema, O(1) lookup. */\n readonly byId: ReadonlyMap<AdapterCategory, CategorySchema>;\n /** canonical field name → owning category id, O(1) reverse lookup. */\n readonly fieldToCategory: ReadonlyMap<CanonicalFieldName, AdapterCategory>;\n}\n\n/**\n * Validate + index raw category data into an immutable registry.\n *\n * Pure function — exported so the loader can be exercised against\n * fixture data in tests (SYS-2500: prove the registry is genuinely\n * data-driven, not hardcoded). Throws on ANY structural violation so a\n * malformed JSON edit fails loudly at module load rather than producing\n * silent gaps at read time. The invariants enforced here are the ones\n * the old test suite asserted after the fact; making them load-time\n * guarantees is what lets the data file be the single source of truth.\n */\nexport function buildCategoryRegistry(raw: RawCategoryData): CategoryRegistry {\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"adapter category data: expected an object\");\n }\n if (typeof raw.schemaVersion !== \"string\" || raw.schemaVersion.length === 0) {\n throw new Error(\"adapter category data: missing schemaVersion\");\n }\n if (!Array.isArray(raw.categories) || raw.categories.length === 0) {\n throw new Error(\"adapter category data: categories must be a non-empty array\");\n }\n\n const byId = new Map<AdapterCategory, CategorySchema>();\n const fieldToCategory = new Map<CanonicalFieldName, AdapterCategory>();\n const tables = new Set<string>();\n const all: CategorySchema[] = [];\n\n for (const cat of raw.categories) {\n const where = `category \"${cat?.id ?? \"<unknown>\"}\"`;\n\n if (typeof cat.id !== \"string\" || cat.id.length === 0) {\n throw new Error(\"adapter category data: every category needs a non-empty id\");\n }\n if (byId.has(cat.id)) {\n throw new Error(`adapter category data: duplicate category id \"${cat.id}\"`);\n }\n if (typeof cat.displayName !== \"string\" || cat.displayName.length === 0) {\n throw new Error(`adapter category data: ${where} needs a non-empty displayName`);\n }\n if (typeof cat.description !== \"string\" || cat.description.length === 0) {\n throw new Error(`adapter category data: ${where} needs a non-empty description`);\n }\n if (typeof cat.canonicalTable !== \"string\" || !/^ihs_alt_data_/.test(cat.canonicalTable)) {\n throw new Error(\n `adapter category data: ${where} canonicalTable must start with \"ihs_alt_data_\" (got \"${cat.canonicalTable}\")`,\n );\n }\n if (tables.has(cat.canonicalTable)) {\n throw new Error(\n `adapter category data: duplicate canonicalTable \"${cat.canonicalTable}\" (${where})`,\n );\n }\n if (!Array.isArray(cat.fields) || cat.fields.length === 0) {\n throw new Error(`adapter category data: ${where} must declare at least one field`);\n }\n\n const fields: CanonicalFieldSpec[] = [];\n for (const f of cat.fields) {\n if (typeof f.name !== \"string\" || f.name.length === 0) {\n throw new Error(`adapter category data: ${where} has a field with no name`);\n }\n if (fieldToCategory.has(f.name)) {\n throw new Error(\n `adapter category data: canonical field \"${f.name}\" declared by more than one category ` +\n `(${fieldToCategory.get(f.name)} + ${cat.id}) — field names must be globally unique`,\n );\n }\n if (!VALID_FIELD_TYPES.includes(f.type)) {\n throw new Error(\n `adapter category data: field \"${f.name}\" (${where}) has invalid type \"${f.type}\"`,\n );\n }\n if (typeof f.description !== \"string\" || f.description.length === 0) {\n throw new Error(\n `adapter category data: field \"${f.name}\" (${where}) needs a non-empty description`,\n );\n }\n if (f.range !== undefined) {\n // Number.isFinite rejects non-numbers, NaN, and ±Infinity — a\n // typeof check alone would let [NaN, NaN] through (typeof NaN ===\n // \"number\" and NaN > NaN is false), silently corrupting any\n // downstream clamp that reads the range.\n if (\n !Array.isArray(f.range) ||\n f.range.length !== 2 ||\n !Number.isFinite(f.range[0]) ||\n !Number.isFinite(f.range[1]) ||\n f.range[0] > f.range[1]\n ) {\n throw new Error(\n `adapter category data: field \"${f.name}\" (${where}) has an invalid range — expected [lo, hi] with finite lo <= hi`,\n );\n }\n }\n\n const spec: CanonicalFieldSpec = Object.freeze({\n name: f.name,\n type: f.type,\n ...(f.unit !== undefined ? { unit: f.unit } : {}),\n ...(f.range !== undefined ? { range: Object.freeze([f.range[0], f.range[1]]) as readonly [number, number] } : {}),\n description: f.description,\n });\n fields.push(spec);\n fieldToCategory.set(f.name, cat.id);\n }\n\n const schema: CategorySchema = Object.freeze({\n id: cat.id,\n displayName: cat.displayName,\n description: cat.description,\n canonicalTable: cat.canonicalTable,\n fields: Object.freeze(fields) as ReadonlyArray<CanonicalFieldSpec>,\n });\n byId.set(cat.id, schema);\n tables.add(cat.canonicalTable);\n all.push(schema);\n }\n\n return Object.freeze({\n all: Object.freeze(all) as ReadonlyArray<CategorySchema>,\n ids: Object.freeze(all.map((c) => c.id)) as ReadonlyArray<AdapterCategory>,\n byId,\n fieldToCategory,\n });\n}\n\n/**\n * The package's category registry — built + validated once at module\n * load from `data/adapter-categories.json`. A malformed data file\n * throws here, failing the import (and the build/test) loudly.\n */\nconst registry = buildCategoryRegistry(categoriesData as RawCategoryData);\n\n/**\n * Every category id declared by this version of finsys-core, in\n * data-file order. The runtime equivalent of the old hardcoded union —\n * derived from the single source of truth rather than maintained by\n * hand. Treat order as unstable across versions.\n */\nexport const ADAPTER_CATEGORY_IDS: ReadonlyArray<AdapterCategory> = registry.ids;\n\n/**\n * Look up a category schema by id. Throws if the id is unknown.\n */\nexport function categorySchemaOf(id: AdapterCategory): CategorySchema {\n const found = registry.byId.get(id);\n if (!found) {\n throw new Error(\n `Unknown adapter category: ${id}. Available: ${registry.ids.join(\", \")}`,\n );\n }\n return found;\n}\n\n/**\n * The canonical field names a given category produces. Convenience\n * for callers that don't need the full schema — common case in the\n * eval engine (\"does this policy reference any fields from a category\n * that isn't loaded?\").\n */\nexport function categoryFieldsOf(id: AdapterCategory): ReadonlyArray<CanonicalFieldName> {\n return categorySchemaOf(id).fields.map((f) => f.name);\n}\n\n/**\n * Every category currently declared. Order is data-file order; treat\n * as unstable across versions.\n */\nexport function allCategories(): ReadonlyArray<CategorySchema> {\n return registry.all;\n}\n\n/**\n * Reverse lookup: which category declares a given canonical field?\n * Returns null if the field name isn't declared by any category in\n * this version of finsys-core. Useful when the host app is reading\n * canonical field values back from storage + wants to identify the\n * producing category for rendering. O(1).\n */\nexport function categoryForField(field: CanonicalFieldName): AdapterCategory | null {\n return registry.fieldToCategory.get(field) ?? null;\n}\n\n/**\n * Runtime membership check — is `id` a category declared by this\n * version of finsys-core? Use this at trust boundaries (parsing a\n * manifest, validating an API parameter) now that `AdapterCategory` is\n * an open `string` and the compiler can no longer reject unknown ids.\n */\nexport function isAdapterCategory(id: string): boolean {\n return registry.byId.has(id);\n}\n\n/**\n * Assert membership: returns `id` if it names a declared category,\n * throws otherwise. Note this is a RUNTIME guard only — `AdapterCategory`\n * is an open `string`, so there is no type-level narrowing to apply.\n * The companion to `isAdapterCategory` for call sites that want a hard\n * failure (e.g. the host rejecting a manifest whose category isn't in\n * this finsys-core version's catalogue).\n */\nexport function assertAdapterCategory(id: string): AdapterCategory {\n if (!registry.byId.has(id)) {\n throw new Error(\n `Unknown adapter category: ${id}. Available: ${registry.ids.join(\", \")}`,\n );\n }\n return id;\n}\n"],"mappings":"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AAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA;A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;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS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AA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,WAAa;AAAA,MACb,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,SAAW;AAAA,QACT;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,SAAW;AAAA,QACT;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,cAAgB;AAAA,MAChB,SAAW;AAAA,QACT;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,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AAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAS;AAAA,UACT,M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,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAY;AAAA,MACZ,eAAiB;AAAA,MACjB,gBAAkB;AAAA,MAClB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,eAAiB;AAAA,MACjB,kBAAoB;AAAA,IACtB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,kBAAoB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAA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","names":["AjvModule","addFormats","FieldType","semver","IhsValueFormat","FileFieldTableType","Role","ExtractionJobStatus","IhsStatus","DocExtractionStatus"]}