{
  "$schema": "https://govschema.org/spec/v0.3/govschema.schema.json",
  "govschemaVersion": "0.3.0",
  "id": "pg/ica/entry-permit-application",
  "version": "1.0.0",
  "title": "Papua New Guinea Application for Entry Permit",
  "description": "Papua New Guinea's Immigration and Citizenship Authority's (ICA) \"Application for Entry Permit\" — the first-entry visa application filed by a non-citizen seeking to travel to and stay in Papua New Guinea, whether as a visitor, working resident, business traveller, entertainer, student, special-exemption entrant, or dependant. Models the applicant's tick-the-purpose application type and requested length of stay (page 1); personal particulars, marital status, nationality, and full passport particulars (page 1); travel-arrangement logistics (page 1); the employment-purpose supporting-document checklist and the alternate stay-funding-source checklist (page 2); previous-name/alias and other-passport history, the organisational sponsor block, prior-visit history, and the criminal-conviction, deportation, and health/mental-health screening questions (page 2); the applicant's residential address, email-contact preference, in-PNG stay address, and emergency contact (page 3); and the closing Declaration, including this specimen's own genuine fillable photograph and signature image-insertion widgets (page 3). Opens Papua New Guinea's Visa vertical (3 of 6 verticals now open, alongside Business Formation via pg/ipa/business-name-registration and Passport via pg/ica/passport-application); DMV, Taxes, and National ID & Civic Documents remain open, unscreened backlog for a future cycle. This document does not file the application itself; the live source is always authoritative. See VERIFICATION.md for the full sourcing record and every disclosed scoping decision, including the two genuine image-insertion pushbutton widgets (photograph and signature) this specimen carries — a notable contrast with this registry's sibling pg/ica/passport-application, which carries no signature widget at all. GovSchema is an independent, non-profit standards body; it is not affiliated with, endorsed by, or operated by the Independent State of Papua New Guinea or its Immigration and Citizenship Authority.",
  "status": "draft",
  "jurisdiction": {
    "country": "PG",
    "level": "national"
  },
  "authority": {
    "name": "Immigration and Citizenship Authority",
    "abbreviation": "ICA",
    "url": "https://ica.gov.pg"
  },
  "process": {
    "type": "application",
    "language": "en"
  },
  "source": {
    "url": "https://png.or.jp/wp-content/uploads/2016/01/Application_for_entry_permit_form_new_savable.pdf",
    "retrievedAt": "2026-07-31",
    "documentRef": "\"Application for Entry Permit\", Papua New Guinea Immigration and Citizenship (Service) Authority — mirrored by the PNG-Japan Society; the specimen itself is watermarked \"Downloaded from www.immigration.gov.pg\", and the equivalent path on immigration.gov.pg currently 404s (see VERIFICATION.md)"
  },
  "verification": {
    "method": "manual-source-review-v1",
    "lastVerifiedAt": "2026-07-31",
    "verifiedBy": "GovSchema Engineering (Standards Engineer)",
    "nextReviewBy": "2027-01-31",
    "notes": "GOV-5819 (\"GovSchema Standard Research\"). GOV-5812's own authoring cycle screened Papua New Guinea's Visa vertical and banked two live, unauthenticated, genuinely rich AcroForm candidates without authoring either: the ICA's own \"Application to Extend Entry Permit\" (ica.gov.pg/uploads/media/post_file_2430587-visa-extension-form-new-savable.pdf, HTTP 200, 123,043 bytes, 62 widgets across 2 pages — a follow-on/renewal action for someone already in-country) and this document's own source, the first-entry \"Application for entry permit\" (102 widgets across 4 pages, the richer of the two and a genuine first-entry visa application, not a renewal). This cycle authored the richer, first-entry candidate, opening the Visa vertical outright.\n\nIndependently re-fetched https://png.or.jp/wp-content/uploads/2016/01/Application_for_entry_permit_form_new_savable.pdf directly via plain curl (twice, to confirm reproducibility): HTTP 200, 180,934 bytes both times, sha256 669fe6cf6878c7c11aac04459056cc6782da0396de4ce73dfcc17bc18da5076d both times, no login/CAPTCHA/WAF gate (served directly, content-type application/pdf, Last-Modified: Sun, 11 Sep 2016, so this is a long-standing, stable specimen, not a recent upload). Confirmed the direct immigration.gov.pg path for this exact filename currently 404s (checked both immigration.gov.pg and www.immigration.gov.pg); png.or.jp is the only currently-live host found for this specific PDF, though the PDF itself is watermarked \"Downloaded from www.immigration.gov.pg\" and so explicitly attributes its own source authority.\n\n**Authority naming.** This specimen's own page-1 letterhead reads \"PNG Immigration & Citizenship Service Authority\", and Instruction 3 addresses the completed form to \"The Chief Migration Officer, Immigration and Citizenship Service Authority, PO Box 1790, BOROKO, NCD, Papua New Guinea\" — a slightly different printed name (\"...Service Authority\") than the name printed on pg/ica/passport-application's own specimen (\"Immigration and Citizenship Authority\", no \"Service\"). A live web search corroborates both names refer to the same body (ica.gov.pg's own current branding is \"Immigration and Citizenship Authority\"/ICA; \"Immigration and Citizenship Service Authority\"/ICSA appears in older/alternate usage for the identical institution — e.g. ZoomInfo's \"The PNG Immigration & Citizenship Service Authority\" entry and cbinsights' \"Papua New Guinea Immigration and Citizenship Authority\" entry both resolve to the same PO Box 1790, Boroko, NCD address). This schema therefore reuses the existing registry/pg/ica/ authority directory and the existing pg/ica/passport-application authority block verbatim (name \"Immigration and Citizenship Authority\", abbreviation \"ICA\", url ica.gov.pg) rather than opening a new, spurious authority directory for what is the same institution under an older printed name. ica.gov.pg itself returned HTTP 403 to both a direct curl and WebFetch during this cycle's verification (consistent with GOV-5812's own passport cycle, which reached the same domain successfully for its own PDF asset but not this HTML front-end), so the current-name corroboration relies on third-party search results, not a direct fetch of ica.gov.pg's own text — disclosed as a residual sourcing gap, not a live-fetch confirmation.\n\n**Extraction method.** Extracted with pdfjs-dist (vendored install at /tmp/mn-passport/extract/node_modules/pdfjs-dist, CommonJS legacy build): a full getAnnotations() pass per page enumerated every AcroForm Widget (102 total across 4 pages — page 1: 33; page 2: 40; page 3: 29; page 4: 0, a pure general-information/notes page), recording each widget's internal field name, PDF field type (Tx/Btn/Ch), rect (bounding box) position, and (for Btn widgets) checkBox/radioButton/pushButton flags; then a getTextContent() pass per page, sorted by descending y then ascending x, to recover reading order, with several ambiguous regions (the page-1 TRAVEL ARRANGEMENTS column layout; page-2's two-column employment-document-checklist vs. stay-funding-source-checklist split; the page-3 DECLARATION paragraph) re-extracted with a narrower y-band and raw per-glyph x/y coordinates (rather than trusting the joined-line text alone) to positively cross-check every widget's rect against its printed label before naming the field. canvas was not available in this environment (checked /tmp/node_modules and every node_modules tree reachable from the working directory; only pdfjs-dist itself was found, no canvas), so no page was rendered to a PNG; every field mapping in this schema was instead confirmed via this rect-position/text-position cross-check method, consistent with this registry's own established practice of only invoking canvas-rendering when rect-position inference alone leaves genuine ambiguity — no such residual ambiguity was found here.\n\n**No printed required/optional signal of any kind exists anywhere on this specimen** (no asterisk, no \"(required)\"/\"(optional)\" caption, confirmed by a full page-by-page text-layer read) — the same constraint pg/ica/passport-application and cd/maeci/visa-application faced. This schema follows the same policy those two adopted: required only the fields necessary to identify the applicant and the substance of the application (application type, full name, date of birth, sex, marital status, nationality, country of birth, occupation, full passport particulars, the residential street address and country, the Declaration's date/photograph/signature, and the four background-screening yes/no questions — visited PNG before, criminal conviction, deportation/refused entry, and medical condition/mental-health history — since these gate their own conditional detail fields and are the form's own substantive screening questions), and bare-optional for travel logistics, secondary address/phone detail, the emergency-contact block, and the two directly-supplied name/alias and other-passport gates' own boolean toggles (both required, since they gate real conditional detail whose completeness depends on knowing the toggle's own value), with every genuinely conditional block gated by requiredWhen wherever the form's own layout or prose states a real conditional relationship.\n\nDisclosed scoping decisions:\n\n1. **This specimen carries two genuine image-insertion pushbutton widgets — a real contrast with pg/ica/passport-application, which carries none.** Page 3's \"Photograph\" box and \"Signature of Applicant/Parents/Guardian:\" line are each backed by a real AcroForm Btn widget (Insert_photograph_here, Insert_signature_image_here) with pushButton:true and isTooltipOnly:true — Acrobat/LiveCycle \"click to insert an image\" pushbuttons, not checkboxes or text fields. Both are modelled as fields[] of type file (applicantPhotograph, applicantOrGuardianSignatureImage), both required, since a genuine widget backs each — consistent with this registry's convention of only modelling signature capture (and, by the same logic, photograph capture) where the source itself provides a fillable widget. Unlike bz/doi/passport-application's submitterSignature (a text-type Tx widget on a printed \"Signature\" line) or tt/imd's applicantSpecimenSignature, this specimen's signature widget is an image-insertion pushbutton, modelled as type file rather than type string for that reason.\n\n2. **Instruction 1 states \"Where the application is in respect of a child under 16 years of age, both parents must sign the application\", but only one signature widget exists on the entire specimen** (the single Insert_signature_image_here pushbutton behind the shared \"Signature of Applicant/Parents/Guardian:\" line). This is a genuine content gap in the source specimen itself, not an omission of this schema's own: there is no second signature widget, and no separate parent/guardian name text field anywhere on the form, to model a two-parent-signature scenario distinctly. Disclosed rather than invented; applicantOrGuardianSignatureImage models the one widget that exists.\n\n3. **Two directly-supplied boolean gates without a backing widget of their own** — hasChangedNameOrAlias and hasOtherPassport — split a single combined page-2 prose sentence (\"If you have ever change your name, are known by an alias, or own another passport, please provide details:\") that precedes two visually distinct subsections (PREVIOUS NAMES/ALIAS DETAILS: and OTHER PASSPORTS:). Since the two subsections are printed and headed separately, this schema models two independent gates rather than one combined one, so a same-name-never-changed applicant who nonetheless holds another passport is not forced to also complete the previous-name/alias block, and vice versa — mirroring this registry's own hasSponsor/applicantUnder17-style convention for a real prose condition without its own checkbox.\n\n4. **hasOrganisationalSponsor is a third directly-supplied gate**, added to model the ORGANISATIONAL SPONSOR heading's own genuinely conditional nature (most applicants — e.g. tourists funding their own stay — will have no organisational sponsor at all) even though the form prints no explicit \"do you have a sponsor?\" yes/no question of its own for this block, mirroring cd/maeci/visa-application's own hasSponsor and mt/identita/long-stay-visa-application's hasHostInMalta conventions for an inferred-but-real conditional block. Only organisationalSponsorName, sponsorStreetAddress, and sponsorCountry are gated required when true; sponsorAgentName, sponsorSuburbTown, sponsorStateProvince, sponsorPostcode, sponsorBusinessTelephone, and sponsorFax remain bare-optional even within a true branch, consistent with this registry's policy of not over-requiring secondary contact detail absent its own printed signal.\n\n5. **applicationType collapses 7 independent AcroForm checkboxes into one enum** (Application_Type_-_Visitor/Working_Resident/Business/Entertainer/Student/Special_Exemption/Dependent, each its own Btn widget with exportValue \"Yes\", not a single radio-button field), consistent with this registry's established convention for this checkbox-group pattern. The form's own instruction reads \"TICK THE PURPOSE AND CIRCLE A DESCRIPTION OF YOUR VISIT TO PNG\": beneath/around each of the 7 category checkboxes sits a list of finer-grained descriptive labels (e.g. under Working Resident: \"Short-term Employment\", \"Employment\", \"Consultant/Specialist\"; under Special Exemption: \"Film maker\", \"Comedian\", \"Musician\", \"Melanesian Spearhead\", \"Foreign Official\", \"Diplomat\", etc.) meant to be hand-circled, not ticked — none of these finer descriptions carries its own AcroForm widget anywhere on the specimen, so none is modelled as a separate field; only the 7 category-level checkboxes, which do carry widgets, are modelled.\n\n6. **The page-2 employment-purpose document checklist (4 checkboxes) is inferred to gate on applicationType == WORKING_RESIDENT.** The form's own page-2 heading reads \"For entry for the purpose of employment: Please attach copies of the following documents\" opposite \"For all other types of entry: How will you be funding your Stay in PNG?\" — real conditional prose — but neither heading cross-references the page-1 application-type checkbox labels by name. Of the 7 application-type categories, only Working Resident's own page-1 descriptive labels (\"Short-term Employment\", \"Employment\", \"Consultant/Specialist\") describe genuine paid employment; this schema therefore infers applicationType == WORKING_RESIDENT as the gating condition for sponsorEmploymentLetterAttached/workPermitApprovalAttached/medicalCertificateAttached/policeClearanceAttached (and the four matching documents[] entries), disclosed as an inference rather than a literal cross-reference printed on the form.\n\n7. **The four \"how will you be funding your Stay in PNG\" checkboxes (fundedBySalary/fundedByCompanySponsor/fundedByOwnFunds/fundedByFamily) are left entirely ungated (bare-optional, no requiredWhen)**, even though they are the page-2 counterpart to the employment-document checklist above. Unlike that checklist (four items that read as a single unconditional list once employment purpose is established), these four are independent, mutually non-exclusive checkboxes with no \"tick one\" or \"at least one\" instruction of their own, and the requiredWhen grammar available to this spec only expresses single-field conditions, not \"at least one of these four fields must be true\" — encoding a mandatory-selection constraint here would overreach what the form itself states. Disclosed rather than invented.\n\n8. **previousSex and previousMaritalStatus are genuine Ch (combo-box) dropdown widgets**, each with a blank first option (exportValue \" \") followed by the real choices (F/M for sex; Married/Never married/Divorced/Widowed/De-facto for marital status) — the blank option is not modelled as a valid enum value (consistent with this registry's convention of omitting an unselected/placeholder dropdown option from the modelled enum), and both enums are normalised to the same MALE/FEMALE and MARRIED/DE_FACTO/WIDOWED/DIVORCED/NEVER_MARRIED vocabulary already established by this schema's own top-level sex/maritalStatus fields (themselves collapsed from independent Btn checkboxes on page 1), for cross-field consistency, rather than preserving the dropdown's own raw single-letter/differently-cased export values verbatim.\n\n9. **Two separate, non-combined address blocks exist for the applicant** (RESIDENTIAL, page 3, and a second \"PNG:\" in-country stay address, page 3), each backed by its own full set of independent AcroForm widgets (Number and Street / Suburb-Town / State-Province / Postcode / Country / Home Telephone / Mobile Telephone for the residential block; Number and Street / Town-Village / Province / Postal Address / Home Telephone / Mobile Telephone for the PNG stay block) — modelled as two fully separate groups of fields (residential*/pngStay*) rather than combined into one address field each, since the source itself prints two visually and semantically distinct address sections with different sub-label sets (Suburb/Town vs. Town/Village; State/Province vs. Province; the PNG block additionally has its own separate \"Postal Address\" box with no residential-block equivalent).\n\n10. **The page-1 TRAVEL ARRANGEMENTS row was disambiguated by rect position, not by the joined-line text's own left-to-right order**, which briefly appeared to read \"Arrival in PNG / Departure to PNG / Name of Vessel/Flight\" left-to-right. A raw per-glyph x/y re-extraction of that row (y=60–115) showed Name_of_VesselFlight's own widget rect sits leftmost (x=24–196), Departure_to_PNG's own Port/Date widgets sit in the middle column (x=234–395, directly beneath the \"Departure to PNG\"/\"Port:\"/\"Date:\" labels printed at x=214), and Arrival_in_PNG's own Port/Date widgets sit rightmost (x=432–564, beneath labels at x=413) — i.e. the vessel/flight name is the leftmost, unlabelled-by-column field, with departure-to-PNG and arrival-in-PNG as the two labelled Port+Date column pairs to its right, confirmed by rect-to-label proximity rather than the initially-misleading line-joined text order.\n\n11. **The page-3 DECLARATION statement's own printed wording reads \"...the information provided on the form is true and correct at I have disclosed all information that may be relevant...\"** — quoted verbatim (sic) in the applicantDeclaration document's statement field. A raw per-glyph re-extraction of this exact paragraph (y=250–300) confirmed the text-layer's own reading order is internally consistent (not a sort-order artifact of overlapping text runs, unlike the travel-arrangements row above) — \"at I have\" therefore appears to be the source PDF's own genuine wording (most likely originally intended as \"and that I have\"), not an extraction defect, though this cannot be independently confirmed without a canvas-rendered image (unavailable in this environment; see above).\n\n12. **Instruction 3's own address (\"The completed form and the applicant's passport should be sent to: The Chief Migration Officer... PO Box 1790, BOROKO, NCD, Papua New Guinea\") establishes that the applicant's physical passport itself, not merely passport particulars, must accompany the submitted form** — modelled as the applicantPassport documents[] entry (category identity-document, required), distinct from the passportNumber/passportExpiryDate/passportIssueDate/passportIssuingPlace/passportIssuingAuthority fields[] entries that model the printed particulars.\n\n13. **No application fee of any kind is printed anywhere on this specimen** (unlike pg/ica/passport-application's own K100 fee), confirmed by a full page-by-page text-layer read for \"fee\"/currency-amount mentions — the only currency figure on the entire specimen (\"K300.00 a month\", page 4) is general proof-of-funds guidance for tourists/visitors, not a payable application fee — so no documents[] payment entry is modelled.\n\n**Structure.** Models 89 fields[] across 12 steps (3 of the 89 — hasChangedNameOrAlias, hasOtherPassport, hasOrganisationalSponsor — are directly-supplied gates without a backing widget; the other 86 collapse this specimen's 102 total AcroForm widgets, since 16 widgets across 8 checkbox-group/pair collapses — applicationType [7→1], sex [2→1], maritalStatus [5→1], agreeToEmailContact [2→1], visitedPNGBefore [2→1], hasCriminalConviction [2→1], hasBeenDeportedOrRefusedEntry [2→1], hasMedicalConditionOrMentalHealthHistory [2→1] — each collapse into one enum/boolean field), 6 documents[] entries (the applicant's own physical passport; four employment-purpose supporting documents gated on applicationType == WORKING_RESIDENT; and the Declaration attestation), and 1 crossFieldValidation rule (passportExpiryNotBeforeIssue, mirroring pg/ica/passport-application's own travelDocumentExpiryNotBeforeIssue and bz/doi/passport-application's reportDateNotBeforeDateOfLoss).\n\n2 valid mock scenarios — valid-visitor-minimal-no-conditional-history (a minimal Visitor applicant exercising the false/absent branch of every one of this schema's 8 conditional gates) and valid-working-resident-full-conditional-history (a Working Resident applicant exercising the true branch of all 8 conditional gates simultaneously, including the full organisational-sponsor, previous-name/alias, other-passport, prior-visit, criminal-conviction, deportation, and medical-history blocks) — plus 18 mutation-control fixtures (7 missing-required fixtures spanning an enum, two strings, a date, and three booleans across different steps; 8 missing-requiredWhen fixtures, one per conditional branch; an invalid-enum-value fixture against applicationType; an unknown-field-rejected fixture; and a crossFieldValidation-violation fixture with passportExpiryDate set before passportIssueDate) are committed under conformance/pg/ica/entry-permit-application/1.0.0/. An ephemeral, from-scratch conformance checker (deriving required/requiredWhen/crossFieldValidation rules directly from this schema's own fields[], discarded after use, not committed) ran all 20 fixtures: both valid scenarios at 0 errors, all 18 mutation controls each raising exactly 1 error. Validated clean with node tools/validate.mjs and node tools/validate-ajv.mjs, individually and as part of the full registry run.\n\nOpens Papua New Guinea's Visa vertical (3 of 6). DMV and Taxes remain confirmed dead ends per GOV-5812's own screening; National ID has two live but flat (zero-widget) candidates, weaker than a genuine AcroForm, still banked as backlog; the ICA's own \"Application to Extend Entry Permit\" (62 widgets) remains unauthored backlog for a future cycle, as a distinct renewal/extension action rather than a first-entry application."
  },
  "license": "CC-BY-4.0",
  "fields": [
    {
      "name": "applicationType",
      "label": "Type of Entry Permit Application",
      "type": "enum",
      "required": true,
      "description": "Seven independent AcroForm checkboxes, not a single radio-button field; modelled as a mutually-exclusive enum since the printed layout (\"TICK THE PURPOSE...\") presents a single-select choice of purpose category. Each category is printed alongside a list of finer descriptive labels meant to be hand-circled (e.g. Working Resident: Short-term Employment/Employment/Consultant/Specialist), none of which carries its own AcroForm widget and so none is separately modelled.",
      "validation": {
        "enum": [
          "VISITOR",
          "WORKING_RESIDENT",
          "BUSINESS",
          "ENTERTAINER",
          "STUDENT",
          "SPECIAL_EXEMPTION",
          "DEPENDENT"
        ]
      },
      "sourceRef": "Page 1 — \"TICK THE PURPOSE AND CIRCLE A DESCRIPTION OF YOUR VISIT TO PNG\": Visitor / Working Resident / Business / Entertainer / Student / Special Exemption / Dependent"
    },
    {
      "name": "requestedStayDays",
      "label": "Requested Stay — Days",
      "type": "integer",
      "required": false,
      "description": "One of three alternative unit boxes (Days/Months/Years) joined by \"or\"; only the relevant unit is expected to be completed.",
      "sourceRef": "Page 1 — \"HOW LONG DO YOU WISH TO STAY IN PNG: Days: ___ or Months: ___ or Years: ___\""
    },
    {
      "name": "requestedStayMonths",
      "label": "Requested Stay — Months",
      "type": "integer",
      "required": false,
      "sourceRef": "Page 1 — \"HOW LONG DO YOU WISH TO STAY IN PNG\" (Months box)"
    },
    {
      "name": "requestedStayYears",
      "label": "Requested Stay — Years",
      "type": "integer",
      "required": false,
      "sourceRef": "Page 1 — \"HOW LONG DO YOU WISH TO STAY IN PNG\" (Years box)"
    },
    {
      "name": "familyName",
      "label": "Family Name",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1, PERSONAL DETAILS — \"Family Name\"",
      "classification": "pii"
    },
    {
      "name": "givenNames",
      "label": "Given Names",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1, PERSONAL DETAILS — \"Given Names\"",
      "classification": "pii"
    },
    {
      "name": "dateOfBirth",
      "label": "Date of Birth",
      "type": "date",
      "required": true,
      "sourceRef": "Page 1 — \"Date of Birth\" (Day/Month/Year)",
      "classification": "sensitive-pii"
    },
    {
      "name": "sex",
      "label": "Sex",
      "type": "enum",
      "required": true,
      "validation": {
        "enum": [
          "MALE",
          "FEMALE"
        ]
      },
      "sourceRef": "Page 1 — \"Sex\": Male / Female",
      "classification": "sensitive-pii"
    },
    {
      "name": "maritalStatus",
      "label": "Marital Status",
      "type": "enum",
      "required": true,
      "validation": {
        "enum": [
          "MARRIED",
          "DE_FACTO",
          "WIDOWED",
          "DIVORCED",
          "NEVER_MARRIED"
        ]
      },
      "sourceRef": "Page 1 — \"Marital Status\": Married / De-facto / Widowed / Divorced / Never Married"
    },
    {
      "name": "nationality",
      "label": "Nationality",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1 — \"Nationality\"",
      "classification": "pii"
    },
    {
      "name": "countryOfBirth",
      "label": "Country of Birth",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1 — \"Country of Birth\"",
      "classification": "pii"
    },
    {
      "name": "occupation",
      "label": "Occupation",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1 — \"Occupation\""
    },
    {
      "name": "passportNumber",
      "label": "Passport Number",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1 — \"Passport Number\"",
      "classification": "sensitive-pii"
    },
    {
      "name": "passportExpiryDate",
      "label": "Passport Expiry Date",
      "type": "date",
      "required": true,
      "sourceRef": "Page 1 — \"Expiry Date\" (passport row)"
    },
    {
      "name": "passportIssueDate",
      "label": "Passport Issue Date",
      "type": "date",
      "required": true,
      "sourceRef": "Page 1 — \"Passport Issue Date\""
    },
    {
      "name": "passportIssuingPlace",
      "label": "Passport Issuing Place",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1 — \"Passport Issuing Place\""
    },
    {
      "name": "passportIssuingAuthority",
      "label": "Passport Issuing Authority",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1 — \"Passport Issuing Authority\""
    },
    {
      "name": "vesselOrFlightName",
      "label": "Name of Vessel/Flight",
      "type": "string",
      "required": false,
      "sourceRef": "Page 1, TRAVEL ARRANGEMENTS — \"Name of Vessel/Flight\" (leftmost, unlabelled-by-column field; see VERIFICATION.md for rect-position disambiguation of this row)"
    },
    {
      "name": "departurePort",
      "label": "Departure to PNG — Port",
      "type": "string",
      "required": false,
      "sourceRef": "Page 1, TRAVEL ARRANGEMENTS — \"Departure to PNG\" \"Port:\""
    },
    {
      "name": "departureDate",
      "label": "Departure to PNG — Date",
      "type": "date",
      "required": false,
      "sourceRef": "Page 1, TRAVEL ARRANGEMENTS — \"Departure to PNG\" \"Date:\""
    },
    {
      "name": "arrivalPortInPNG",
      "label": "Arrival in PNG — Port",
      "type": "string",
      "required": false,
      "sourceRef": "Page 1, TRAVEL ARRANGEMENTS — \"Arrival in PNG\" \"Port:\""
    },
    {
      "name": "arrivalDateInPNG",
      "label": "Arrival in PNG — Date",
      "type": "date",
      "required": false,
      "sourceRef": "Page 1, TRAVEL ARRANGEMENTS — \"Arrival in PNG\" \"Date:\""
    },
    {
      "name": "sponsorEmploymentLetterAttached",
      "label": "Letter of Offer of Employment from PNG Sponsor Attached",
      "type": "boolean",
      "required": false,
      "requiredWhen": {
        "field": "applicationType",
        "equals": "WORKING_RESIDENT"
      },
      "description": "Confirmation checkbox for an employment-purpose supporting document; see the matching sponsorEmploymentLetter documents[] entry. applicationType == WORKING_RESIDENT is this schema's own inferred gate for the page's \"for the purpose of employment\" heading — see VERIFICATION.md.",
      "sourceRef": "Page 2 — \"For entry for the purpose of employment: Please attach copies of the following documents: A letter of offer of employment from your PNG sponsor\""
    },
    {
      "name": "workPermitApprovalAttached",
      "label": "Work Permit Approval Letter Attached",
      "type": "boolean",
      "required": false,
      "requiredWhen": {
        "field": "applicationType",
        "equals": "WORKING_RESIDENT"
      },
      "sourceRef": "Page 2 — \"The letter of approval of your work permit, including the work permit number, position number and expiry date.\""
    },
    {
      "name": "medicalCertificateAttached",
      "label": "Medical Certificate, Chest X-ray, and HIV Test Result Attached",
      "type": "boolean",
      "required": false,
      "requiredWhen": {
        "field": "applicationType",
        "equals": "WORKING_RESIDENT"
      },
      "sourceRef": "Page 2 — \"A certificate of good health from a registered doctor, a recent chest X-ray and the result of the recent HIV test.\""
    },
    {
      "name": "policeClearanceAttached",
      "label": "Police Good-Character Statement Attached",
      "type": "boolean",
      "required": false,
      "requiredWhen": {
        "field": "applicationType",
        "equals": "WORKING_RESIDENT"
      },
      "sourceRef": "Page 2 — \"A statement of your good character from your local police authorities.\""
    },
    {
      "name": "fundedBySalary",
      "label": "Stay Funded by Salary",
      "type": "boolean",
      "required": false,
      "description": "Independent, non-exclusive checkbox — left ungated (bare-optional) since the requiredWhen grammar cannot express an \"at least one of these four\" constraint without overreaching what the form itself states; see VERIFICATION.md.",
      "sourceRef": "Page 2 — \"For all other types of entry: How will you be funding your Stay in PNG?\" \"Salary\""
    },
    {
      "name": "fundedByCompanySponsor",
      "label": "Stay Funded by Company Sponsor",
      "type": "boolean",
      "required": false,
      "sourceRef": "Page 2 — \"How will you be funding your Stay in PNG?\" \"Company Sponsor\""
    },
    {
      "name": "fundedByOwnFunds",
      "label": "Stay Funded by Own Funds",
      "type": "boolean",
      "required": false,
      "sourceRef": "Page 2 — \"How will you be funding your Stay in PNG?\" \"Own funds\""
    },
    {
      "name": "fundedByFamily",
      "label": "Stay Funded by Family",
      "type": "boolean",
      "required": false,
      "sourceRef": "Page 2 — \"How will you be funding your Stay in PNG?\" \"Family\""
    },
    {
      "name": "hasChangedNameOrAlias",
      "label": "Have You Ever Changed Your Name or Are You Known by an Alias?",
      "type": "boolean",
      "required": true,
      "description": "Directly-supplied gate splitting one combined prose sentence into its own subsection trigger; see VERIFICATION.md.",
      "sourceRef": "Page 2 — \"If you have ever change your name, are known by an alias, or own another passport, please provide details:\" (PREVIOUS NAMES/ALIAS DETAILS subsection)"
    },
    {
      "name": "previousFamilyName",
      "label": "Previous Family Name",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasChangedNameOrAlias",
        "equals": true
      },
      "sourceRef": "Page 2, PREVIOUS NAMES/ALIAS DETAILS — \"Family Name\"",
      "classification": "pii"
    },
    {
      "name": "previousGivenNames",
      "label": "Previous Given Names",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasChangedNameOrAlias",
        "equals": true
      },
      "sourceRef": "Page 2, PREVIOUS NAMES/ALIAS DETAILS — \"Given Names\"",
      "classification": "pii"
    },
    {
      "name": "previousDateOfBirth",
      "label": "Previous Record — Date of Birth",
      "type": "date",
      "required": false,
      "requiredWhen": {
        "field": "hasChangedNameOrAlias",
        "equals": true
      },
      "sourceRef": "Page 2, PREVIOUS NAMES/ALIAS DETAILS — \"Date of Birth\""
    },
    {
      "name": "previousSex",
      "label": "Previous Record — Sex",
      "type": "enum",
      "required": false,
      "requiredWhen": {
        "field": "hasChangedNameOrAlias",
        "equals": true
      },
      "description": "A Ch (combo-box) dropdown with a blank first option, then F/M; normalised to this schema's own MALE/FEMALE vocabulary for cross-field consistency with the top-level sex field. See VERIFICATION.md.",
      "validation": {
        "enum": [
          "MALE",
          "FEMALE"
        ]
      },
      "sourceRef": "Page 2, PREVIOUS NAMES/ALIAS DETAILS — \"Sex\" (dropdown)"
    },
    {
      "name": "previousMaritalStatus",
      "label": "Previous Record — Marital Status",
      "type": "enum",
      "required": false,
      "requiredWhen": {
        "field": "hasChangedNameOrAlias",
        "equals": true
      },
      "description": "A Ch (combo-box) dropdown with a blank first option, then Married/Never married/Divorced/Widowed/De-facto; normalised to this schema's own maritalStatus vocabulary. See VERIFICATION.md.",
      "validation": {
        "enum": [
          "MARRIED",
          "NEVER_MARRIED",
          "DIVORCED",
          "WIDOWED",
          "DE_FACTO"
        ]
      },
      "sourceRef": "Page 2, PREVIOUS NAMES/ALIAS DETAILS — \"Marital Status\" (dropdown)"
    },
    {
      "name": "hasOtherPassport",
      "label": "Do You Hold Another Passport?",
      "type": "boolean",
      "required": true,
      "description": "Directly-supplied gate splitting the same combined prose sentence as hasChangedNameOrAlias into its own subsection trigger; see VERIFICATION.md.",
      "sourceRef": "Page 2 — \"...or own another passport, please provide details:\" (OTHER PASSPORTS subsection)"
    },
    {
      "name": "otherPassportCountry",
      "label": "Other Passport — Country of Issue",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasOtherPassport",
        "equals": true
      },
      "sourceRef": "Page 2, OTHER PASSPORTS — \"Country of Issue\""
    },
    {
      "name": "otherPassportNumber",
      "label": "Other Passport — Number",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasOtherPassport",
        "equals": true
      },
      "sourceRef": "Page 2, OTHER PASSPORTS — \"Passport Number\"",
      "classification": "sensitive-pii"
    },
    {
      "name": "otherPassportExpiryDate",
      "label": "Other Passport — Expiry Date",
      "type": "date",
      "required": false,
      "requiredWhen": {
        "field": "hasOtherPassport",
        "equals": true
      },
      "sourceRef": "Page 2, OTHER PASSPORTS — \"Passport Expiry Date\""
    },
    {
      "name": "hasOrganisationalSponsor",
      "label": "Do You Have an Organisational Sponsor?",
      "type": "boolean",
      "required": true,
      "description": "Directly-supplied gate for the ORGANISATIONAL SPONSOR block, which the form prints no explicit yes/no question for; see VERIFICATION.md.",
      "sourceRef": "Page 2 heading — \"ORGANISATIONAL SPONSOR\""
    },
    {
      "name": "organisationalSponsorName",
      "label": "Organisational Sponsor — Name",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasOrganisationalSponsor",
        "equals": true
      },
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR — \"Organisational Name\""
    },
    {
      "name": "sponsorAgentName",
      "label": "Organisational Sponsor — Agent Name",
      "type": "string",
      "required": false,
      "description": "Bare-optional even when hasOrganisationalSponsor is true; see VERIFICATION.md.",
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR — \"Agent\"",
      "classification": "pii"
    },
    {
      "name": "sponsorStreetAddress",
      "label": "Organisational Sponsor — Contact Address (Number and Street)",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasOrganisationalSponsor",
        "equals": true
      },
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR — \"Contact Address Number and Street\""
    },
    {
      "name": "sponsorSuburbTown",
      "label": "Organisational Sponsor — Suburb/Town",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR — \"Suburb/Town\""
    },
    {
      "name": "sponsorStateProvince",
      "label": "Organisational Sponsor — State/Province",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR — \"State/Province\""
    },
    {
      "name": "sponsorPostcode",
      "label": "Organisational Sponsor — Postcode",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR — \"Postcode\""
    },
    {
      "name": "sponsorCountry",
      "label": "Organisational Sponsor — Country",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasOrganisationalSponsor",
        "equals": true
      },
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR — \"Country\""
    },
    {
      "name": "sponsorBusinessTelephone",
      "label": "Organisational Sponsor — Business Telephone",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR — \"Business Telephone\""
    },
    {
      "name": "sponsorFax",
      "label": "Organisational Sponsor — Facsimile",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR — \"Facsimile\""
    },
    {
      "name": "visitedPNGBefore",
      "label": "Have You Visited PNG Before?",
      "type": "boolean",
      "required": true,
      "sourceRef": "Page 2 — \"Have you visited PNG before? Yes / No\""
    },
    {
      "name": "previousVisitDate",
      "label": "Date of Last Visit to PNG",
      "type": "date",
      "required": false,
      "requiredWhen": {
        "field": "visitedPNGBefore",
        "equals": true
      },
      "sourceRef": "Page 2 — \"If yes please give details of your last visit.\" \"Date\""
    },
    {
      "name": "purposeOfPreviousVisit",
      "label": "Purpose of Previous Visit",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "visitedPNGBefore",
        "equals": true
      },
      "sourceRef": "Page 2 — \"Purpose of visit\""
    },
    {
      "name": "durationOfPreviousVisit",
      "label": "Duration of Previous Visit",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "visitedPNGBefore",
        "equals": true
      },
      "sourceRef": "Page 2 — \"Duration of visit\""
    },
    {
      "name": "addressDuringPreviousVisit",
      "label": "Address During Previous Stay",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "visitedPNGBefore",
        "equals": true
      },
      "sourceRef": "Page 2 — \"Address during stay\""
    },
    {
      "name": "hasCriminalConviction",
      "label": "Have You Ever Been Charged With or Convicted of a Criminal Offence?",
      "type": "boolean",
      "required": true,
      "sourceRef": "Page 2 — \"Have you ever been charged with or convicted of a criminal offence: Yes / No\""
    },
    {
      "name": "criminalHistoryDetails",
      "label": "Criminal History Details",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasCriminalConviction",
        "equals": true
      },
      "sourceRef": "Page 2 — \"If yes, please give details of the date, nature of offence, place of conviction and the penalty imposed\""
    },
    {
      "name": "hasBeenDeportedOrRefusedEntry",
      "label": "Have You Been Deported From, or Refused Entry To, Papua New Guinea or Any Other Country?",
      "type": "boolean",
      "required": true,
      "sourceRef": "Page 2 — \"Have you been deported from, or refused entry to, Papua New Guinea, or any other country: Yes / No\""
    },
    {
      "name": "previousDeportationDetails",
      "label": "Deportation/Refused-Entry Details",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasBeenDeportedOrRefusedEntry",
        "equals": true
      },
      "sourceRef": "Page 2 — \"If yes, please give details.\" (deportation row)"
    },
    {
      "name": "hasMedicalConditionOrMentalHealthHistory",
      "label": "Have You Been a Patient in a Mental Home/Institution, or Do You Suffer From a Disease Which May Constitute a Health Risk in PNG?",
      "type": "boolean",
      "required": true,
      "sourceRef": "Page 2 — \"Have you been a patient in a mental home/institution, or do you suffer from a disease which may constitute a health risk in Papua New Guinea: Yes / No\"",
      "classification": "health"
    },
    {
      "name": "medicalConditionDetails",
      "label": "Medical Condition/Mental Health History Details",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasMedicalConditionOrMentalHealthHistory",
        "equals": true
      },
      "sourceRef": "Page 2 — \"If Yes, please give details.\" (medical/mental-health row)",
      "classification": "health"
    },
    {
      "name": "residentialStreetAddress",
      "label": "Residential Address — Number and Street",
      "type": "string",
      "required": true,
      "sourceRef": "Page 3 — \"RESIDENTIAL: Number and Street\"",
      "classification": "pii"
    },
    {
      "name": "residentialSuburbTown",
      "label": "Residential Address — Suburb/Town",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"Suburb/Town\" (residential row)",
      "classification": "pii"
    },
    {
      "name": "residentialStateProvince",
      "label": "Residential Address — State/Province",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"State/Province\" (residential row)"
    },
    {
      "name": "residentialPostcode",
      "label": "Residential Address — Postcode",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"Postcode\" (residential row)"
    },
    {
      "name": "residentialCountry",
      "label": "Residential Address — Country",
      "type": "string",
      "required": true,
      "sourceRef": "Page 3 — \"Country\" (residential row)",
      "classification": "pii"
    },
    {
      "name": "residentialHomeTelephone",
      "label": "Residential — Home Telephone",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"Home Telephone\" (residential row)",
      "classification": "pii"
    },
    {
      "name": "residentialMobileTelephone",
      "label": "Residential — Mobile Telephone",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"Mobile Telephone\" (residential row)",
      "classification": "pii"
    },
    {
      "name": "applicantContactEmail",
      "label": "Applicant's Contact Email Address",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"Your contact email address\"",
      "classification": "pii"
    },
    {
      "name": "agreeToEmailContact",
      "label": "Do You Agree to Receiving Communication by Email?",
      "type": "boolean",
      "required": false,
      "description": "Two independent checkboxes (Email_contact_allowed / Email_contact_not_allowed), collapsed into one boolean.",
      "sourceRef": "Page 3 — \"Do you agree to receiving communication by email? Yes / No\""
    },
    {
      "name": "pngStayStreetAddress",
      "label": "PNG Stay Address — Number and Street",
      "type": "string",
      "required": false,
      "description": "The address at which the applicant will stay while in PNG for this application, distinct from residentialStreetAddress (the applicant's usual/home address).",
      "sourceRef": "Page 3 — \"PNG: Number and Street\""
    },
    {
      "name": "pngStayTownVillage",
      "label": "PNG Stay Address — Town/Village",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"Town/Village\" (PNG stay row)"
    },
    {
      "name": "pngStayProvince",
      "label": "PNG Stay Address — Province",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"Province\" (PNG stay row)"
    },
    {
      "name": "pngStayPostalAddress",
      "label": "PNG Stay Address — Postal Address",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"Postal Address\" (PNG stay row)"
    },
    {
      "name": "pngStayHomeTelephone",
      "label": "PNG Stay — Home Telephone",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"Home Telephone\" (PNG stay row)"
    },
    {
      "name": "pngStayMobileTelephone",
      "label": "PNG Stay — Mobile Telephone",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3 — \"Mobile Telephone\" (PNG stay row)"
    },
    {
      "name": "emergencyContactFamilyName",
      "label": "Emergency Contact — Family Name",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3, EMERGENCY CONTACT — \"Family Name\"",
      "classification": "pii"
    },
    {
      "name": "emergencyContactGivenNames",
      "label": "Emergency Contact — Given Names",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3, EMERGENCY CONTACT — \"Given Names\"",
      "classification": "pii"
    },
    {
      "name": "emergencyContactRelationship",
      "label": "Emergency Contact — Relationship to Applicant",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3, EMERGENCY CONTACT — \"Relationship to Applicant\""
    },
    {
      "name": "emergencyContactStreetAddress",
      "label": "Emergency Contact — Contact Address (Number and Street)",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3, EMERGENCY CONTACT — \"Contact Address Number and Street\"",
      "classification": "pii"
    },
    {
      "name": "emergencyContactSuburbTown",
      "label": "Emergency Contact — Suburb/Town",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3, EMERGENCY CONTACT — \"Suburb/Town\""
    },
    {
      "name": "emergencyContactStateProvince",
      "label": "Emergency Contact — State/Province",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3, EMERGENCY CONTACT — \"State/Province\""
    },
    {
      "name": "emergencyContactPostcode",
      "label": "Emergency Contact — Postcode",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3, EMERGENCY CONTACT — \"Postcode\""
    },
    {
      "name": "emergencyContactCountry",
      "label": "Emergency Contact — Country",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3, EMERGENCY CONTACT — \"Country\""
    },
    {
      "name": "emergencyContactHomeTelephone",
      "label": "Emergency Contact — Home Telephone",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3, EMERGENCY CONTACT — \"Home Telephone\"",
      "classification": "pii"
    },
    {
      "name": "emergencyContactMobileTelephone",
      "label": "Emergency Contact — Mobile Telephone",
      "type": "string",
      "required": false,
      "sourceRef": "Page 3, EMERGENCY CONTACT — \"Mobile Telephone\"",
      "classification": "pii"
    },
    {
      "name": "declarationSignedDate",
      "label": "Declaration — Date Signed",
      "type": "date",
      "required": true,
      "sourceRef": "Page 3, DECLARATION — \"Date:\""
    },
    {
      "name": "applicantPhotograph",
      "label": "Applicant's Photograph",
      "type": "file",
      "required": true,
      "description": "Backed by a genuine AcroForm image-insertion pushbutton widget (Insert_photograph_here, pushButton:true, isTooltipOnly:true) — not a checkbox or text field. No photo size/background specification is printed anywhere on this specimen (unlike pg/ica/passport-application's own detailed Instruction 9).",
      "sourceRef": "Page 3, DECLARATION — \"Photograph\" box"
    },
    {
      "name": "applicantOrGuardianSignatureImage",
      "label": "Signature of Applicant/Parents/Guardian",
      "type": "file",
      "required": true,
      "description": "Backed by a genuine AcroForm image-insertion pushbutton widget (Insert_signature_image_here, pushButton:true, isTooltipOnly:true), unlike pg/ica/passport-application, which carries no signature widget of any kind. Instruction 1 states both parents must sign for a child under 16, but only this one signature widget exists anywhere on the specimen — a genuine content gap in the source, not an omission of this schema; see VERIFICATION.md.",
      "sourceRef": "Page 3, DECLARATION — \"Signature of Applicant/Parents/Guardian:\""
    }
  ],
  "steps": [
    {
      "id": "purpose_and_stay",
      "title": "Page 1: Purpose of Visit and Length of Stay",
      "next": "personal_particulars",
      "fields": [
        "applicationType",
        "requestedStayDays",
        "requestedStayMonths",
        "requestedStayYears"
      ]
    },
    {
      "id": "personal_particulars",
      "title": "Page 1: Personal Details",
      "next": "passport_details",
      "fields": [
        "familyName",
        "givenNames",
        "dateOfBirth",
        "sex",
        "maritalStatus",
        "nationality",
        "countryOfBirth",
        "occupation"
      ]
    },
    {
      "id": "passport_details",
      "title": "Page 1: Passport Particulars",
      "next": "travel_arrangements",
      "fields": [
        "passportNumber",
        "passportExpiryDate",
        "passportIssueDate",
        "passportIssuingPlace",
        "passportIssuingAuthority"
      ]
    },
    {
      "id": "travel_arrangements",
      "title": "Page 1: Travel Arrangements",
      "next": "employment_and_funding",
      "fields": [
        "vesselOrFlightName",
        "departurePort",
        "departureDate",
        "arrivalPortInPNG",
        "arrivalDateInPNG"
      ]
    },
    {
      "id": "employment_and_funding",
      "title": "Page 2: Employment-Purpose Documents and Stay-Funding Source",
      "next": "previous_names_and_passports",
      "fields": [
        "sponsorEmploymentLetterAttached",
        "workPermitApprovalAttached",
        "medicalCertificateAttached",
        "policeClearanceAttached",
        "fundedBySalary",
        "fundedByCompanySponsor",
        "fundedByOwnFunds",
        "fundedByFamily"
      ]
    },
    {
      "id": "previous_names_and_passports",
      "title": "Page 2: Previous Names/Alias and Other Passports",
      "next": "organisational_sponsor",
      "fields": [
        "hasChangedNameOrAlias",
        "previousFamilyName",
        "previousGivenNames",
        "previousDateOfBirth",
        "previousSex",
        "previousMaritalStatus",
        "hasOtherPassport",
        "otherPassportCountry",
        "otherPassportNumber",
        "otherPassportExpiryDate"
      ]
    },
    {
      "id": "organisational_sponsor",
      "title": "Page 2: Organisational Sponsor",
      "next": "visit_and_background_history",
      "fields": [
        "hasOrganisationalSponsor",
        "organisationalSponsorName",
        "sponsorAgentName",
        "sponsorStreetAddress",
        "sponsorSuburbTown",
        "sponsorStateProvince",
        "sponsorPostcode",
        "sponsorCountry",
        "sponsorBusinessTelephone",
        "sponsorFax"
      ]
    },
    {
      "id": "visit_and_background_history",
      "title": "Page 2: Prior Visit, Criminal, Deportation, and Health History",
      "next": "residential_address_and_contact",
      "fields": [
        "visitedPNGBefore",
        "previousVisitDate",
        "purposeOfPreviousVisit",
        "durationOfPreviousVisit",
        "addressDuringPreviousVisit",
        "hasCriminalConviction",
        "criminalHistoryDetails",
        "hasBeenDeportedOrRefusedEntry",
        "previousDeportationDetails",
        "hasMedicalConditionOrMentalHealthHistory",
        "medicalConditionDetails"
      ]
    },
    {
      "id": "residential_address_and_contact",
      "title": "Page 3: Residential Address and Contact Details",
      "next": "png_stay_address",
      "fields": [
        "residentialStreetAddress",
        "residentialSuburbTown",
        "residentialStateProvince",
        "residentialPostcode",
        "residentialCountry",
        "residentialHomeTelephone",
        "residentialMobileTelephone",
        "applicantContactEmail",
        "agreeToEmailContact"
      ]
    },
    {
      "id": "png_stay_address",
      "title": "Page 3: Address During Stay in PNG",
      "next": "emergency_contact",
      "fields": [
        "pngStayStreetAddress",
        "pngStayTownVillage",
        "pngStayProvince",
        "pngStayPostalAddress",
        "pngStayHomeTelephone",
        "pngStayMobileTelephone"
      ]
    },
    {
      "id": "emergency_contact",
      "title": "Page 3: Emergency Contact",
      "next": "declaration",
      "fields": [
        "emergencyContactFamilyName",
        "emergencyContactGivenNames",
        "emergencyContactRelationship",
        "emergencyContactStreetAddress",
        "emergencyContactSuburbTown",
        "emergencyContactStateProvince",
        "emergencyContactPostcode",
        "emergencyContactCountry",
        "emergencyContactHomeTelephone",
        "emergencyContactMobileTelephone"
      ]
    },
    {
      "id": "declaration",
      "title": "Page 3: Declaration",
      "fields": [
        "declarationSignedDate",
        "applicantPhotograph",
        "applicantOrGuardianSignatureImage"
      ]
    }
  ],
  "documents": [
    {
      "id": "applicantPassport",
      "label": "Applicant's passport (the physical document, sent with the form)",
      "category": "identity-document",
      "required": true,
      "belongsTo": "applicant",
      "sourceRef": "Instruction 3 — \"The completed form and the applicant's passport should be sent to: The Chief Migration Officer, Immigration and Citizenship Service Authority, PO Box 1790, BOROKO, NCD, Papua New Guinea\""
    },
    {
      "id": "sponsorEmploymentLetter",
      "label": "Letter of offer of employment from PNG sponsor",
      "category": "supporting-evidence",
      "required": false,
      "requiredWhen": {
        "field": "applicationType",
        "equals": "WORKING_RESIDENT"
      },
      "belongsTo": "applicant",
      "sourceRef": "Page 2 — \"For entry for the purpose of employment: Please attach copies of the following documents: A letter of offer of employment from your PNG sponsor\""
    },
    {
      "id": "workPermitApprovalLetter",
      "label": "Letter of approval of work permit, including permit number, position number, and expiry date",
      "category": "supporting-evidence",
      "required": false,
      "requiredWhen": {
        "field": "applicationType",
        "equals": "WORKING_RESIDENT"
      },
      "belongsTo": "applicant",
      "sourceRef": "Page 2 — \"The letter of approval of your work permit, including the work permit number, position number and expiry date.\""
    },
    {
      "id": "medicalCertificateXrayHivResult",
      "label": "Certificate of good health, recent chest X-ray, and recent HIV test result",
      "category": "supporting-evidence",
      "required": false,
      "requiredWhen": {
        "field": "applicationType",
        "equals": "WORKING_RESIDENT"
      },
      "belongsTo": "applicant",
      "sourceRef": "Page 2 — \"A certificate of good health from a registered doctor, a recent chest X-ray and the result of the recent HIV test.\""
    },
    {
      "id": "policeCharacterStatement",
      "label": "Statement of good character from local police authorities",
      "category": "supporting-evidence",
      "required": false,
      "requiredWhen": {
        "field": "applicationType",
        "equals": "WORKING_RESIDENT"
      },
      "belongsTo": "applicant",
      "sourceRef": "Page 2 — \"A statement of your good character from your local police authorities.\""
    },
    {
      "id": "applicantDeclaration",
      "label": "Applicant's (or parents'/guardian's) signed Declaration",
      "category": "attestation",
      "required": true,
      "statement": "By signing this form, I declare that the information provided on the form is true and correct at I have disclosed all information that may be relevant to determining whether I should be granted an entry permit to travel to and stay in Papua New Guinea. I am aware it is a criminal offence to provide information in this application which is false or misleading.",
      "sourceRef": "Page 3, DECLARATION (quoted verbatim, sic — see VERIFICATION.md)"
    }
  ],
  "crossFieldValidation": [
    {
      "id": "passportExpiryNotBeforeIssue",
      "compare": {
        "field": "passportExpiryDate",
        "operator": "greaterThanOrEqual",
        "compareTo": "passportIssueDate"
      }
    }
  ]
}
