############################################################
#
#	STANDARDISE ADDRESSES
#
#	Generic file, to be included by other files,
#		the heart of the Geocode grammar file.
#	The including file must:
#		Define output fields
#		Define output fields or variables with the names of the PAF fields
#		Conclude the POST_PARSE section
#		Set variable sPOI - Point of Interest files to use (if AU_POI defined)
#
#	Included by:
#		ABSGeocode.grm, AdminGeocode.grm, ArfGeocode, ATF.grm, DpidDefault.grm,
#		DpidGeocode.grm, EAArfGeocode.grm, PLIGeocode.grm, RecordFormat.grm,
#		RuleIsValidAddress.grm, _ArfGeocode.grm, _DpidGeocode.grm, ...
#	Includer file can define the following:
#		ARFCHOICE - choice of ARF (need to set sDatabase to name of ARF)
#		CHOOSEARF - ARFCHOICE for SECOND_PASS
#		sARF_NAME - name of ARF to preload (requires ARFCHOICE)
#			sARF_NAME2 - optional 2nd ARF to preload (requires sARF_NAME)
#		USENONPAFARF - to use list of localities from Gnaf*.txt files
#		NO_SORTPLANS - don't calculate Australia Post's sort plans numbers
#		SKIP_DPID_LOOKUP
#		DontPutDidInDpid
#		LOOKUPFLAG - which address items to leave unchanged (see below)
#		LOOK_FOR_HOUSE_PREFIX - also requires HousePrefixTable
#		NO_MISSING_LEVEL_NUMBER - only parse "level" if have a level number
#		NO_ALPHA_UNIT_NUMBERS - don't parse alpha unit/level numbers
#		POSTAL_OR_STREET_NOT_BOTH
#		PREFER_STREET_TO_POSTAL
#		RETURN_BOTH_STREET_AND_POSTAL_FIELDS - only if PREFER_STREET_TO_POSTAL
#		ALLOW_MISSING_POSTAL_NUMBER [24Aug07]
#		OPTIONAL_UNIT_NO [Oct07]
#		PRESERVE_CASE_IN_PRE_ADDRESS [Nov08]
#		EXPAND_STREET_ABBRS [Dec08]
#		DONT_EXPAND_UNIT_ABBRS [Jul10]
#		RETURN_BOTH_CORNER_STREETS_IN_STREET_NAME [Jan09]
#		ALLOW_UNIT_WITHOUT_SLASH [Mar09]
#		ALLOW_UNIT_WITHOUT_SLASH2 [Jun09] - allows a tab
#		PARSE_LOCALITY_NOSPACE_PCODE [Jun09] - but won't parse numeric locs
#		BLOCK_IS_LEVEL_TYPE [Jul09] - recognises "Block" as level type
#		SECOND_PASS [Jul09] - included by AddressEnhancer type grammar
#		ALPHANUM_ROOM_NUMBER [Sep09] - allow alphanumeric room numbers
#		NO_BUILDING_IN_ADDRESS_LINES [Jan10]
#		PARSE_BUILDING_NAME_IN_QUOTES [Feb10]
#		ALWAYS_HAVE_UNIT_TYPE_IN_ADDRESS_LINES [Dec10]
#		ALWAYS_FORMAT_ADDRESS - even if not valid address [Jul09]
#		USE_SITE_FORMAT_ADDRESS [Mar09]
#		IGNORE_POST_ADDRESS	- don't copy post-address into address lines
#		IGNORE_PRE_ADDRESS  - don't copy pre-address into address lines
#		CLEAR_PRE_ADDRESS - remove pre/post address after copying into address lines
#		LOCALITYASPOSTADDRESS
#		REMOVE_QUOTES_FROM_PRE_ADDRESS - and post address [Feb10]
#		USE_SHORT_FLAT_TYPE
#		(USE_FULL_STREET_TYPE - replaced by EXPAND_STREET_ABBRS)
#		ALLOW_COMMA_IN_STREET_ADDRESS - eg. "Level, 7; 35, spring, st"
#		PARSE_UNIT_HOUSENUM_BUILDING [Apr14]
#		PARSE_CAPITAL_CITY [Apr14]
#		PARSE_DOUBLE_STREET [May14]
#		ZERO_NOT_A_NUMBER [Nov14]
#	IF ARFCHOICE or CHOOSEARF defined, includer file needs to set variables:
#		iLenient, sDatabase, sGIFields
#
#	[Best view with tab spacing 4]
#
############################################################

\DEFINE ZERO_NOT_A_NUMBER

#\TABLE RemoveList
#XXX

# first pass grammars can define ARFCHOICE (eg. ArfGeocode)
# 2nd pass grammars can define CHOOSEARF (eg. ArfEnhancer)
# If either of these is defined, we want define ARFCHOICE_OR_CHOOSEARF
\IFDEF ARFCHOICE
	\IFDEF SECOND_PASS
		\ERROR: Not expecting ARFCHOICE with SECOND_PASS
	\ELSE
		\DEFINE ARFCHOICE_OR_CHOOSEARF
	\ENDIF
\ENDIF

\IFDEF CHOOSEARF
	\IFNDEF SECOND_PASS
		\ERROR: Not expecting CHOSSEARF without SECOND_PASS
	\ELSE
		\DEFINE ARFCHOICE_OR_CHOOSEARF
	\ENDIF
\ENDIF

\IFDEF ARFCHOICE
	\IFNDEF SKIP_DPID_LOOKUP
		\SUB_GRAMMARS
		ArfEnhancer	ArfEnhancer.grm
	\ENDIF
\ENDIF

\IFDEF USE_SITE_FORMAT_ADDRESS
	\SUB_GRAMMARS
		Site_FormatAddress Site_FormatAddress.grm
\ENDIF

\PARAMETERS
CorrectSynonym	# set to True or False [Feb13]

# output fields before formatting (have underscore at end)
\VARIABLES
3	State_
4 	Pcode_
50 	Locality_
50	StreetName_
13	StreetType_
13	StreetSuffix_
11	PostalType_
14	Dpid_ # AddressId_
	# size 10 incase leading zeros
10	HouseNo1_
1	HouseSuffix1_
10	HouseNo2_
1	HouseSuffix2_
13	FlatType_
10	FlatNo_
13	LevelType_
10	LevelNo_
50	BuildingName1_
30	BuildingName2_
10	LotNo_
10	PostalNo_
3	PostalPrefix_
3	PostalSuffix_
#others (returned from AllocateDpid)
1	PrimaryPointFlag_
1	SynonymFlag_
46	Synonym_
1	FinalAddressFlag_
46	BorderName_
4	BorderPostcode_
30	AltStName_
13	AltStType_
13	AltStSuf_
8	LocalityDID_
8	GroupDID_
10	Flag_	# amended or error and why
30	AmendedFlag_ # how amended (or more detail on error flag)
100	DummyPre     # returned from ArfEnhancer, not returned from iPaf32
100	DummyPost    # "
1	Dummy3
50	Addr3_		# {                                     [Mar14] }
50	Addr1_		# { returned from ArfEnhancer as AddressLine1-3 } Latitude_
50	Addr2_		# { not returned from iPaf32 [Mar08]            } Longitude_
20	GIFlags_	# from where GIF fields taken
60	GIField1
60	GIField2
60	GIField3
60	GIField4
60	GIField5
60	GIField6
60	GIField7
60	GIField8
60	GIField9
60	GIField10
60	GIField11	# see nGifFields
60	GIField12
60	GIField13
60	GIField14
60	GIField15
60	GIField16
60	GIField17
60	GIField18
60	GIField19
60	GIField20

#others cont.
100	PreAddress1_
100	PreAddress2_
50	Address1_	# formatted address. 3-field array [May07]
50	Address2_	# "
50	Address3_	# "
100	PostAddress_
37	Barcode37_
100	FoundFullLocality
100	sPafError
10	sInputFlatType
10	sInputFlatNo
100	sInputStreet
30	s2
30	s3
4	sPostcode
10	HousePrefix_

1	ExtraInputs # dummy positioner for array begining
6	sFlag
50	sLocality2
	sStreetType2
40	sFullStreetName
	sOtherOptions # (S, L, A, F) sStringComparisonOptions
	sStreet2Name
	sStreet2Type
30	sAmendFlag1
30	sAmendFlag2
10	sFlagTemp
1	S1
160	FlagString_	# [Apr11]

\IFDEF PRESERVE_CASE_IN_PRE_ADDRESS
	\GLOBAL_OPTION TABLE CASE_INSENSITIVE # as not converting input to UCase
\ENDIF

# abbreviations provided in the PAF files
\INCLUDE Code.txt
\INCLUDE AddressFormat.txt

\TABLE flagTable
	\INCLUDE DpidErrorCodes.txt
\TABLE amendedFlagTable
	\INCLUDE AmendedFlagCodes.txt

# These were previsously only in AddressEnhancer/Dpid3Pass
# (Perhaps we can also include them in the first pass)
\IFDEF SECOND_PASS

\TABLE states
AUSTRALIAN CAPITAL T=ACT

\TABLE flat_unit_type
TOWN HOUSE=TNHS
SH=SHOP

\TABLE building_level_type2
LEV=L
LV=L

\TABLE postal_delivery_type1
P M BAG=PRIVATE BAG
BOX=PO BOX
PO=PO BOX
P O=PO BOX
POST OFFICE=PO BOX
POST OFF BOX=PO BOX
# zero instead of o
PO B0X=PO BOX
P0 B0X=PO BOX
P0 BOX=PO BOX
P O B0X=PO BOX
P 0 B0X=PO BOX
P 0 BOX=PO BOX

\TABLE postal_delivery_type2
C/ POST OFFICE=CARE PO
C/0 POST OFFICE=CARE PO

#\TABLE street_types
#BLUF
#CRK
#CRTS
#DWNS
#FLTS
#HVN
#ID
#LGH
#MDWS
#PRRS
#VIEWS
#VLGE
#VLLY
#WTRS

\ENDIF

\IFDEF USENONPAFARF
	\TABLE localities
		\INCLUDE GnafLocalities.txt

	# these localities can get confused with street types,
	#  so only accept as locality if:
	#	a)exact spelling OR
	#	b)not divided from other locality information (pcode & state)
	\TABLE LocalitiesLikeStreetTypesTable
		\INCLUDE GnafLocsLikeStreetTypes.txt
		#\INCLUDE GnafLocalitiesLikeStreetTypes.txt

	\TABLE NumericStreetNamesTable
		\INCLUDE GnafNumericStreetNames.txt

\ELSE
	\TABLE localities
		\INCLUDE Localities.txt

	\TABLE LocalitiesLikeStreetTypesTable
		\INCLUDE LocsLikeStreetTypes.txt

	\TABLE NumericStreetNamesTable
		\INCLUDE NumericStreetNames.txt

\ENDIF

\IFDEF ARFCHOICE
	\TABLE locToPcodeTable
		\INCLUDE LocToPcodeNonPostal.txt
\ENDIF

\TABLE NumericBuildingNames # [Apr12]
	\IF FILE_EXISTS NumericBuildingNames.txt
		\INCLUDE NumericBuildingNames.txt
	\ENDIF

# common street names without street types [Oct09]
# (don't need to include "The Avenue" as Avenue is a street type)
\TABLE StreetNameNoTypeTable
BROADWAY
CENTREWAY
ESPLANADE
KINGSWAY
NORTHGATEWAY
RIVERWAY
THE HORSESHOE
THE PANORAMA
THE PENINSULA
THE PORT HOLE
THE WANDERER
VALE OF TRALEE

# locality prefixes and suffixes
\TABLE auxilliaryLocalityWords
NORTH
SOUTH
EAST
WEST
N=NORTH
S=SOUTH
E=EAST
W=WEST
NTH=NORTH
STH=SOUTH
WST=WEST

\TABLE preAuxilliaryLocalityWords
MOUNT
MT

\TABLE postAuxilliaryLocalityWords
BC
B C=BC
BUSINESS CENTRE=BC
DC
D C=DC
DELIVERY CENTRE=DC
LPO
L P O=LPO
MC
M C=MC
MAIL CENTRE=MC
MILPO
PO
POST OFFICE=PO
MDC
M D C=MDC
MAIL DELIVERY CENTRE=MDC
#GPO PRIVATE BOXES
#PRIVATE BOXES
HEIGHTS
HTS=HEIGHTS
HGTS=HEIGHTS
JUNCTION
JNCT=JUNCTION
# TODO? add these?
PARK
VIEW
GARDENS
#BEACH
#ISLAND
# [20Aug07]
PK=PARK
POINT
PT=POINT

# these are ignored
\TABLE PostLocalityWordTable
GENERAL BOXES
GPO PRIVATE BOXES
PO BOXES
PRIV BOXES
PRIVATE BOXES

\TABLE MailCentreTable
DELIVERY CENTRE
MAIL CENTRE
MAIL DELIVERY CENTRE

\TABLE ordinals
1ST=FIRST
2ND=SECOND
3RD=THIRD
4TH=FOURTH
5TH=FIFTH
6TH=SIXTH
7TH=SEVENTH
8TH=EIGHTH
9TH=NINTH
10TH=TENTH
11TH=ELEVENTH
12TH=TWELFTH
13TH=THIRTEENTH
14TH=FOURTEENTH
15TH=FIFTEENTH
16TH=SIXTEENTH
17TH=SEVENTEENTH
18TH=EIGHTEENTH
19TH=NINTEENTH
20TH=TWENTIETH
21ST=TWENTYFIRST
22ND=TWENTYSECOND
23RD=TWENTYTHIRD
24TH=TWENTYFOURTH
25TH=TWENTYFIFTH
26TH=TWENTYSIXTH
27TH=TWENTYSEVENTH
28TH=TWENTYEIGHTH
29TH=TWENTYNINTH
30TH=THIRIETH
31ST=THIRYFIRST
32ND=THIRTYSECOND

\TABLE ordinals2
FIRST=1
SECOND=2
THIRD=3
FOURTH=4
FIFTH=5
SIXTH=6
SEVENTH=7
EIGHTH=8
NINTH=9
TENTH=10

\TABLE lot
LOT
ALLOT
\IFDEF CUSTOM_FCS
LT
\ENDIF

\TABLE via
VIA

\TABLE careof
CARE OF=C/-
C/O=C/-
C/=C/-
C-=C/-
C/-
#added [Jun07]
C//=C/-
CO/=C/-
CO-=C/-

\TABLE AttnTable
ATTENTION
ATTN

\IFDEF USE_ALTERNATE_BULDINGTYPES
	\INCLUDE Site_Alternate_BuildingTypes.txt
\ELSE
# building types (1-with name before, 2-without)
\TABLE building_types1
#taken from looking at PAF building names
ACADEMY
AGED CARE
APARTMENTS
APTS
ARCADE
BLDG
BUILDING
CAMPUS
CHILD CARE
CARAVAN PARK
CENTRAL
CENTRE
CENTER
CHILDCARE
CHURCH
CLUB
CENTR=CENTRE
CNTR=CENTRE
CNTRE=CENTRE
COLLEGE
COMPLEX
COURT
COURTS
DAY CARE
FARM
FLATS
#HOME
HOME FOR THE AGED
HOME FOR AGED
#HOSTEL
HOSPITAL
#HOTEL
#HOUSE
INN
KINDER
KINDERGARTEN
KINDY
LODGE
#LPO
MOTEL
NURSING HOME
PARK
PLACE
PLAZA
POST OFFICE
PRE SCH
PRE-SCHOOL
PRESCHOOL
PRIMARY
PRIMARY SCH
PRISON
RESORT
SCHOOL
STATION
TAFE
UNITS
UNIVERSITY
VILLAGE
ZOO

#added - not from the paf
ARC=ARCADE
BLDNG=BUILDING
CEMETERY
CHAMBERS
CIAO
CT=COURT
#ESTATE
GARDENS
GDNS=GARDENS
HALL
HOME
HOSP=HOSPITAL
HOSTEL
HOTEL
HOUSE
MALL
MEWS
PL=PLACE
RANCH
RESTAURANT
S C=SHOPPING CENTRE
SHOPPING TOWN
SHOPPINGTOWN
TOWER
TOWERS
TWRS=TWRS
VILLAS
VLGE=VILLAGE
#SHOPPINGTOWN

#medical faculties added
SERVICE
CTR=CENTRE
MED CTR=CENTRE
HLTH SERV=HEALTH SERVICE
HLTH SRV=HEALTH SERVICE
HLTH PRAC=HEALTH PRACTICE
HLTH SVCE=HEALTH SERVICE
HLTH CARE=HEALTH CARE
SERVICES
CLINIC
CLINICS

\TABLE building_types2
#not from the PAF
HOUSE
VILLAGE
FARM
#GLEN
LODGE
RANCH
RESIDENCE
BRAE
MEWS
BLK
#WESTFIELD

\ENDIF #USE_ALTERNATE_BULDINGTYPES

\TABLE sureLevelTypesTable
LEVEL=L
FLOOR=FL

\TABLE sureLevelType3Table
BASEMENT=B
GROUND FLOOR=G
LOWER GROUND FLOOR=LG
MEZZANINE=M
UPPER GROUND FLOOR=UG

\TABLE suiteOrShopTable
SE
STE=SE
SU=SE
SUIT=SE
SUITE=SE
SHOP

\TABLE sureUnitTypesTable
APARTMENT=APT
FLAT=F
SUITE=SE
SHOP
UNIT=U

\TABLE roomTable
ROOM=RM
RM

\TABLE PluralUnitTypeTable
APARTMENTS=APT
FLATS=F
SUITES=SE
SHOPS=SHOP
UNITS=U

\TABLE cornerTable
CNR
CORNER
CNR OF=CNR
CORNER OF=CORNER
CRN=CNR
CRN OF=CNR

\TABLE PluralStTypeTable
STREETS=ST
ROADS=RD
AVENUES=AVE
DRIVES=DR

\TABLE postal_delivery_type1a # Custom [Sep08]
0 O BOX=PO BOX

\IFDEF BLOCK_IS_LEVEL_TYPE
\TABLE building_level_type2
BLK=BL
BLOCK=BL

\TABLE expandLevelTable
BL=Block
\ENDIF

\TABLE blockTable
BLOCK
BLK=BLOCK

\TABLE CapitalCityTable
\IFDEF PARSE_CAPITAL_CITY
SYDNEY=NSW
MELBOURNE=VIC
PERTH=WA
BRISBANE=QLD
ADELAIDE=SA
HOBART=TAS
DARWIN=NT
CANBERRA=ACT
\ENDIF

\VARIABLES
50	sLoc
	sL1	# also used as array
	sL2
	sL3
	sL4
	sL5
	sL6
	sL7
	sL8
	sDummy
	sTemp
255	sTemp3
1	sSuffix
500	sFullPaf
255	sFullPafForFormat
1	sDelim
50	sCareof
3	sVia
100	sPreAddress
	sFullStreetSuffix
	sFullStreetType2
	sTempPcode
	sTempStreetType
	sTempLot
50	sBuildingName
7	sSureUnitType
10	sSureUnitNo
2	sSureLevelType
10	sSureLevelNo
	sCorner
100	sId
	sStreetBeginFix
	sFullFlatType
	sFullPostalType
10	Flag_2
30	AmendedFlag_2
10	sFlag1
	sFirstFloorFix
	sCornerOrAnd
	sCornerAnd
	sBlock
	sBlockNum
	sFormatAddressOptions
	sBldg
	sSaveFlatType
	sStreetaddr1
	sStreetaddr2
	sPostaladdr
50	sLastAddressLine
sFlatType
sFlataddr
sLeveladdr
sStreetaddr
sBuildingaddr
sStreetName

sCapital
sCapitalState
# copy of street info for two streets [Feb07]
30	StreetName_Save
4	StreetType_Save	
2	StreetSuffix_Save
40	sFullStreetName_Save
	sStreetType2_Save
60	sFullStreetName2
	sSavePostalType
	sSavePostalNo
60	sBetweenStreetAndLocality # [27Aug07]

30	StreetName2 # [DI: 27May14]

sINPUT

\NUMERIC_VARIABLES
bSecondLocality
i
j
iPafError
iFlag
iFlag2
iNumARFFields
iLookupOk
bStreetOrLocalityMatch
bSecondStreet
bAddressReturned
i1
i2
i3
bSpaceInsteadOfSlash
b2ndPassSkipLookup
bLevelFix
nGifFields
nTotalPafFields
bAddressAndNoMatch
bInvalidAddress
bCornerStreetFormatting
bLotAndStreet
bMissingLevelNum
bTrue
bFalse
bDoIt
iLen1
iLen2
bCheckLoneLevel
bPL

\CONSTANTS
		# TODO include \v
	allPunctuation = " `~!@#$%^&*()-_+=\\|{}[]:'\";<>?,./\t\n\r\f"
		# TODO - why don't allow these punctuation marks?
	baseDelimiters = allPunctuation - "`~_\\|"
	numbers = "1234567890"
	baseDelimitersNumbers = numbers + baseDelimiters
	nonDividingDelimiters = baseDelimiters - expectedDivider - ",;"
	wordDelimiters = " \t.-&'/" - expectedDivider
	wordDelimiters2 = wordDelimiters + ","
		# street number cannot use dash, as it's used between street numbers
		#	(doesn't seem to make a difference) (in 3Pass didn't remove "-")
	streetNumDelimiters = baseDelimiters - "-"
		# appostrophe and dash used in names (in 3Pass didn't remove "'-")
	nameDelimiters = baseDelimiters - "'-"
		# /- used in care of
	careofDelimiters = baseDelimiters - "/-"
		# "&" can be used in building names
	buildingDelimiters = baseDelimiters - "&"
		# TODO why dont allow these punctuation
	\IFDEF ALLOW_COMMA_IN_STREET_ADDRESS
		streetAddressDelimiters = baseDelimiters - expectedDivider - "%&;<>"
	\ELSE
		streetAddressDelimiters = baseDelimiters - expectedDivider - "%&;<>,"
	\ENDIF
		# cannot have names divided over two lines
	innerNameDelimiters = nameDelimiters - expectedDivider
		# Q'LAND uses appostophe
	stateDelimiters = baseDelimitersNumbers - "'"
		# these two are used in post box type names (eg. C/- P O)
	pbtypeDelimiters = baseDelimitersNumbers - "/-"
		# don't know why using these only
	localityDelimiters = "\t ()-{}[]:'./" - expectedDivider
\IFDEF PARSE_LOCALITY_NOSPACE_PCODE
	locNameDelimiters = baseDelimitersNumbers
\ELSE
	locNameDelimiters = baseDelimiters
\ENDIF
		# character sets
\IFDEF PRESERVE_CASE_IN_PRE_ADDRESS
	letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
\ELSE
	letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
\ENDIF
	pbtypeCharset = letters + "/-"
		# error codes for iPaf32.dll
	errNoIPaf32 = "iPaf32 not found"
	errOpenPaf = "in opening PAF files"
	errGetDpid = "in allocating dpid"
		#
	s22Tabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
	sQuote = "\"" #"
	sTrim = " \t,"

# do we want to call OpenPaf & ClosePaf
\IFNDEF NO_SORTPLANS
	\DEFINE CALL_OPENPAF
\ENDIF
\IFNDEF ARFCHOICE_OR_CHOOSEARF
	\DEFINE CALL_OPENPAF
\ENDIF

\DLL iPaf32.dll				ONLOADERROR CONTINUE
	\IFDEF CALL_OPENPAF
		INITFUNC OpenPaf	NONZERO_ERROR CONTINUE
		FINALFUNC ClosePaf
		GetDpid					ONLOADERROR RETURN errNoIPaf32 \
								ONINITERROR TO iPafError RETURN errOpenPaf \
								NONZERO_ERROR TO iPafError RETURN errGetDpid
		GetDpidNonAmas			ONLOADERROR RETURN errNoIPaf32 \
								ONINITERROR TO iPafError RETURN errOpenPaf \
								NONZERO_ERROR TO iPafError RETURN errGetDpid
		PostcodeToBsp			NONZERO_ERROR	ONERROR RETURN ""
		PostcodeToNpsp			NONZERO_ERROR	ONERROR RETURN ""
	\ENDIF
	CallPafFromStan			NONZERO_ERROR TO iPafError
	DpidToBarcode			ONERROR RETURN ""	NONZERO_ERROR

# ---------- preload specified ARF
\IFDEF sARF_NAME

# for second pass, don't need to preload, as already preloaded by first pass
\IFNDEF SECOND_PASS

\IFNDEF ARFCHOICE
	\ERROR: need to define ARFCHOICE if defining sARF_NAME
\ENDIF

\GLOBAL_VARIABLES
sGlobalArfId
sGlobalArfId2

\INITIALIZE {
	#open the ARF to ensure that it stays open for the life time of the grammar
	sTemp = "OpenArf;Database=" + sARF_NAME
	sTemp = sTemp + ";"
	sGlobalArfId = CallPafFromStan(sTemp)
	# an error sets iPafError to non-zero or sGlobalArfId to "Error..."
	IF iPafError = 0
		sTemp = LEFT(sGlobalArfId, 5)
		IF sTemp = "Error"
			sGlobalArfId = ""
		END IF
	END IF

\IFDEF sARF_NAME2
	sTemp = "OpenArf;Database=" + sARF_NAME2
	sTemp = sTemp + ";"
	sGlobalArfId2 = CallPafFromStan(sTemp)
	# an error sets iPafError to non-zero or sGlobalArfId2 to "Error..."
	IF iPafError = 0
		sTemp = LEFT(sGlobalArfId2, 5)
		IF sTemp = "Error"
			sGlobalArfId2 = ""
		END IF
	END IF
\ENDIF #sARF_NAME2

}

\FINALIZE {
	IF sGlobalArfId <> ""
		sTemp = "CloseArf;Id=" + sGlobalArfId
		sTemp = sTemp + ";"
		CallPafFromStan(sTemp)
	END IF

\IFDEF sARF_NAME2
	IF sGlobalArfId2 <> ""
		sTemp = "CloseArf;Id=" + sGlobalArfId2
		sTemp = sTemp + ";"
		CallPafFromStan(sTemp)
	END IF
\ENDIF #sARF_NAME2
}

\ENDIF #SECOND_PASS
\ENDIF #sARF_NAME
# ----------

\PRE_PARSE {
	\IFNDEF PRESERVE_CASE_IN_PRE_ADDRESS
		INPUT = UCASE(INPUT)
	\ENDIF
	INPUT = REPLACE(INPUT, "`", "'")  # [Aug09]
	INPUT = TRIM(INPUT, " ,\t") # [Jun11]
	nGifFields = 20	# number of GIF fields [Jan10]
	nTotalPafFields = 42 + nGifFields	# total fields returned from DLL
	bTrue = 1
	bFalse = 0
	# fix for P/L (sometimes understood as P/Level) [Oct13]
	i = INSTR(INPUT, "P/L")
	IF i > 0
		bPL = bTrue
		# ensure whole words (eg. not XP/L)
		IF i > 1
			j = i - 1
			sTemp = MID(INPUT, j, 1)
			j = INSTR(letters, sTemp)
			IF j > 0
				bPL = bFalse
			END IF
		END IF
		# ensure whole words (eg. not P/LX)
		IF bPL = bTrue
			j = i + 3
			sTemp = MID(INPUT, j, 1)
			j = INSTR(letters, sTemp)
			IF j > 0
				bPL = bFalse
			END IF
		END IF
		# change P/L to P/LTD
		IF bPL = bTrue
			j = i + 3
			sTemp = MID(INPUT, j) # after the P/L
			j = i + 2
			INPUT = LEFT(INPUT, j) # till P/L, inclusive
			INPUT = INPUT + "TD" # P/L -> P/LTD
			INPUT = INPUT + sTemp
		END IF
	END IF
}

\GRAMMAR
Word		: WORD2
Words		: Word Word Word Word Word DELIMITERS wordDelimiters
			: Word? Word Word Word DELIMITERS wordDelimiters
			: Word? Word DELIMITERS wordDelimiters
			: TABLE ordinals
# locality
AuxLoc		: TABLE auxilliaryLocalityWords DELIMITERS stateDelimiters \
				TOLERANCE1 4
PostAuxLoc	: TABLE postAuxilliaryLocalityWords TOLERANCE1 6
PostLocWord	: TABLE PostLocalityWordTable
MailCentre	: TABLE MailCentreTable !  DELIMITERS baseDelimiters TOLERANCE2 2 \
			INNER_DELIMITERS nonDividingDelimiters
PreAuxLoc	: TABLE preAuxilliaryLocalityWords TOLERANCE1 5
Via			: TABLE via
			# for AMAS 2003, ignoring all punctuation in locality names
Locality	: TABLE localities !  DELIMITERS locNameDelimiters TOLERANCE2 2	\
			INNER_DELIMITERS nonDividingDelimiters
			: TABLE_SINGLE_WORDS LocalitiesLikeStreetTypesTable ! \
			DELIMITERS baseDelimiters
LocalityST	: TABLE_SINGLE_WORDS LocalitiesLikeStreetTypesTable ! \
			DELIMITERS baseDelimiters TOLERANCE2 2

Locality1	: Locality(sDummy sL1) AuxLoc(sDummy sL2) PostAuxLoc?(sDummy sL3) \
				DELIMITERS localityDelimiters
			{	sLoc = sL1 & sL2
				sLoc = sLoc & sL3
				IF bSecondLocality = 0
					Locality_ = sLoc
					bSecondLocality = 1
				ELSE
					sLocality2 = sLoc
				END IF
			}
			: AuxLoc(sDummy sL1) Locality(sDummy sL2) \
				PostAuxLoc?(sDummy sL3) DELIMITERS localityDelimiters
			{	AS_ABOVE	}
			: PreAuxLoc(sDummy sL1) Locality(sDummy sL2) \
				PostAuxLoc?(sDummy sL3) DELIMITERS localityDelimiters
			{	AS_ABOVE	}
			: Locality(sDummy sL1) PostAuxLoc?(sDummy sL2) PostLocWord? \
			DELIMITERS localityDelimiters
			{	sLoc = sL1 & sL2
				IF bSecondLocality = 0
					Locality_ = sLoc
					bSecondLocality = 1
				ELSE
					sLocality2 = sLoc
				END IF
			}
			: Words(sL1) MailCentre(sL2) DELIMITERS localityDelimiters
			{	AS_ABOVE	}
Slash		: "/"
CapitalCity	: TABLE CapitalCityTable
			# this is to ensure that Vale Park in "VALE PARK / GILBERTON"
			#	is parsed as locality and not building name [Oct07]
LocSlashLoc	: Locality1 Slash Locality1
			: Locality1 CapitalCity(sCapitalState sCapital)
Locality2	: Locality1 Via?(sVia) Locality1
State		: TABLE states ! DELIMITERS stateDelimiters
Pcode		: NUMBER_RANGE 800 9999 !
			#: NUMBER_RANGE 200 299 ! # [Apr07 replaced by below]
			: NUMBER_RANGE 200 !	# TODO: update with PAF
			: NUMBER_RANGE 221 !	# "
Australia	: "AUSTRALIA"	# [Apr12]
			# have all 3 - postcode, locality & state
FullLocality: Pcode(sTempPcode) LocSlashLoc State(State_) State? Australia? ~00001
			{	Pcode_ = RIGHT(sTempPcode, 4)	# incase postcode has leading 0's
				IF sCapitalState <> "" AND sCapitalState <> State_
					sLocality2 = sCapital
				END IF
			}
			\IFDEF SECOND_PASS
			: Pcode(sTempPcode) Locality1 State(State_) State? Pcode? Australia? ~000001
			\ELSE # otherwise fails on "STONEVILLE WA 6081, 4150 RILEY RD"
			: Pcode(sTempPcode) Locality1 State(State_) State? Australia? ~00001
			\ENDIF
			{	Pcode_ = RIGHT(sTempPcode, 4)	}
			: Pcode(sTempPcode) LocalityST(sDummy Locality_) State(State_) \
				Australia? ~0001 DELIMITERS localityDelimiters
			{	AS_ABOVE	}
			# have 2 out of 3 and at end
			: Pcode(sTempPcode) LocSlashLoc Australia? $ ~001
			{	AS_ABOVE	}
			: Pcode(sTempPcode) Locality1 Australia? $ ~001
			{	AS_ABOVE	}
			: Pcode(sTempPcode) LocalityST(sDummy Locality_) Australia? $~001 \
				DELIMITERS localityDelimiters
			{	AS_ABOVE	}
			: Pcode(sTempPcode) State(State_) State? Australia? $~0001
			{	AS_ABOVE	}
			: LocSlashLoc State(State_) Australia? $~001
			{	Pcode_ = RIGHT(sTempPcode, 4)
				IF sCapitalState <> "" AND sCapitalState <> State_
					sLocality2 = sCapital
				END IF
			}
			: Locality1 State(State_) Australia? $~001
			: LocalityST(sDummy Locality_) State(State_) Australia? $~001 \
				DELIMITERS localityDelimiters
			# have 2 out of 3, even if not at end
			: Pcode(sTempPcode) Locality1 Australia? ~001
			{	Pcode_ = RIGHT(sTempPcode, 4)	}
			: Pcode(sTempPcode) LocalityST(sDummy Locality_) Australia? ~001 \
				DELIMITERS localityDelimiters
			{	AS_ABOVE	}
			: Pcode(sTempPcode) State(State_) State? Australia? ~0001
			{	AS_ABOVE	}
			: Locality1 State(State_) Australia? ~001
			: LocalityST(sDummy Locality_) State(State_) Australia? ~001 \
				DELIMITERS localityDelimiters
			# have just 1 at end
			: Pcode(sTempPcode) Australia? $
			{	AS_ABOVE	}
			: Locality1 Australia? $
			: LocalityST(sDummy Locality_) Australia? $ DELIMITERS localityDelimiters
			: State(State_) Australia? $
			# have just 1, even if not at end (but not pcode or state by itself)
			: Pcode(sTempPcode) Australia
			{	AS_ABOVE	}
			: Locality1 Australia?
			: LocalityST(sDummy Locality_) Australia? DELIMITERS localityDelimiters
			: State(State_) Australia
Loc1		: Pcode(Pcode_) # only recognise this below if after other address elements
			: State(State_)
FullLocalty2: Pcode(sTempPcode) Locality2 State?(State_) State? ~
			{	AS_ABOVE	}
			: Locality2 State(State_) ~
			: Locality2
# pobox
PbType1		: TABLE postal_delivery_type1 DELIMITERS pbtypeDelimiters
			: TABLE postal_delivery_type1a # Custom [Sep08]
PbType2		: TABLE postal_delivery_type2 DELIMITERS pbtypeDelimiters
PbType3		: TABLE postal_delivery_type3 DELIMITERS baseDelimitersNumbers
Char123		: WORD_SIZE_RANGE 1 2
			: "SEO"	<> DELIMITERS baseDelimitersNumbers # update with PAF
			: "BZB" <> DELIMITERS baseDelimitersNumbers # "
			: "RSD" <> DELIMITERS baseDelimitersNumbers # (no longer in PAF)
No			: "NO" <> DELIMITERS baseDelimitersNumbers # [Jul09] from 3Pass
\IFNDEF ZERO_NOT_A_NUMBER
Num			: NUMBER # < [Feb07 added <, Mar07 removed it]
\ELSE
Num			: NUMBER_RANGE 1 99999 # [Nov14 added to remove 0000 as valid numbers]
\ENDIF
NumSuffix	: NUMBER # ie number that can be a suffix
PoboxNum	: NumSuffix(PostalNo_) Char123?(PostalSuffix_) \
			DELIMITERS "" # ensure no space between number & suffix
Pobox		: PbType1(PostalType_ sFullPostalType) No? Char123?(PostalPrefix_)\
				PoboxNum DELIMITERS streetAddressDelimiters
			: PbType3(PostalType_ sFullPostalType) No? Char123?(PostalPrefix_)\
				PoboxNum DELIMITERS streetAddressDelimiters
			: PbType2(PostalType_)
			: PbType3(PostalType_)
			\IFDEF ALLOW_MISSING_POSTAL_NUMBER
			: PbType1(PostalType_)
			\ENDIF
# street name
Corner		: TABLE cornerTable
StreetType	: TABLE street_types_multiple_words TOLERANCE1 2
				# nameDelimiters added for AMAS test 3
			: TABLE_SINGLE_WORDS street_types DELIMITERS nameDelimiters
StreetSuffix: TABLE street_suffixes
NumStreet	: TABLE NumericStreetNamesTable DELIMITERS nameDelimiters
StreetNoType: TABLE StreetNameNoTypeTable DELIMITERS nameDelimiters
StreetName	: Words(StreetName_) StreetType(sStreetType2 sFullStreetType2) \
				StreetType(StreetType_ sTempStreetType) \
				StreetSuffix(StreetSuffix_ sFullStreetSuffix) \
				DELIMITERS streetAddressDelimiters
			{
				# [May14] DI: needed to remove repeated street name and streetType
				IF StreetName2 <> "" 
					IF StreetName2 = StreetName_
						IF sStreetType2 = StreetType_
							StreetName2 = ""						
						ELSE
							StreetName_ = StreetName_ & sFullStreetType2
							StreetName_ = StreetName_ & StreetName2
							sStreetType2 = ""
							sFullStreetType2 = ""						
						END IF
					ELSE 
						StreetName_ = StreetName_ & sFullStreetType2
						StreetName_ = StreetName_ & StreetName2
						sStreetType2 = ""
						sFullStreetType2 = ""						
					END IF					
				END IF

				# Name="The" Type="Avenue" -> Name="The Avenue"
				IF StreetName_ = "THE"
					IF sFullStreetType2 <> ""
						StreetName_ = StreetName_ & sFullStreetType2
						sFullStreetType2 = ""
						sStreetType2 = ""
					ELSE
						StreetName_ = StreetName_ & sTempStreetType
						sTempStreetType = ""
						StreetType_ = ""
					END IF
				END IF
				# add on corner
				StreetName_ = sCorner & StreetName_
				# "High Street Road" ->
				#	Name="High Street"; Type="RD"; Type2="ST"
				StreetName_ = StreetName_ & sFullStreetType2
				# create full street name for dpid allocation
				#	in case of eg. "THE STRAND EAST"
				sFullStreetName = StreetName_
				sFullStreetName = sFullStreetName & sTempStreetType
				sFullStreetName = sFullStreetName & sFullStreetSuffix
				# save, as second street will overwrite first
				IF bSecondStreet = 0
					StreetName_Save = StreetName_
					StreetType_Save	= StreetType_
					StreetSuffix_Save = StreetSuffix_
					sFullStreetName_Save = sFullStreetName
					sStreetType2_Save = sStreetType2
					bSecondStreet = 1
				# move this to second street, & get back saved first
				ELSE
					sStreet2Name = StreetName_
					sStreet2Type = StreetType_
					sFullStreetName2 = sFullStreetName
					StreetName_ = StreetName_Save
					StreetType_ = StreetType_Save
					StreetSuffix_ = StreetSuffix_Save
					sFullStreetName = sFullStreetName_Save
					sStreetType2 = sStreetType2_Save
					bSecondStreet = 2 # not used anymore
				END IF
			}
			: Words(StreetName_) StreetType(StreetType_ sTempStreetType) \
				StreetSuffix(StreetSuffix_ sFullStreetSuffix) \
				DELIMITERS streetAddressDelimiters
			{	AS_ABOVE	}
			\IFDEF PARSE_DOUBLE_STREET
# [May14] DI: repeated street name and streetType
			: Words(StreetName_) StreetType(sStreetType2 sFullStreetType2) \
				Words(StreetName2)  StreetType(StreetType_ sTempStreetType) \
				DELIMITERS streetAddressDelimiters
			{	AS_ABOVE	}
			\ENDIF
			: Words(StreetName_) StreetType(sStreetType2 sFullStreetType2) \
				StreetType(StreetType_ sTempStreetType) \
				DELIMITERS streetAddressDelimiters
			{	AS_ABOVE	}
			: Corner?(sCorner) Words(StreetName_) \
				StreetType(StreetType_ sTempStreetType) \
				DELIMITERS streetAddressDelimiters
			{	AS_ABOVE	}
			: NumStreet(StreetName_) StreetType?(StreetType_ sTempStreetType) \
				DELIMITERS streetAddressDelimiters
			{	AS_ABOVE	}
			: StreetNoType(StreetName_) StreetSuffix?(sDummy sFullStreetType2)
			{	AS_ABOVE	}
# [Feb07]: double street name: eg. "145 Eighth Avenue Cnr Tenth Street"
PluralStType: TABLE_SINGLE_WORDS PluralStTypeTable DELIMITERS nameDelimiters
And			: "AND" <>
			: "And" <>	# only useful if PRESERVE_CASE_IN_PRE_ADDRESS
			: "and" <>	# "
			: "&"
CornerOrAnd	: Corner
			: And
			# [Apr12]: DI: hack for preaddress, eg "Coles, Corner of ..."
CornerStreet: Words?(PreAddress1_) Corner(sCornerOrAnd) StreetName And StreetName
			: StreetName CornerOrAnd(sCornerOrAnd) StreetName
			: Corner?(sCornerOrAnd) Words(StreetName_) And(sCornerAnd) \
				Words(sStreet2Name) PluralStType(StreetType_)
			{
				IF sCornerOrAnd = ""
					sCornerOrAnd = sCornerAnd
				END IF
				sFullStreetName = StreetName_ & StreetType_
				sStreet2Type = StreetType_
				sFullStreetName2 = sStreet2Name & sStreet2Type
			}
			: Corner(sCornerOrAnd) StreetType?(StreetType_) Words(StreetName_) \
				And StreetType?(sStreet2Type) Words(sStreet2Name) ~021354
			{
				IF StreetType_ = ""
					StreetType_ = sStreet2Type
				ELSEIF sStreet2Type = ""
					sStreet2Type = StreetType_
				END IF
				sFullStreetName = StreetName_ & StreetType_
				sFullStreetName2 = sStreet2Name & sStreet2Type
			}
StreetName2	: CornerStreet
			: StreetName
# units
Dash		: "-"
			: "TO" <>
			: "To" <>  # only useful if PRESERVE_CASE_IN_PRE_ADDRESS
			: "to" <>  # "
Char1		: WORD_SIZE_RANGE 1 1
Char5		: WORD_SIZE_RANGE 1 5
Char2		: WORD_SIZE_RANGE 1 2
Char2_		: WORD_SIZE_RANGE 2 2
Num5		: NUMBER_SIZE_RANGE 1 5
UnitType	: TABLE flat_unit_type CHAR_SET letters TOLERANCE1 6 <
PluralUnitT	: TABLE PluralUnitTypeTable CHAR_SET letters < # Apr07
LotNo		: Num Char5? DELIMITERS "" # Jul07
			: Char5 Num5? DELIMITERS "" # Jul07
UnitNos		: Num Dash Num DELIMITERS " " # Apr07
UnitNo		
			\IFDEF ALLOW_SPACE_BEFORE_UNIT_SUFFIX #[Jun13]
			: Num Char1 DELIMITERS " "
			\ELSE
			: Num Char1 DELIMITERS "" # no gap [Sep00]
			\ENDIF
			\IFNDEF NO_ALPHA_UNIT_NUMBERS
			#: Char1 NumSuffix? DELIMITERS "" # Dec04: allow letter before number
			: Char2 Num5 Char2? DELIMITERS "" # for GNAF [Apr13]
			: Num5? Char2_ DELIMITERS ""        # "
			\ENDIF
			: Num
			: Char1 # [May13] PAF now has some alpha unit numbers
\IFDEF ALPHANUM_ROOM_NUMBER
AlphaNum	: WORDOF "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890."
Room		: TABLE roomTable CHAR_SET letters <
\ENDIF
Unit		: UnitType(FlatType_ sFullFlatType) No? UnitNo(FlatNo_) \
				DELIMITERS " .#-"
			: UnitType(FlatType_ sFullFlatType) UnitNos(FlatNo_)
			: PluralUnitT(FlatType_ sFullFlatType) UnitNos(FlatNo_)
\IFDEF ALPHANUM_ROOM_NUMBER
			: Room(FlatType_ sFullFlatType) AlphaNum(FlatNo_)
\ENDIF
UnitSlash	: Unit Slash
			: UnitNo(FlatNo_) Slash
SureUnitType: TABLE sureUnitTypesTable CHAR_SET letters <
SureUnit	: SureUnitType(sSureUnitType) UnitNo(sSureUnitNo)
SuiteOrShopT: TABLE suiteOrShopTable CHAR_SET letters <
SuiteOrShop : SuiteOrShopT(FlatType_) UnitNo(FlatNo_)

#levels
Ordinal2	: TABLE ordinals2
			: ORDINAL
LevelType1	: TABLE building_level_type1 CHAR_SET letters < # "Floor"
LevelType2	: TABLE building_level_type2 CHAR_SET letters < # "Level"
LevelType3	: TABLE building_level_type3 CHAR_SET letters < # "Basement" etc.
			# these two were removed from table, so picked up here
			: $ "B" > DELIMITERS " ,.;\t\n\r" #[Dec10:] DELIMITERS
			: $ "M" > DELIMITERS " ,.;\t\n\r"
			 # only useful if PRESERVE_CASE_IN_PRE_ADDRESS
			: $ "b" > DELIMITERS " ,.;\t\n\r"
			: $ "m" > DELIMITERS " ,.;\t\n\r"
LoneLevel	: TABLE building_level_type1 DELIMITERS " ()|{}[]:;,./\t\n\r\f"
			: TABLE building_level_type2 DELIMITERS " ()|{}[]:;,./\t\n\r\f"
LevelType4	: TABLE building_level_type4 CHAR_SET letters < # "Ground Floor"
LevelOrFloor: Ordinal2(LevelNo_) LevelType1(LevelType_) \
				DELIMITERS streetAddressDelimiters
			: LevelType1(LevelType_) UnitNo(LevelNo_) \
				DELIMITERS streetAddressDelimiters
			: LevelType2(LevelType_) UnitNo(LevelNo_) \
				DELIMITERS streetAddressDelimiters
Level		: Ordinal2(LevelNo_) LevelType1(LevelType_) \
				DELIMITERS streetAddressDelimiters
			: Num(LevelNo_) LevelType1(LevelType_) \
				DELIMITERS streetAddressDelimiters # "11 floor" (from 3Pass)
			: LevelType4(LevelType_) UnitNo(LevelNo_) \
				DELIMITERS streetAddressDelimiters
			: LevelType1(LevelType_) UnitNo(LevelNo_) \
				DELIMITERS streetAddressDelimiters
			: LevelType2(LevelType_) UnitNo(LevelNo_) \
				DELIMITERS streetAddressDelimiters
			: LevelType3(LevelType_) UnitNo?(LevelNo_) \
				DELIMITERS streetAddressDelimiters
LevelEvenLone: Level
			# (AMAS2002:) missing number
			\IFNDEF NO_MISSING_LEVEL_NUMBER
			: LoneLevel(LevelType_)
			\ENDIF
SureLvlType	: TABLE sureLevelTypesTable CHAR_SET letters <
SureLvlType3: TABLE sureLevelType3Table CHAR_SET letters <
SureLevel	: SureLvlType(sSureLevelType) UnitNo(sSureLevelNo) \
				DELIMITERS streetAddressDelimiters
			: SureLvlType3(sSureLevelType) UnitNo?(sSureLevelNo) \
				DELIMITERS streetAddressDelimiters

# building name
\IFDEF PARSE_BUILDING_NAME_IN_QUOTES
Quote		: "\"" #"
LeftQuote1	: "'" <
RightQuote1	: "'" >
Words2		: Word Word Word Word Word DELIMITERS wordDelimiters2
			: Word? Word Word Word DELIMITERS wordDelimiters2
			: Word? Word DELIMITERS wordDelimiters2
			: TABLE ordinals
\ENDIF
BuildingType1: TABLE building_types1 DELIMITERS buildingDelimiters TOLERANCE2 5
BuildingType2: TABLE building_types2 TOLERANCE2 5
NumBuilding	: TABLE NumericBuildingNames INNER_DELIMITERS nonDividingDelimiters TOLERANCE2 5
Building	: Words(BuildingName1_) BuildingType1(sDummy sBldg)
				{	BuildingName1_ = BuildingName1_ & sBldg	}
			: BuildingType2(BuildingName1_)
			\IFDEF PARSE_BUILDING_NAME_IN_QUOTES
			: Quote Words2(BuildingName1_) Quote
			: LeftQuote1 Words2(BuildingName1_) RightQuote1 DELIMITERS ""
			\ENDIF
			: NumBuilding(BuildingName1_)

# street number
LOT			: TABLE lot CHAR_SET letters <
\IFDEF LOOK_FOR_HOUSE_PREFIX
HousePrefix	: TABLE HousePrefixTable CHAR_SET letters <
\ENDIF
Lot			: LOT No? LotNo(LotNo_)
			{	LotNo_ = LTRIM(LotNo_, "0")	}
# DELIMITERS clause will put the W in "10 W Lindsey Rd" with the street name
StreetNum_	: Num(HouseNo1_) Char1?(HouseSuffix1_) Dash\
				Num(HouseNo2_) Char1?(HouseSuffix2_)	DELIMITERS ""
			: Num(HouseNo1_) Char1?(HouseSuffix1_) Dash Num(HouseNo2_) \
				DELIMITERS " " #eg. "321 - 325" (added 20/03/02)
\IFDEF LOOK_FOR_HOUSE_PREFIX
			:  HousePrefix(HousePrefix_) NumSuffix(HouseNo1_) Char1?(HouseSuffix1_)
\ENDIF
			: Num(HouseNo1_) Char1?(HouseSuffix1_)	DELIMITERS ""
StreetNum	: Lot
			: No? StreetNum_
FullStreetNum: Lot? Unit LevelEvenLone StreetNum ~0001 DELIMITERS streetNumDelimiters
			{	# Fix for level number getting picked up as street number.
				# eg. "Level 2 Wesfield". Doesn't apply if NO_MISSING_LEVEL_NUMBER
				i = ORDER_FOUND(3)
				j = ORDER_FOUND(4)
				i = i + 1
				IF i = j # level just before street number
					sTemp = SUB_INPUT(3, -4) # between level and street number
					sTemp = TRIM(sTemp, " #.") # allow these characters
					IF sTemp = "" # nothing between Level and number
						bCheckLoneLevel = bTrue
					END IF
				END IF
			}
			# "Lot?" added to pick up invalid address having both lot# & street#
			: Lot? LevelEvenLone UnitSlash? StreetNum DELIMITERS streetNumDelimiters
			{	# Fix for level number getting picked up as street number.
				i = ORDER_FOUND(2)
				j = ORDER_FOUND(4)
				i = i + 1
				IF i = j # level just before street number
					sTemp = SUB_INPUT(2, -4) # between level and street number
					sTemp = TRIM(sTemp, " #.") # allow these characters
					IF sTemp = "" # nothing between Level and number
						bCheckLoneLevel = bTrue
					END IF
				END IF
			}
			: Lot? UnitSlash? StreetNum Level
			# to pick up invalid "Unit 1-5 main st"
			#: Lot? Unit Dash StreetNum
			: Lot? Unit StreetNum ~001 DELIMITERS streetNumDelimiters
			{
				# check for street name parsed as unit, eg "F E WALKER"
				# - flat after street number
				j = ORDER_FOUND(2)
				i = ORDER_FOUND(3)
				IF j > i
					# - one character flat type and number
					i = LEN(FlatNo_)
					IF i = 1
						i = LEN(sFullFlatType)
						IF i = 1
							# - alpha flat number
							i = VAL(FlatNo_, -1)
							IF i = -1
								# flag to move to street name
								i = 0 - j
								sStreetBeginFix = SUB_INPUT(i, j)
							END IF
						END IF
					END IF
				END IF
			}
			# don't have "-" in delimiters, because "Unit 1-5 Main St"
			: Lot? UnitSlash StreetNum
			#: Lot (moved to be part of StreetNum 29/6/00)
			# interpret "1 5 main st" as "1/5 main st"
			\IFDEF ALLOW_UNIT_WITHOUT_SLASH2
			: UnitNo(FlatNo_) StreetNum DELIMITERS " \t,"
			{	bSpaceInsteadOfSlash = 1	}
			\ELSEIF DEF ALLOW_UNIT_WITHOUT_SLASH
			: UnitNo(FlatNo_) StreetNum DELIMITERS " "
			{	bSpaceInsteadOfSlash = 1	}
			\ENDIF
			 # unit without number [Oct07]
			\IFDEF OPTIONAL_UNIT_NO
			: Lot? UnitType?(FlatType_ sFullFlatType) StreetNum
			\ELSE
			: Lot? StreetNum
			\ENDIF
UnitOrLevel	: Level Unit? ~
			: Unit
			# unit/level info to parse before a building name [Apr12]
NumLone		: NUMBER <> DELIMITERS " "
UnitOrLevel2: LevelOrFloor Unit? ~
			: Unit
			: NumLone(FlatNo_)
			# these are more likely to be unit/level than street numbers
SuiteOrFloor: LevelOrFloor SuiteOrShop? ~
			: SuiteOrShop
			# delimiters to ensure streetNo and name on same address line
			# (no comma inbetween)
StNumAndName: FullStreetNum StreetName2 DELIMITERS streetAddressDelimiters
# to handle "apt 79, block 9" [Jun09]
Block		: TABLE blockTable CHAR_SET letters <
BlockNum	: Block(sBlock) UnitNo(sBlockNum)
			{	sBlock = sBlock & sBlockNum	}
# full address
CareOf		: $ TABLE careof DELIMITERS careofDelimiters
			# ensure /- not delimiters
StAddr		: CareOf?(sCareof) UnitOrLevel Building \
				StNumAndName @ #look for CareOf also [Jun07]
			{	# allowing junk (@) [July09]
				IF sCareof <> ""
					sTemp = SUB_INPUT (1, -2)
					sTemp = TRIM(sTemp, sTrim)
					#PostAddress_ = PostAddress_ & sTemp
					sCareof = sCareof & sTemp # [Dec10] replaced above line
				END IF
				sTemp = SUB_INPUT(2, -3)
				sTemp = TRIM(sTemp, sTrim)
				PostAddress_ = PostAddress_ & sTemp
				sTemp = SUB_INPUT(3, -4)
				sTemp = TRIM(sTemp, sTrim)
				PostAddress_ = PostAddress_ & sTemp
			}
# @@ to give preference to building names use the next line
			: CareOf?(sCareof) SuiteOrFloor Building StreetName2?
			: CareOf?(sCareof) SuiteOrFloor StreetName2	# "Floor 1 Main st" NH
			{
				# check for "1st Floor 123 Main st" being picked up "Floor 123"
				sTemp = SUB_INPUT(0, -1)
				sTemp = TRIM(sTemp)
				i = INSTRREV(sTemp, " ")
				IF i > 0
					i = i + 1
					sTemp = MID(sTemp, i)
					sFirstFloorFix = LOOKUP(sTemp, ordinals2) # eg. first
					IF sFirstFloorFix = ""
						sFirstFloorFix = LOOKUP(sTemp, ordinals) # eg. 1st
						IF sFirstFloorFix <> ""
							i = VAL(sTemp) # 1st -> 1
							sFirstFloorFix = STR(i)
						END IF
					END IF
				END IF
				# check for "... P/L 123 Main St" being picked up "L 123"
				IF sFirstFloorFix = ""
					IF LevelType_ = "L"
						IF FlatType_ = ""
							sTemp3 = RIGHT(sTemp, 1)
							IF sTemp3 = "/"
								bLevelFix = 1
							END IF
						END IF
					END IF
				END IF
			}
			# eg Shop 4, 1 Carseldine Homemaker Centre Gympie Rd, CARSELDINE QLD 4034
			# (I don't think this is correct)
			\IFDEF PARSE_UNIT_HOUSENUM_BUILDING
			: SuiteOrFloor Num(HouseNo1_) Words(BuildingName1_) \
				BuildingType1(sDummy sBldg) StreetName2
			{	BuildingName1_ = BuildingName1_ & sBldg	}
			\ENDIF
			: CareOf?(sCareof) StNumAndName UnitOrLevel? \
				Building? BlockNum? ~01111
			#: Num(FlatNo_) Building StreetName2 # [*Feb07]
			# swapped below two lines for AMAS approval 2008 [Oct07]
			: CareOf?(sCareof) UnitOrLevel? Building? StreetName2
			: CareOf?(sCareof) UnitOrLevel? Building
			# "5 happy appartments, 100 main st", 5 is unit number [Jun09]
			: UnitNo(FlatNo_) Building StreetNum StreetName
			# "happy appartments, room 5, main st" [Jul13]
			: Building UnitOrLevel StreetName
			# "100 unit 5 main st" -> "unit 5 100 main st" [Jun11]
			: $ StreetNum SureUnitType(FlatType_) UnitNo(FlatNo_) StreetName
			# "6 Lot 2 Main St" -> "Lot 2, 6 Main St" [Jun11]
			: $ StreetNum_ Lot StreetName
			# [Dec10]; [Mar12:] added UnitType
			: UnitOrLevel2 Words(BuildingName1_) StreetNum StreetName
			: UnitOrLevel2 Words(BuildingName1_) CornerStreet
StNoType	: FullStreetNum Words(StreetName_) \
				DELIMITERS streetAddressDelimiters
			{	sFullStreetName = StreetName_	}
StAddrNoType: Building? Corner(sCorner) Words(StreetName_) # NH
			{	StreetName_ = sCorner & StreetName_
				sFullStreetName = StreetName_	}
			: Building StNoType UnitOrLevel?
			: StNoType UnitOrLevel?
			{
				# fix for AMAS STF having GRND street types [Oct10]
				sTemp = RIGHT(StreetName_, 5)
				IF sTemp = " GRND"
					StreetType_ = "GRND"
					i = LEN(StreetName_)
					i = i - 5
					StreetName_ = LEFT(StreetName_, i)
				END IF
			}
StreetAddr	: StAddr
			: StAddrNoType
AttnTable	: TABLE AttnTable
Full_addr	: $ Pobox? FullLocality?(FoundFullLocality) StAddr? $ ~
				{	sBetweenStreetAndLocality = SUB_INPUT(3,-2)	}
			: $ Pobox? FullLocalty2?(FoundFullLocality) StAddr? $ ~
				{	AS_ABOVE	}
			: $ Pobox FullLocality?(FoundFullLocality) Building? $ ~
			# to pick up extra word(s) between locality & state/pcode
			: $ StAddr State?(State_) Locality1 Words(PostAddress_) \
				Pcode?(Pcode_) $ ~03123
				{	sBetweenStreetAndLocality = SUB_INPUT(1,-3)	}
			# to pick up extra word(s) between locality/state & pcode [Apr07]
			: $ Pobox State?(State_) Locality1 AttnTable?(sTemp) \
				Words(PostAddress_) Pcode?(Pcode_) $ ~021345
			{ PostAddress_ = sTemp & PostAddress_	}
			: $ StAddr State?(State_) Locality1 AttnTable?(sTemp) \
				Words(PostAddress_) Pcode?(Pcode_) $ ~021345
				{	sBetweenStreetAndLocality = SUB_INPUT(1,-3)
					PostAddress_ = sTemp & PostAddress_	}
			: $ Pobox? FullLocality?(FoundFullLocality) StAddrNoType? $ ~
			: $ Pobox? FullLocalty2?(FoundFullLocality) StAddrNoType? $ ~
			# incase house number on different line
			\IFDEF SECOND_PASS
			: $ FullLocality FullStreetNum StreetName ~312
			{	PostAddress_ = SUB_INPUT_FOUND(3)
				PostAddress_ = TRIM(PostAddress_, "\n\r\t ,")	}
			: $ FullStreetNum StreetName Loc1
			{	AS_ABOVE	}
			\ENDIF
			# @@@ Use next line to pick up "c/o" at address beginning.
			#     Else use line below it
			#: Pobox? FullLocality?(FoundFullLocality) StreetAddr? CareOf?(sCareof) @ ~
			\IFDEF POSTAL_OR_STREET_NOT_BOTH
			: Pobox FullLocality(FoundFullLocality) @
			: Pobox Loc1(FoundFullLocality) @
			\ELSE
			: Pobox? FullLocality?(FoundFullLocality) StreetAddr? \
				SureLevel?(s2) SureUnit?(s3) @ ~
			\ENDIF
			{
				sPreAddress = SUB_INPUT_FOUND(0, -1)
				sPreAddress = RTRIM(sPreAddress, " \t\r\n,")
				#IF sCareof <> ""
				#	sTemp = SUB_INPUT_FOUND(1, -2)
				#	sTemp = LTRIM(sTemp, " :")
				#	sTemp = RTRIM (sTemp, sTrim)
				#	sCareof = sCareof & sTemp
				#ELSE
					sTemp = SUB_INPUT_FOUND (1, -2)
					sTemp = TRIM(sTemp, sTrim)
					PostAddress_ = PostAddress_ & sTemp
				#END IF
				# get extra info on line, not picked up
				sTemp = SUB_INPUT_FOUND(2, -3)
				sTemp = TRIM(sTemp, sTrim)
				PostAddress_ = PostAddress_ & sTemp
				sTemp = SUB_INPUT_FOUND(3, -4)
				sTemp = TRIM(sTemp, sTrim)
				PostAddress_ = PostAddress_ & sTemp
				sTemp = SUB_INPUT_FOUND(4, -5)
				sTemp = TRIM(sTemp, sTrim)
				PostAddress_ = PostAddress_ & sTemp
				sTemp = SUB_INPUT_FOUND(5)
				sTemp = TRIM(sTemp, sTrim)
				PostAddress_ = PostAddress_ & sTemp
				PostAddress_ = TRIM(PostAddress_, "\n\r\t ,")
				# split pre address by carriage returns or tabs
				i = INSTR(sPreAddress, "\n")
				IF i <= 1
					i = INSTR(sPreAddress, "\t")
				END IF
				IF i <= 1
					PreAddress1_ = sPreAddress
				ELSE
					i = i - 1
					PreAddress1_ = LEFT(sPreAddress, i)
					i = i + 2
					PreAddress2_ = MID(sPreAddress, i)
				END IF
				# insert level or unit found
				IF LevelType_ = ""
					LevelType_ = sSureLevelType
					LevelNo_ = sSureLevelNo
				END IF
				IF FlatNo_ = ""
					IF FlatType_ = ""
						FlatType_ = sSureUnitType
						FlatNo_ = sSureUnitNo
					END IF
				END IF
				# unknown locality between street and state/postcode [Apr10]
				IF Locality_ = ""
					IF StreetType_ <> ""
						\IFDEF POSTAL_OR_STREET_NOT_BOTH
							i = ORDER_FOUND(2) # StreetAddr
							j = ORDER_FOUND(1) # FullLocality
						\ELSE
							i = ORDER_FOUND(3) # StreetAddr
							j = ORDER_FOUND(2) # FullLocality
						\ENDIF
						# is state/postcode just after street name?
						IF i > 0
							i = i + 1
							IF i = j
								\IFDEF POSTAL_OR_STREET_NOT_BOTH
									sTemp = SUB_INPUT(2, -1)
								\ELSE
									sTemp = SUB_INPUT(3, -2)
								\ENDIF
								sTemp = TRIM(sTemp, "\n\r\t ,")
								IF sTemp <> ""
									# ensure only words
									sTemp3 = REPLACE(sTemp, \
										"ABCDEFGHIJKLMNOPQRSTUVWXYZ ", "")
									IF sTemp3 = ""
										# ensure no more than 2 words
										sTemp3 = REPLACE(sTemp, " ", "")
										i = LEN(sTemp)
										j = LEN(sTemp3)
										j = j + 1
										IF i <= j
											Locality_ = sTemp
										END IF
									END IF
								END IF
							END IF
						END IF
					END IF
				END IF
			}
			\IFDEF POSTAL_OR_STREET_NOT_BOTH
			: FullLocality?(FoundFullLocality) StreetAddr? SureLevel? \
			SureUnit? @ ~
			{ AS_ABOVE }
			: Loc1?(FoundFullLocality) StreetAddr? SureLevel? SureUnit? @ ~1000
			{ AS_ABOVE }
			\ELSE
			: Pobox? Loc1?(FoundFullLocality) StreetAddr? \
				SureLevel?(s2) SureUnit?(s3) @ ~01000
			{ AS_ABOVE }
			\ENDIF

\SUBROUTINE RemoveLostQuote(sLine)
{
	j = LEN(sLine)
	IF j > 0
		# trailing double quote
		sTemp = RIGHT(sLine, 1)
		IF sTemp = sQuote
			i = INSTR(sLine, sQuote)
			IF i = j
				i = i - 1
				sLine = LEFT(sLine, i)
			END IF
		# trailing single quote
		ELSEIF sTemp = "'"
			i = INSTR(sLine, "'")
			IF i = j
				i = i - 1
				sLine = LEFT(sLine, i)
			END IF
		ELSE
			# leading double quote
			sTemp = LEFT(sLine, 1)
			IF sTemp = sQuote
				i = INSTR(sLine, sQuote, 2)
				IF i < 1
					sLine = MID(sLine, 2)
				END IF
			# leading single quote
			ELSEIF sTemp = "'"
				i = INSTR(sLine, "'", 2)
				IF i < 1
					sLine = MID(sLine, 2)
				END IF
			END IF
		END IF
	END IF
	sLine = TRIM(sLine, " \t")
}

\SUBROUTINE RevertPLFix(sVar)
{
	sTemp = UCASE(sVar)
	i = INSTR(sTemp, "P/LTD")
	IF i > 0
		j = i + 5
		sTemp = MID(sVar, j) # after "P/LTD"
		i = i + 2
		sVar = LEFT(sVar, i) # till "P/L" inclusive
		sVar = sVar + sTemp
	END IF
}

\POST_PARSE {
	sDelim = "\t"

	# format address options: 2=NoLocality, 4=ExpandFlatLevelAbbr
	#	16=ExpandStreetAbbr, 64=AustraliaPostStandard, 256=NoBuilding
	#	512=AlwaysHaveUnitType (if there is a unit number)
	#	1024=NoLotIfHaveStreetNumber, 4096=QuoteBuilding
	i = 66 # 64 + 2
	\IFNDEF DONT_EXPAND_UNIT_ABBRS
		i = i + 4
	\ENDIF
	\IFDEF EXPAND_STREET_ABBRS
		i = i + 16
	\ENDIF
	\IFDEF NO_BUILDING_IN_ADDRESS_LINES
		i = i + 256
	\ENDIF
	\IFDEF ALWAYS_HAVE_UNIT_TYPE_IN_ADDRESS_LINES
		i = i + 512
	\ENDIF
	\IFDEF NO_LOT_IF_HAVE_STREET_IN_ADDRESS_LINES
		i = i + 1024
	\ENDIF
	\IFDEF PARSE_BUILDING_NAME_IN_QUOTES
		i = i + 4096
	\ENDIF
	sFormatAddressOptions = STR(i)
	sFormatAddressOptions = "Options=" + sFormatAddressOptions
	sFormatAddressOptions = sFormatAddressOptions + ";"

	# Fix for level number getting picked up as street number.
	#	eg. "Level 2 Wesfield". Doesn't apply if NO_MISSING_LEVEL_NUMBER
	\IFNDEF NO_MISSING_LEVEL_NUMBER
		IF bCheckLoneLevel = bTrue
			IF LevelNo_ = ""
				IF HouseNo2_ = ""
					sTemp = LOOKUP(LevelType_, building_level_type1) # FL
					IF sTemp = ""
						sTemp = LOOKUP(LevelType_, building_level_type2) # L
					END IF
					IF sTemp <> ""
						LevelNo_ = HouseNo1_ + HouseSuffix1_
						HouseNo1_ = ""
						HouseSuffix1_ = ""
					END IF
				END IF
			END IF
		END IF
	\ENDIF

	# remove spaces in unit number
	\IFDEF ALLOW_SPACE_BEFORE_UNIT_SUFFIX
		FlatNo_ = REPLACE(FlatNo_, " ", "")
		LevelNo_ = REPLACE(LevelNo_, " ", "")
	\ENDIF

	# remove leading zeros from unit number
	FlatNo_ = LTRIM(FlatNo_, "0")

	# standardise "Care of" from preaddress
	IF PreAddress1_ <> ""
		# "CARE OF"
		sTemp = LEFT(PreAddress1_, 8)
		IF sTemp = "CARE OF "
			PreAddress1_ = MID(PreAddress1_, 8)
			PreAddress1_ = "C/-" + PreAddress1_
		# other one-word abbreviations
		ELSE
			i = INSTR(PreAddress1_, " ")
			IF i > 0
				i = i - 1
				sTemp = LEFT(PreAddress1_, i)
				sTemp = LOOKUP(sTemp, careof)
				IF sTemp <> ""
					i = i + 1
					PreAddress1_ = MID(PreAddress1_, i)
					PreAddress1_ = "C/-" + PreAddress1_
				END IF
			END IF
		END IF
	END IF

	IF PreAddress2_ <> ""
		PreAddress2_ = PreAddress2_ & sBlock
	ELSE
		PreAddress1_ = PreAddress1_ & sBlock
	END IF

# "first floor 1 main st" fix
	IF sFirstFloorFix <> ""
		IF HouseNo1_ = ""
			IF LevelNo_ <> ""
				HouseNo1_ = LevelNo_
				LevelNo_ = sFirstFloorFix
			END IF
		END IF
	END IF

# "P/L 123 Main St" fix
	IF bLevelFix = 1
		IF HouseNo1_ = ""
			IF PreAddress1_ <> ""
				PreAddress1_ = PreAddress1_ + LevelType_
			ELSE
				PostAddress_ = PostAddress_ + LevelType_
			END IF
			HouseNo1_ = LevelNo_
			LevelNo_ = ""
			LevelType_ = ""
		END IF
	END IF

# add VIA to second locality (if eg. "UKI VIA MURWILLUMBAH")
	IF sLocality2 <> ""
		sLocality2 = sVia & sLocality2
	END IF

# fix for state getting picked up as locality (eg "WA" as locality "WAY")
	IF State_ = ""
		sTemp = LOOKUP(Locality_, states)
		IF sTemp <> ""
			State_ = sTemp
			Locality_ = ""
		END IF
	END IF

# fix for unit parsed as street name (eg. "F E WALKER RD") [Oct06]
	IF sStreetBeginFix <> ""
		IF StreetName_ <> ""
			StreetName_ = sStreetBeginFix & StreetName_
			FlatNo_ = ""
			FlatType_ = ""
		END IF
	END IF

# fix for state & postcode getting picked as postal prefix & number [Oct06]
# eg "PERTH GPO WA 6000" (not really worth it, as rare case)
	sTemp = LOOKUP(PostalPrefix_, states)
	IF sTemp <> ""
		IF PostalNo_ <> ""
			IF State_ = ""
				IF Pcode_ = ""
					State_ = PostalPrefix_
					Pcode_ = PostalNo_
					PostalPrefix_ = ""
					PostalNo_ = ""
					PostAddress_ = sFullPostalType & PostAddress_
					PostalType_ = ""
				END IF
			END IF
		END IF
	END IF

# fix for locality getting parsed as street
# eg "PO Box xxx CLOISTER SQUARE PERTH WA 6850"
	IF Locality_ <> ""
		IF sLocality2 = ""
			IF PostalType_ <> ""
				IF sFullStreetName <> ""
					IF sStreet2Name = ""
						IF HouseNo1_ = ""
							sTemp = LOOKUP(sFullStreetName, localities, \
								TOLERATE TOLERANCE2 2)
							IF sTemp <> ""
								sLocality2 = sFullStreetName
								sFullStreetName = ""
								StreetName_ = ""
								StreetType_ = ""
								StreetSuffix_ = ""
								sStreetType2 = ""
							END IF
						END IF
					END IF
				END IF
			END IF
		END IF
	END IF

# fix for building name in street name [Apr14]
#	eg 1 Carseldine Homemaker Centre Gympie Rd
	IF BuildingName1_ = ""
		bDoIt = bFalse
		iLen1 = LEN(StreetName_)
		IF iLen1 > 30
			sL1 = SPLIT(StreetName_, 8, " ")
			IF sL8 = "" AND sL3 <> "" # need at least one word for street
				# 2nd word is building word
				sTemp = LOOKUP(sL2, building_types1)
				IF sTemp <> ""
					BuildingName1_ = sL1 & sL2
					StreetName_ = sL3 & sL4
					StreetName_ = StreetName_ & sL5
					StreetName_ = StreetName_ & sL6
					StreetName_ = StreetName_ & sL7
					bDoIt = bTrue
				ELSEIF sL4 <> "" # need at least one word for street
					# 3rd word is building word
					sTemp = LOOKUP(sL3, building_types1)
					IF sTemp <> ""
						BuildingName1_ = sL1 & sL2
						BuildingName1_ = BuildingName1_ & sL3
						StreetName_ = sL4 & sL5
						StreetName_ = StreetName_ & sL6
						StreetName_ = StreetName_ & sL7
						bDoIt = bTrue
					ELSEIF sL5 <> "" # need at least one word for street
						# 4th word is building word
						sTemp = LOOKUP(sL4, building_types1)
						IF sTemp <> ""
							BuildingName1_ = sL1 & sL2
							BuildingName1_ = BuildingName1_ & sL3
							BuildingName1_ = BuildingName1_ & sL4
							StreetName_ = sL5 & sL6
							StreetName_ = StreetName_ & sL7
							bDoIt = bTrue
						END IF
					END IF
				END IF
			END IF
		END IF
		# put house number in post address
		IF bDoIt = bTrue
			sTemp = HouseNo1_ + HouseSuffix1_
			IF HouseNo2_ <> ""
				sTemp = sTemp + "-"
				sTemp = sTemp + HouseNo2_
				sTemp = sTemp + HouseSuffix2_
			END IF
			PostAddress_ = PostAddress_ & sTemp
			HouseNo1_ = ""
			HouseSuffix1_ = ""
			HouseNo2_ = ""
			HouseSuffix2_ = ""
		END IF
	END IF

	\IFDEF SECOND_PASS
		# [16May06] Check if badly spelled locality in PostAddress
		IF Locality_ = ""
			IF PostAddress_ <> ""
				sTemp = UCASE(PostAddress_)
				sTemp = LOOKUP(sTemp, localities, \
					TOLERATE  DIFFS_PER_WORD_LEN 3 6 9  PHONETIC 2)
				IF sTemp <> ""
					Locality_ = sTemp
					PostAddress_ = ""
				END IF
			END IF
		END IF
	\ENDIF
		
	# save building name, as may get over-written
	sBuildingName = BuildingName1_
	sInputFlatType = FlatType_
	sInputFlatNo = FlatNo_
	# save full street address, as may get over-written
	IF PostalType_ <> ""
		sInputStreet = sFullFlatType & FlatNo_
		sInputStreet = sInputStreet & LevelType_
		sInputStreet = sInputStreet & LevelNo_
		IF LotNo_ <> ""
			sInputStreet = sInputStreet & "Lot "
			sInputStreet = sInputStreet + LotNo_
		END IF
		sTemp = HousePrefix_ + HouseNo1_
		sTemp = sTemp + HouseSuffix1_
		IF HouseNo2_ <> ""
			sTemp = sTemp + "-"
			sTemp = sTemp + HouseNo2_
			sTemp = sTemp + HouseSuffix2_
		END IF
		sInputStreet = sInputStreet & sTemp
		sInputStreet = sInputStreet & sFullStreetName
		#sInputStreet = sInputStreet & sFullStreetName2 this is done later
	END IF
	# store postcode, as some ARFs (eg. GNAF) don't have postcodes
	sPostcode = Pcode_

	# on second pass, only lookup if may match
	\IFDEF SECOND_PASS
		IF Locality_ = ""
			IF Pcode_ = ""
				b2ndPassSkipLookup = 1
			END IF
		END IF
		IF StreetName_ = ""
			IF PostalType_ = ""
				IF BuildingName1_ = ""
					b2ndPassSkipLookup = 1
				END IF
			END IF
		END IF
	\ENDIF

# Look up dpid
\IFNDEF SKIP_DPID_LOOKUP
	IF b2ndPassSkipLookup = 1
		State_ = SPLIT(sFullPaf, nTotalPafFields, sDelim) # clear all fields
	ELSE
		# sFlag determines what part of the input address to leave unchanged
		#    1=keep unit type if none in PAF [Mar08]
		#    2=keep street name in postal address
		#    4=keep locality name if a valid synonym
		#    8=keep locality name
		#      if a locality of this name exists within this postcode or border
		#   10 (  16)=merge user's building name with PAF building name
		#   20 (  32)=keep alternate street name
		#   80 ( 128)=update missing suburb (NZ). Used with 8 above.
		#  100 ( 256)=internal flag - no slash between unit and house number
		#  200 ( 512)=New Zealand (no longer used)
		#  400 (1024)=don't change state if postcode confirms state
		#  800 (2048)=keep user's border (subset of flag 8 above)
		# 1000 (4096)=house number musn't resolve choice of street or locality
		# 2000 (8192)=don't return lot number if have street number
		# 4000(16384)=allow matching to street only
		# these values can be added (bitwise OR) to combine options
		\IFDEF LOOKUPFLAG
			iFlag = VAL(LOOKUPFLAG, 0, 0) # 2nd 0 allows for hex numbers (0x)
			\IFDEF SECOND_PASS
				iFlag = iFlag AND NOT 12
			\ENDIF
		\ELSE
			\IFDEF SECOND_PASS
				iFlag = 19 OR 1024
				IF PostalType_ <> "PO BOX"
					IF PostalType_ <> "GPO BOX"
						iFlag = iFlag OR 8
					END IF
				END IF
			\ELSE
				iFlag = 1087 # STF use 19(1+2+16), else 1087(1+2+4+8+16+32+1024)
			\ENDIF
		\ENDIF
		\IFNDEF SECOND_PASS
			CorrectSynonym = UCASE(CorrectSynonym)
			IF CorrectSynonym = "TRUE"
				iFlag = iFlag AND NOT 12
			ELSEIF CorrectSynonym = "FALSE"
				iFlag = iFlag OR 4
			END IF
		\ENDIF
		IF bSpaceInsteadOfSlash = 1
			iFlag = iFlag OR 256
		END IF
		sFlag = STR(iFlag)
		# remove postal address if also contains street address
		\IFDEF PREFER_STREET_TO_POSTAL
			IF PostalType_ <> ""
				IF HouseNo1_ <> ""
					sSavePostalType = PostalType_
					sSavePostalNo = JOIN(PostalNo_, 3, "\t")
					PostalType_ = ""
					PostalNo_ = ""
					PostalPrefix_ = ""
					PostalSuffix_ = ""
				END IF
			END IF
		\ENDIF
		# other options A=nothing separating street name and locality prefix
		sOtherOptions = ""
		sBetweenStreetAndLocality = TRIM(sBetweenStreetAndLocality)
		IF sBetweenStreetAndLocality = ""
			sOtherOptions = "A"
		ELSEIF sBetweenStreetAndLocality = "."
			sOtherOptions = "A"
		ELSEIF sBetweenStreetAndLocality = "/"
			sOtherOptions = "A"
		END IF
		\IFDEF SECOND_PASS
			# S/L=more lenient Street/Locality name comparison
			sOtherOptions = sOtherOptions & "S 3 6 10 15" # "S 1 4 6 8 13"
		\ENDIF
		\IFDEF PARAMETER_RecordFormatOptions
			i = VAL(paramRecordFormatOptions, -1)
			IF i >= 0
				sOtherOptions = sOtherOptions & "F"
				sOtherOptions = sOtherOptions + paramRecordFormatOptions
			END IF
			# address filter
			IF paramAddressFilter = "Postal"
				# don't do 2nd pass
				\IFDEF ARFCHOICE
					IF StreetName_ <> ""
						iLenient = 0
					END IF
				\ENDIF
				StreetName_ = ""
				StreetType_ = ""
				StreetSuffix_ = ""
				HouseNo1_ = ""
				HouseSuffix1_ = ""
				HouseNo2_ = ""
				HouseSuffix2_ = ""
				FlatType_ = ""
				FlatNo_ = ""
				LevelType_ = ""
				LevelNo_ = ""
				BuildingName1_ = ""
				BuildingName2_ = ""
				LotNo_ = ""
			ELSEIF paramAddressFilter = "Streets"
				# don't do 2nd pass
				\IFDEF ARFCHOICE
					IF PostalType_ <> ""
						iLenient = 0
					END IF
				\ENDIF
				PostalType_ = ""
				PostalNo_ = ""
				PostalPrefix_ = ""
				PostalSuffix_ = ""
			END IF
		\ENDIF
		# prepare input for iPaf32.GetDpid
		sFullPaf = JOIN(State_, 22, sDelim)
		sFullPafForFormat = sFullPaf
		sTemp = JOIN(ExtraInputs, 8, sDelim)
		sFullPaf = sFullPaf + sTemp
		\IFDEF PRESERVE_CASE_IN_PRE_ADDRESS
			sFullPaf = UCASE(sFullPaf)
			sFullPafForFormat = UCASE(sFullPafForFormat)
		\ENDIF

		# restore postal type & number
		IF sSavePostalType <> ""
			PostalType_ = sSavePostalType
			PostalNo_ = SPLIT(sSavePostalNo, 3, "\t")
		END IF
		
		iLookupOk = 0
		# choice of ARF
		\IFDEF ARFCHOICE_OR_CHOOSEARF
			# open the required ARF
			sTemp = "OpenArf;Database="
			sTemp = sTemp + sDatabase
			sTemp = sTemp + ";"
			iPafError = 0
			sId = CallPafFromStan(sTemp)
			sTemp = LEFT(sId, 5)
			# check for error
			IF iPafError <> 0
				sPafError = STR(iPafError)
				sPafError = "Opening ARF error: " + sPafError
			ELSEIF sTemp = "Error"
				sPafError = sId
			ELSE
				sId = "Id=" + sId
				sId = sId + ";"

				# tell iPaf32 which GCs we want
				IF sGIFields <> ""
					sTemp = "SetGeographicalCodes;" + sId
					sTemp = sTemp + sGIFields
					sTemp = CallPafFromStan(sTemp)
					IF iPafError <> 0
						sPafError = STR(iPafError)
						sPafError = "SetGeographicalCodes error: " + sPafError
					END IF
				END IF

				# tell iPaf32 which POIs we want
				\IFDEF AU_POI
					IF sPOI <> ""
						sTemp = "SetPointsOfInterest;" + sId
						sTemp = sTemp + sPOI
						sTemp = CallPafFromStan(sTemp)
						IF iPafError <> 0
							sPafError = STR(iPafError)
							sPafError = "SetPointsOfInterest error: " + sPafError
						END IF
					END IF
				\ENDIF
				
				# lookup address with this ARF
				sTemp = "LookupAddress;" + sId
				\IFDEF SECOND_PASS
					sTemp = sTemp + "Lenient=True;"
				\ENDIF
				sFullPaf = sTemp + sFullPaf
				sFullPaf = CallPafFromStan(sFullPaf)
				IF iPafError <> 0
					sPafError = STR(iPafError)
					sPafError = "Address lookup error: " + sPafError
				ELSE
					# address found - some info in first 22 fields (till PP Flag)
					sTemp = LEFT(sFullPaf, 22)
					IF sTemp <> s22Tabs
						sFullPafForFormat = sFullPaf
					END IF
					# format address
					sTemp = "FormatAddress;" + sId
					sTemp = sTemp + sFormatAddressOptions # "Options=86;"
					sTemp = sTemp + sFullPafForFormat
					sTemp = CallPafFromStan(sTemp)
					IF iPafError = 0
						sTemp = STRIP(sTemp, "\t")
						Address1_ = SPLIT(sTemp, 3, "\n")
					END IF
					
				END IF
				# close ARF
				sTemp = "CloseArf;" + sId
				sTemp = CallPafFromStan(sTemp)
			END IF

			# error
			IF sPafError <> ""
				Flag_ = "E"
			# no error
			ELSE
				iLookupOk = 1
			END IF

		# use default ARF
		\ELSE #ARFCHOICE_OR_CHOOSEARF
			# call DLL to do address lookup
			\IFDEF SECOND_PASS
				sFullPaf = GetDpidNonAmas(sFullPaf)
			\ELSE
				sFullPaf = GetDpid(sFullPaf)
			\ENDIF
			# no iPaf32
			IF sFullPaf = errNoIPaf32
				Flag_ = "E"
				sPafError = sFullPaf
			# error in openning paf files
			ELSEIF sFullPaf = errOpenPaf
				Flag_ = "E"
				sPafError = STR(iPafError)
				sPafError = "Error " + sPafError
				sPafError = sPafError & sFullPaf
			# error in calling GetDpid
			ELSEIF sFullPaf = errGetDpid
				Flag_ = "E"
				sPafError = STR(iPafError)
				sPafError = "Error " + sPafError
				sPafError = sPafError & sFullPaf
			# no error
			ELSE
				iLookupOk = 1
				# address found - some info in first 22 fields (till PP Flag)
				sTemp = LEFT(sFullPaf, 22)
				IF sTemp <> s22Tabs
					sFullPafForFormat = sFullPaf
				END IF
				# format address
				sTemp = "FormatAddress;Id=0;"
				sTemp = sTemp + sFormatAddressOptions # "Options=86;"
				sTemp = sTemp + sFullPafForFormat
				sTemp = CallPafFromStan(sTemp)
				IF iPafError = 0
					sTemp = STRIP(sTemp, "\t")
					Address1_ = SPLIT(sTemp, 3, "\n")
				END IF
			END IF
		\ENDIF # !ARFCHOICE_OR_CHOOSEARF

		\IFDEF SECOND_PASS
			IF iLookupOk = 1
				State_ = SPLIT(sFullPaf, nTotalPafFields, sDelim)
				# convert address elements to uppercase
				\IFDEF PRESERVE_CASE_IN_PRE_ADDRESS
					Locality_ = UCASE(Locality_)
					StreetName_ = UCASE(StreetName_)
				\ENDIF
			ELSE
				sTemp = Flag_
				State_ = SPLIT("", nTotalPafFields, sDelim)
				Flag_ = sTemp
			END IF
		\ELSE
			# no error
			IF iLookupOk = 1
				sTemp = LEFT(sFullPaf, 1)
				# there is a returned address
				IF sTemp <> sDelim
					State_ = SPLIT(sFullPaf, nTotalPafFields, sDelim)
					bAddressReturned = 1
					# Calculate Barcode
					\IFDEF DontPutDidInDpid
						IF Dpid_ <> ""
							Barcode37_ = DpidToBarcode(Dpid_)
						ELSEIF GroupDID_ <> ""
							Barcode37_ = DpidToBarcode(GroupDID_)
						ELSEIF LocalityDID_ <> ""
							Barcode37_ = DpidToBarcode(LocalityDID_)
						END IF
					\ELSE
						# put DID in DPID if appropriate. Calculate Barcode
						IF Dpid_ = ""
							IF GroupDID_ <> ""
								Dpid_ = GroupDID_
							ELSE
								Dpid_ = LocalityDID_
							END IF
						END IF
						IF Dpid_ <> ""
							Barcode37_ = DpidToBarcode(Dpid_)
						END IF
					\ENDIF
				# no returned address, but have Flag & gif codes
				ELSE
					# get reason for no match (fields 34 & 35)
					# and other fields (mainly GIF: fields 43-47)
					i = 1
					FOR j = 1 TO 33
						i = INSTR(sFullPaf, sDelim, i)
						i = i + 1
					NEXT
					sTemp = MID(sFullPaf, i)
					i = nTotalPafFields - 33
					Flag_ = SPLIT(sTemp, i, sDelim)
					\IFDEF PRESERVE_CASE_IN_PRE_ADDRESS
						# convert address elements to uppercase
						Locality_ = UCASE(Locality_)
						StreetName_ = UCASE(StreetName_)
					\ENDIF
				END IF
				# TODO? swap sLocality2 with locality
			END IF
			# use input flat type, if no flat type in PAF (@@@ optional)
			# As of iPaf32 v117 [Mar08], this is now done in iPaf32
			#IF FlatNo_ <> ""
			#	IF FlatType_ = ""
			#		IF FlatNo_ = sInputFlatNo
			#			FlatType_ = sInputFlatType
			#		END IF
			#	END IF
			#END IF

			\IFDEF ARFCHOICE
				IF iLenient = 1

					iFlag = VAL(Flag_, -1)
					# locality or street only match -> treat as no match -> try enhancer
					bStreetOrLocalityMatch = 0
					IF iFlag > 0
						i = iFlag AND 48
						IF i <> 0
							iFlag = -1
							bStreetOrLocalityMatch = 1
						END IF
					END IF
					# no match -> try enhancer
					IF iFlag < 0

						sTemp = sDatabase + ";"
						IF sGIFields <> ""
							sTemp = sTemp + "GIF="
							sTemp = sTemp + sGIFields
							sTemp = sTemp + ";"
						END IF
						\IFDEF AU_POI
							IF sPOI <> ""
								sTemp = sTemp + "POI="
								sTemp = sTemp + sPOI
								sTemp = sTemp + ";"
							END IF
						\ENDIF
						sTemp = sTemp + INPUT
						sFullPaf = ArfEnhancer(sTemp, 1)
						# no output or no 1st field (state) means not found (TODO: ok?)
						sTemp = LEFT(sFullPaf, 1)
						IF sTemp = sDelim
							sTemp = ""
						END IF
						# found an address, compare flag with that of first pass
						IF sTemp <> ""
							IF bStreetOrLocalityMatch = 1
								# get flag (fields 34 & 35)
								i = 1
								FOR j = 1 TO 33
									i = INSTR(sFullPaf, sDelim, i)
									i = i + 1
								NEXT
								sTemp3 = MID(sFullPaf, i)
								Flag_2 = SPLIT(sTemp3, 2, sDelim)
								# compare flags
								iFlag = VAL(Flag_, -1)
								iFlag2 = VAL(Flag_2, -1)
								# (only interested in comparing street/locality match)
								IF iFlag > 0
									iFlag = iFlag AND 48
								END IF
								IF iFlag2 > 0
									iFlag2 = iFlag2 AND 48
								END IF
								# first pass same or better -> keep first pass
								IF iFlag <= iFlag2
									sTemp = ""
								END IF
							END IF
						END IF
						# found an address
						IF sTemp <> ""
							sFlag1 = Flag_
							State_ = SPLIT(sFullPaf, nTotalPafFields, sDelim)
							bAddressReturned = 1
							iFlag = VAL(Flag_, -1)
							IF iFlag >= 0
								iFlag = iFlag OR 8 # amended on 2nd pass
								Flag_ = STR(iFlag)
							END IF
							# @@@ use next line to append flag from first pass
							# Flag_ = Flag_ & sFlag1
							# get address lines
							PreAddress1_ = DummyPre
							PreAddress2_ = ""
							PostAddress_ = DummyPost
							Address1_ = Addr1_
							Address2_ = Addr2_
							Address3_ = Addr3_
							# Calculate Barcode
							\IFDEF DontPutDidInDpid
								IF Dpid_ <> ""
									Barcode37_ = DpidToBarcode(Dpid_)
								ELSEIF GroupDID_ <> ""
									Barcode37_ = DpidToBarcode(GroupDID_)
								ELSEIF LocalityDID_ <> ""
									Barcode37_ = DpidToBarcode(LocalityDID_)
								END IF
							\ELSE
								# put DID in DPID if appropriate. Calculate Barcode
								IF Dpid_ = ""
									IF GroupDID_ <> ""
										Dpid_ = GroupDID_
									ELSE
										Dpid_ = LocalityDID_
									END IF
								END IF
								IF Dpid_ <> ""
									Barcode37_ = DpidToBarcode(Dpid_)
								END IF
							\ENDIF
							# use input flat type, if no flat type in PAF (@@@ optional)
							# As of iPaf32 v117 [Mar08], this is now done in iPaf32
							#IF FlatNo_ <> ""
							#	IF FlatType_ = ""
							#		IF FlatNo_ = sInputFlatNo
							#			FlatType_ = sInputFlatType
							#		END IF
							#	END IF
							#END IF
						END IF
					END IF
				END IF
			\ENDIF # ARFCHOICE
		\ENDIF # SECOND_PASS
	END IF
\ENDIF #!SKIP_DPID_LOOKUP

# [Feb10] clear "Post Office" building name (eg. "Bondi Post Office, Bondi")
	IF PostalType_ = "CARE PO"
		i = INSTR(sBuildingName, "POST OFFICE")
		IF i > 0
			sBuildingName = ""
		END IF
	END IF

# [Nov08:] return both street and postal info in fields (if option set)
\IFDEF RETURN_BOTH_STREET_AND_POSTAL_FIELDS
	IF sSavePostalType <> ""
		PostalType_ = sSavePostalType
		PostalNo_ = SPLIT(sSavePostalNo, 3, "\t")
	END IF
\ENDIF

\IFNDEF SECOND_PASS
	# [Aug08:] put in second locality, as it doesn't appear in locality info
	IF bAddressReturned = 0
		IF sLocality2 <> ""
			# swap. sLocality2 closer to the end, so has priority
			IF sVia = ""
				# remove first locality from full locality found
				i = INSTR(FoundFullLocality, Locality_)
				IF i = 1
					i = LEN(Locality_)
					i = i + 1
					FoundFullLocality = MID(FoundFullLocality, i)
					FoundFullLocality = LTRIM(FoundFullLocality, " '\"")	#"
				END IF
				#
				PostAddress_ = PostAddress_ & Locality_
				Locality_ = sLocality2
				sLocality2 = ""
			ELSE
				# locality1 via locality2, then locality1 has peference
				PostAddress_ = PostAddress_ & sLocality2
			END IF
		END IF
	END IF

	# [Mar09] restore building name (needed if flag 0x10 (16) not set)
	\IFDEF RESTORE_BUILDING_NAME
		IF sBuildingName <> ""
			i = INSTR(BuildingName1_, sBuildingName)
			IF i = 0
				IF PreAddress1_ = ""
					PreAddress1_ = sBuildingName
				ELSE
					PreAddress2_ = PreAddress2_ & sBuildingName
				END IF
			END IF
		END IF
	\ENDIF

# modification 7/2/02 - if pre address is building name -> remove it
	IF BuildingName1_ <> ""
		IF PreAddress1_ <> ""
			sTemp = BuildingName1_ & BuildingName2_
			# pre2
			IF PreAddress2_ <> ""
				# pre2
				sTemp3 = TRIM(PreAddress2_, allPunctuation)
				i = INSTR(sTemp, sTemp3)
				IF i > 0
					PreAddress2_ = ""
				END IF
			END IF
			# pre1
			sTemp3 = TRIM(PreAddress1_, allPunctuation)
			i = INSTR(sTemp, sTemp3)
			IF i > 0
				PreAddress1_ = PreAddress2_
				PreAddress2_ = ""
			END IF
			# (modification 24/1/05) - building name in pre address
			IF PreAddress1_ <> ""
				i = INSTR(PreAddress1_, sTemp)
				IF i > 0
					BuildingName1_ = ""
					BuildingName2_ = ""
				END IF
			END IF
		END IF
	END IF

# modification 9May07 - if post address is building name -> remove it
	IF BuildingName1_ <> ""
		IF PostAddress_ <> ""
			sTemp = BuildingName1_ & BuildingName2_
			# pre1
			i = INSTR(sTemp, PostAddress_)
			IF i > 0
				PostAddress_ = ""
			END IF
		END IF
	END IF

# @@@ assign a postcode from table (for GNAF, which has no postcodes)
	\IFDEF ARFCHOICE
		\IFNDEF SKIP_FINAL_POSTCODE_LOOKUP
			IF Pcode_ = ""
				IF State_ <> ""
					IF Locality_ <> ""
						# only if valid result
						IF Flag_ = "0"
							iFlag = -1
						ELSE
							iFlag = VAL(Flag_)
						END IF
						IF iFlag <> 0
							sTemp = Locality_ + State_
							sTemp = LOOKUP(sTemp, locToPcodeTable)
							IF sTemp <> ""
								i = INSTR(sTemp, ",")
								IF i < 1
									# modify postcode
									IF sTemp <> sPostcode
										# mark as amended (flag 4)
										iFlag = VAL(Flag_)
										iFlag = iFlag OR 4
										Flag_ = STR(iFlag)
										# no user's postcode
										IF sPostcode = ""
											# mark as 'amended missing Postcode'
											AmendedFlag_ = AmendedFlag_ + "f"
										ELSE
											# mark as 'amended Postcode'
											AmendedFlag_ = AmendedFlag_ + "g"
										END IF
										sPostcode = sTemp
									END IF
								END IF
							END IF
						END IF
					END IF
				END IF
				Pcode_ = sPostcode
			END IF
		\ENDIF #SKIP_FINAL_POSTCODE_LOOKUP
	\ENDIF #ARFCHOICE

# (6/9/04:) remove repeated Locality, State and Postcode from post address
	IF PostAddress_ <> ""
		# replaced by below
		IF 0 = 1
			IF PostAddress_ = Pcode_
				PostAddress_ = ""
			ELSEIF PostAddress_ = State_
				PostAddress_ = ""
			ELSEIF PostAddress_ = Locality_
				PostAddress_ = ""
			END IF
		# [Jun09:] alternate method to above (replaces above)
		ELSE
			# add spaces around to find: " " + State + " "
			PostAddress_ = " " + PostAddress_
			PostAddress_ = PostAddress_ + " "
			PostAddress_ = REPLACE(PostAddress_, "\t", " ")
			#
			PostAddress_ = REMOVE(PostAddress_, Pcode_)
			PostAddress_ = REMOVE(PostAddress_, Locality_)
			IF State_ <> ""
				sTemp = " " + State_
				sTemp = sTemp + " "
				PostAddress_ = REMOVE(PostAddress_, sTemp)
			END IF
			PostAddress_ = TRIM(PostAddress_)
			PostAddress_ = INNERTRIM(PostAddress_ )
		END IF
	END IF

# [Aug08:] remove post address if repeat of an address line
	sTemp = TCASE(PostAddress_)
	IF sTemp = Address1_
		PostAddress_ = ""
	ELSEIF sTemp = Address2_
		PostAddress_ = ""
	ELSEIF sTemp = Address3_
		PostAddress_ = ""
	END IF
# [Aug08:] remove post address if repeated street type
	IF PostAddress_ <> ""
		IF StreetType_ <> ""
			sTemp = LOOKUP(PostAddress_, street_types_multiple_words)
			IF sTemp = ""
				sTemp = LOOKUP(PostAddress_, street_types)
			END IF
			IF sTemp = StreetType_
				PostAddress_ = ""
			END IF
		END IF
	END IF
	
# remove items from RemoveList table
#	PreAddress1_ = TABLE_REMOVE(PreAddress1_, RemoveList)
#	PreAddress2_ = TABLE_REMOVE(PreAddress2_, RemoveList)
#	PostAddress_ = TABLE_REMOVE(PostAddress_, RemoveList)

# mark corner street
	IF sCornerOrAnd <> ""
		i = VAL(Flag_, -1)
		j = i AND 48 # treat locality or street match as no match
		IF j <> 0
			i = -1
		END IF
		# only if no match
		IF i < 0
			AmendedFlag_ = AmendedFlag_ + "3"
			# return both street names in street name field
			\IFDEF RETURN_BOTH_CORNER_STREETS_IN_STREET_NAME
				IF bAddressReturned = 0
					sTemp = UCASE(sStreet2Name)
					StreetName_ = "CORNER " + StreetName_
					StreetName_ = StreetName_ + " & "
					StreetName_ = StreetName_ + sTemp
				END IF
			\ENDIF
		END IF
	END IF
# convert pre/post address to Title Case
	sFullStreetName2 = sCornerOrAnd & sFullStreetName2
	PostAddress_ = sFullStreetName2 & PostAddress_
	PreAddress1_ = PreAddress1_ & sCareof
	# street name removed -> put it in pre-address info [Apr08]
	IF StreetName_ = ""
		PreAddress1_ = PreAddress1_ & sInputStreet
	END IF
	\IFNDEF PRESERVE_CASE_IN_PRE_ADDRESS
		PreAddress1_ = TCASE(PreAddress1_)
		PreAddress2_ = TCASE(PreAddress2_)
		PostAddress_ = TCASE(PostAddress_)
	\ENDIF

# remove lost quotes
	RemoveLostQuote(PostAddress_)
	RemoveLostQuote(PreAddress1_)
	RemoveLostQuote(PreAddress2_)

\ENDIF # SECOND_PASS

	# from v252 [Feb13] can return an address with a nomatch code
	IF Flag_ = "Z" OR Flag_ = "X"
		bAddressAndNoMatch = 1
	END IF

	# Split flag 6 into 4 & 2 [Apr11]
	sFlagTemp = Flag_
	sAmendFlag1 = AmendedFlag_
	iFlag = VAL(Flag_, 0)
	i = iFlag AND 6
	IF i = 6 OR bAddressAndNoMatch = 1
		# from paf v187, there's a space between items amended and those not
		i = INSTR(AmendedFlag_, " ")
		IF i > 0
			i = i - 1
			sAmendFlag1 = LEFT(AmendedFlag_, i)
			i = i + 2
			sAmendFlag2 = MID(AmendedFlag_, i)
			IF bAddressAndNoMatch = 0
				iFlag = iFlag AND NOT 2 # remove flag 2
				sFlagTemp = STR(iFlag)
			END IF
		END IF
	END IF
	
	# calculate flag string (before [Apr11] was done in DpidGeocode.grm etc)
	FlagString_ = LOOKUP(sFlagTemp, flagTable)
	IF Flag_ = "E"
		FlagString_ = FlagString_ & sPafError
	# amended code
	ELSE
		# error code with amended address
		sTemp = LEFT(sAmendFlag1, 1)
		IF bAddressAndNoMatch = 1 AND sAmendFlag1 <> "" AND sTemp <> " "
			FlagString_ = FlagString_ + ", amended"
		END IF

		S1 = ""
		WHILE sAmendFlag1 <> ""
			# not first one -> add a comma
			IF S1 <> ""
				FlagString_ = FlagString_ + ","
			END IF
			#
			S1 = LEFT(sAmendFlag1, 1)
			sAmendFlag1 = MID(sAmendFlag1, 2)
			sTemp = LOOKUP(S1, amendedFlagTable)
			FlagString_ = FlagString_ & sTemp
		WEND
		# items not amended
		IF sAmendFlag2 <> ""
			FlagString_ = FlagString_ + ", didn't amend"
			S1 = ""
			WHILE sAmendFlag2 <> ""
				# not first one -> add a comma
				IF S1 <> ""
					FlagString_ = FlagString_ + ","
				END IF
				#
				S1 = LEFT(sAmendFlag2, 1)
				sAmendFlag2 = MID(sAmendFlag2, 2)
				sTemp = LOOKUP(S1, amendedFlagTable)
				FlagString_ = FlagString_ & sTemp
			WEND
		END IF
	END IF

# [From here to end, moved from DpidGeocode.grm] [Jun13]

# format address lines into Address1_, Address2_ & Address3_

# check if address valid
\IFNDEF ALWAYS_FORMAT_ADDRESS
	# ensure pcode or locality
	IF Locality_ = ""
		IF Pcode_ = ""
			bInvalidAddress = bTrue
		END IF
	END IF
	IF bInvalidAddress = bFalse
		# ensure postal type & number OR street & number OR building name OR
		#	street match OR corner
		IF PostalType_ = ""
			IF StreetName_ = ""
				IF BuildingName1_ = ""
					bInvalidAddress = bTrue
				END IF
			ELSE
				IF HouseNo1_ = ""
					IF LotNo_ = ""
						# corner addresses -> valid
						IF sCornerOrAnd <> "" # [Oct13]
							i = INSTR(sStreet2Name, "/")
							IF i = 0 # if have slash in 2nd street name, 1st street probably building
								\IFNDEF RETURN_BOTH_CORNER_STREETS_IN_STREET_NAME
									bCornerStreetFormatting = 1
									Address1_ = "" # don't use formatted from iPaf32
								\ENDIF
							END IF
						ELSE
							i = VAL(Flag_, 0)
							i = i AND 16 # 16=street only match
							IF i = 0
								IF BuildingName1_ = "" # [May12]
									\IFNDEF FORMAT_ADDRESS_EVEN_IF_NO_HOUSENUM # [Jun13]
										bInvalidAddress = bTrue
									\ENDIF
								END IF
							# [don't need this anymore, as done above]
							\IFNDEF RETURN_BOTH_CORNER_STREETS_IN_STREET_NAME
							ELSEIF sCornerOrAnd <> ""
								bCornerStreetFormatting = 1
								Address1_ = "" # don't use formatted from iPaf32
							\ENDIF
							END IF
						END IF
					END IF
				END IF
			END IF
		ELSE
			IF PostalNo_ = ""
				# some postal types don't need a number
				sTemp = LOOKUP(PostalType_, postal_delivery_type2)
				IF sTemp <> PostalType_
					sTemp = LOOKUP(PostalType_, postal_delivery_type3)
					IF sTemp <> PostalType_
						bInvalidAddress = bTrue
					END IF
				END IF
			END IF
		END IF
	END IF
\ENDIF

# create address lines
	IF bInvalidAddress = bFalse
		# Format using custom grammar
		\IFDEF USE_SITE_FORMAT_ADDRESS
			sSaveFlatType = FlatType_
			\IFDEF CUSTOM_FCS
				# use flat type even if no flat number
				IF sInputFlatType <> ""
					IF FlatNo_ = ""
						IF FlatType_ = ""
							FlatType_ = sInputFlatType
						END IF
					END IF
				END IF
				# don't output flat type unless in input (except for U)
				IF sInputFlatType = ""
					IF FlatNo_ <> ""
						IF FlatType_ <> "U"
							FlatType_ = ""
						END IF
					END IF
				END IF
			\ENDIF
			#
			sTemp = JOIN(State_, 22, "\t")
			FlatType_ = sSaveFlatType
			Address1_ = Site_FormatAddress(sTemp, 3)
			# remove second street from post address [Sep09]
			IF sStreet2Name <> ""
				i = INSTR(Address1_, sStreet2Name)
				IF i = 0
					i = INSTR(Address2_, sStreet2Name)
					IF i = 0
						i = INSTR(Address3_, sStreet2Name)
					END IF
				END IF
				IF i > 0
					sFullStreetName2 = TCASE(sFullStreetName2)
					PostAddress_ = REMOVE(PostAddress_, sFullStreetName2)
				END IF
			END IF
		\ELSE # !USE_SITE_FORMAT_ADDRESS
			# iPaf32 doesn't format levelType=BL
			IF LevelType_ = "BL"
				Address1_ = ""
			END IF
			# address lines not formatted above
			#	(eg. older version of iPaf32 [May07], or if SKIP_DPID_LOOKUP)
			IF Address1_ = ""
				# postal address line
				sPostaladdr = PostalType_
				sTemp = PostalPrefix_ + PostalNo_
				sTemp = sTemp + PostalSuffix_
				sPostaladdr = sPostaladdr & sTemp
				# flat type
				sFlatType = FlatType_
				# use "U" as flat type if there isn't one
				\IFDEF ALWAYS_HAVE_UNIT_TYPE_IN_ADDRESS_LINES
					IF sFlatType = "" AND FlatNo_ <> ""
						sFlatType = "U"
					END IF
				\ENDIF
				# flat
				IF sFlatType <> ""
					\IFDEF USE_SHORT_FLAT_TYPE
						sFlataddr = sFlatType
					\ELSE
						sFlataddr = LOOKUP(sFlatType, expandFlatTypeTable)
						IF sFlataddr = "" # flat type not in table [May11]
							sFlataddr = sFlatType
						END IF
					\ENDIF
					iLen1 = LEN(sFlataddr)
					IF iLen1 > 2
						sFlataddr = TCASE(sFlataddr)
					END IF
					sFlataddr = sFlataddr & FlatNo_
				END IF
				# level
				IF LevelType_ <> ""
					sLeveladdr = LOOKUP(LevelType_, expandLevelTable)
					iLen1 = LEN(sLeveladdr)
					IF iLen1 > 2
						sLeveladdr = TCASE(sLeveladdr)
					END IF
					IF LevelNo_ <> ""
						sLeveladdr = sLeveladdr & LevelNo_
					ELSEIF LevelType_ = "L" OR LevelType_ = "LEVEL" OR \
							LevelType_ = "FL" OR LevelType_ = "FLOOR"
						bMissingLevelNum = bTrue
					END IF
				END IF
				# lot number
\IFDEF NO_LOT_IF_HAVE_STREET_IN_ADDRESS_LINES
				IF LotNo_ <> "" AND HouseNo1_ = ""
\ELSE
				IF LotNo_ <> ""
\ENDIF
					IF HouseNo1_ <> ""
						bLotAndStreet = bTrue
					END IF
					#	- flat with no type and no house number
					IF HouseNo1_ = "" AND FlatNo_ <> "" AND sFlatType = ""
						sStreetaddr = FlatNo_ + "/"
					END IF
					#	- lot number
					sStreetaddr = sStreetaddr + "Lot "
					sStreetaddr = sStreetaddr + LotNo_
					IF HouseNo1_ <> ""
						sStreetaddr = sStreetaddr + ", "
					END IF
				END IF
				# street number
				IF HouseNo1_ <> ""
					# unit number without type
					IF FlatNo_ <> "" AND sFlatType = ""
						sStreetaddr = sStreetaddr + FlatNo_
						sStreetaddr = sStreetaddr + "/"
					END IF
					# street number
					sStreetaddr = sStreetaddr + HouseNo1_
					sStreetaddr = sStreetaddr + HouseSuffix1_
					# range
					IF HouseNo2_ <> ""
						sStreetaddr = sStreetaddr + "-"
						sStreetaddr = sStreetaddr + HouseNo2_
						sStreetaddr = sStreetaddr + HouseSuffix2_
					END IF
				END IF
				# corner street [Jun09]
				IF bCornerStreetFormatting = 1
					# fix for "Corner Mount & Walker St" (StreetName=Corner) [Oct13]
					IF sCornerOrAnd = "AND" OR sCornerOrAnd = "&"
						IF StreetType_ <> "" AND StreetSuffix_ = ""
							sTemp = LOOKUP(StreetName_, cornerTable)
							IF sTemp <> ""
								StreetName_ = StreetType_
								StreetType_ = sStreet2Type
							END IF
						END IF
					END IF
					#
					sTemp = "CNR " + StreetName_
					IF sStreet2Type <> StreetType_
						sTemp = sTemp & StreetType_
					END IF
					sTemp = sTemp + " & "
					sTemp = sTemp + sStreet2Name
					sTemp = sTemp & sStreet2Type
					sTemp = TCASE(sTemp)
					sStreetaddr = sStreetaddr & sTemp
					# remove second street from post address
					sFullStreetName2 = TCASE(sFullStreetName2)
					PostAddress_ = REMOVE(PostAddress_, sFullStreetName2)
				ELSE
					# street name
					sStreetName = StreetName_
					#	type
					\IFDEF EXPAND_STREET_ABBRS
						sTemp = LOOKUP(StreetType_, expandStreetTypeTable)
						IF sTemp = ""
							sTemp = StreetType_
						END IF
					\ELSE
						sTemp = StreetType_
					\ENDIF
					sStreetName = sStreetName & sTemp
					#	suffix
					\IFDEF EXPAND_STREET_ABBRS
						sTemp = LOOKUP(StreetSuffix_, expandStreetSuffixTable)
						IF sTemp = ""
							sTemp = StreetSuffix_
						END IF
					\ELSE
						sTemp = StreetSuffix_
					\ENDIF
					sStreetName = sStreetName & sTemp
					#	IF bUppercase = bFalse
					sStreetName = TCASE(sStreetName)
					sStreetaddr = sStreetaddr & sStreetName
				END IF
				# building name
				\IFNDEF NO_BUILDING_IN_ADDRESS_LINES
					sBuildingaddr = BuildingName1_
					# concatenate Building2 only if don't need to truncate
					IF BuildingName2_ <> ""
						iLen1 = LEN(BuildingName1_)
						iLen2 = LEN(BuildingName2_)
						iLen1 = iLen1 + iLen2
						IF iLen1 < 50 #SIZEOF(Address1_)
							sBuildingaddr = BuildingName1_ & BuildingName2_
						END IF
					END IF
					sBuildingaddr = TCASE(sBuildingaddr)
					\IFDEF PARSE_BUILDING_NAME_IN_QUOTES
						# quote building name
						IF sBuildingaddr <> ""
							sBuildingaddr = sQuote + sBuildingaddr
							sBuildingaddr = sBuildingaddr + sQuote
						END IF
					\ENDIF
				\ENDIF
				# put it all together
				# building & no street -> Flat  Level, Building
				IF sBuildingaddr <> "" AND sStreetaddr = ""
					Address1_ = sFlataddr
					IF sFlataddr <> "" AND sLeveladdr <> ""
						Address1_ = Address1_ + "  "
					END IF
					Address1_ = Address1_ + sLeveladdr
					Address2_ = sPostaladdr
					Address3_ = sBuildingaddr
				# building first (if exists)
				ELSE
					Address1_ = sBuildingaddr
					# "Flat  Level, Street"
					IF bLotAndStreet = bTrue OR bMissingLevelNum = bTrue
						Address2_ = sFlataddr
						IF sFlataddr <> "" AND sLeveladdr <> ""
							Address2_ = Address2_ + "  "
						END IF
						Address2_ = Address2_ + sLeveladdr
						IF sPostaladdr = ""
							Address3_ = sStreetaddr
						ELSE
							Address3_ = Address2_ & sStreetaddr
							Address2_ = sPostaladdr
						END IF
					# "Flat, Level  Street"
					ELSEIF sPostaladdr = "" AND sFlataddr <> "" AND \
							sLeveladdr <> "" AND sStreetaddr <> ""
						Address2_ = sFlataddr
						Address3_ = sLeveladdr + "  "
						Address3_ = Address3_ + sStreetaddr
					# "Flat  Street" or "Level  Street"
					ELSE
						Address3_ = sFlataddr
						IF Address3_ <> "" AND sLeveladdr <> ""
							Address3_ = Address3_ + "  "
						END IF
						Address3_ = Address3_ + sLeveladdr
						IF Address3_ <> "" AND sStreetaddr <> ""
							Address3_ = Address3_ + "  "
						END IF
						Address3_ = Address3_ + sStreetaddr
						Address2_ = sPostaladdr
					END IF
				END IF
				# ensure that Address lines are filled from the beginning
				IF Address2_ = ""
					Address2_ = Address3_
					Address3_ = ""
				END IF
				IF Address1_ = ""
					Address1_ = Address2_
					Address2_ = Address3_
					Address3_ = ""
				END IF
			END IF
		\ENDIF # USE_SITE_FORMAT_ADDRESS
		# remove quotes from pre & post address lines [Feb10]
		\IFDEF REMOVE_QUOTES_FROM_PRE_ADDRESS
			PreAddress1_ = REPLACE(PreAddress1_, "\"'")
			PreAddress1_ = TRIM(PreAddress1_)
			PreAddress2_ = REPLACE(PreAddress2_, "\"'")
			PreAddress2_ = TRIM(PreAddress2_)
			PostAddress_ = REPLACE(PostAddress_, "\"'")
			PostAddress_ = TRIM(PostAddress_)
		\ENDIF

# just return input lines as address (broken by lf or tab)
	ELSE
		sINPUT = INPUT
		# clear address lines (set by FormatAddress)
		Address1_ = ""
		Address2_ = ""
		Address3_ = ""
		# remove locality information from line
		IF FoundFullLocality <> ""
			i = INSTR(sINPUT, FoundFullLocality)
			IF i > 0
				iLen1 = LEN(FoundFullLocality)
				iLen1 = iLen1 + i # position after FoundFullLocality
				i = i - 1 # position before FoundFullLocality
				sTemp = MID(sINPUT, iLen1)
				sINPUT = LEFT(sINPUT, i)
				sINPUT = sINPUT & sTemp
				# TODO? This may be already done above (Aug08)
				# put in second locality, as it doesn't appeat in locality info
				IF sLocality2 <> ""
					# swap. sLocality2 closer to the end, so has priority
					IF sVia = ""
						sINPUT = sINPUT & Locality_
						Locality_ = sLocality2
					ELSE
						# locality1 via locality2, then locality1 has peference
						sINPUT = sINPUT & sLocality2
					END IF
				END IF
			END IF
		END IF
		# remove preaddress from address lines [Apr12 DI]
		\IFDEF YJ_DONT_THINK_WE_NEED_THIS_ANY_MORE_JUL13 # [Jul13]
			IF PreAddress1_ <> ""
				sPreAddress = UCASE(PreAddress1_) # as sINPUT is in uppercase
				i = INSTR(sINPUT, sPreAddress)
				IF i > 0
					iLen1 = LEN(PreAddress1_)
					iLen1 = iLen1 + i # position after
					i = i - 1 # position before
					sTemp = MID(sINPUT, iLen1)
					sTemp = TRIM(sTemp, ",\t ")
					sINPUT = LEFT(sINPUT, i)
					sINPUT = sINPUT & sTemp
					# keep PreAddress1_
				ELSE
					PreAddress1_ = ""
				END IF
			END IF
		\ENDIF

		# not returning pre & post address lines
		PreAddress1_ = ""
		PreAddress2_ = ""
		PostAddress_ = ""
		sINPUT = TRIM(sINPUT, "\n\r\t ,")
		# line 1
		i = INSTR(sINPUT, "\n")
		IF i <= 1
			i = INSTR(sINPUT, "\t")
		END IF
		IF i <= 1
			Address1_ = sINPUT
		ELSE
			i = i - 1
			Address1_ = LEFT(sINPUT, i)
			i = i + 2
			sINPUT = MID(sINPUT, i)
			# line 2
			i = INSTR(sINPUT, "\n")
			IF i <= 1
				i = INSTR(sINPUT, "\t")
			END IF
			IF i <= 1
				Address2_ = sINPUT
			ELSE
				i = i - 1
				Address2_ = LEFT(sINPUT, i)
				i = i + 2
				# line 3
				Address3_ = MID(sINPUT, i)
			END IF
		END IF

		# --- [Jul09] look for locality info doubled at end
		Address1_ = TRIM(Address1_, "\n\r\t ,")
		Address2_ = TRIM(Address2_, "\n\r\t ,")
		Address3_ = TRIM(Address3_, "\n\r\t ,")
		IF Address3_ <> ""
			sLastAddressLine = Address3_
		ELSEIF Address2_ <> ""
			sLastAddressLine = Address2_
		ELSEIF Address1_ <> ""
			sLastAddressLine = Address1_
		END IF
		i = INSTRREV(sLastAddressLine, " ")
		IF i > 0
			j = i + 1
			sTemp = MID(sLastAddressLine, j)
		ELSE
			sTemp = sLastAddressLine
		END IF
		IF sTemp <> Pcode_
			IF sTemp <> Locality_
				IF sTemp <> State_
					i = -1 # doesn't end with doubled locality info
				END IF
			END IF
		END IF
		# remove doubled locality info
		IF i = 0
			sLastAddressLine = ""
		ELSEIF i > 0
			sLastAddressLine = LEFT(sLastAddressLine, i)
			# look for locality info doubled at end
			sLastAddressLine = TRIM(sLastAddressLine, "\n\r\t ,")
			i = INSTRREV(sLastAddressLine, " ")
			IF i > 0
				j = i + 1
				sTemp = MID(sLastAddressLine, j)
			ELSE
				sTemp = sLastAddressLine
			END IF
			IF sTemp <> Pcode_
				IF sTemp <> Locality_
					IF sTemp <> State_
						i = -1 # doesn't end with doubled locality info
					END IF
				END IF
			END IF
			# remove doubled locality info
			IF i = 0
				sLastAddressLine = ""
			ELSEIF i > 0
				sLastAddressLine = LEFT(sLastAddressLine, i)
				# look for locality info doubled at end
				sLastAddressLine = TRIM(sLastAddressLine, "\n\r\t ,")
				i = INSTRREV(sLastAddressLine, " ")
				IF i > 0
					j = i + 1
					sTemp = MID(sLastAddressLine, j)
				ELSE
					sTemp = sLastAddressLine
				END IF
				IF sTemp <> Pcode_
					IF sTemp <> Locality_
						IF sTemp <> State_
							i = -1 # doesn't end with doubled locality info
						END IF
					END IF
				END IF
				# remove doubled locality info
				IF i >= 0
					sLastAddressLine = LEFT(sLastAddressLine, i)
				END IF
			END IF
		END IF
		IF Address3_ <> ""
			Address3_ = sLastAddressLine
		ELSEIF Address2_ <> ""
			Address2_ = sLastAddressLine
		ELSEIF Address1_ <> ""
			Address1_ = sLastAddressLine
		END IF
		# ---

		# standardise corner address [Jun09]
		IF sCornerOrAnd <> ""
			# "Corner of "
			sTemp = LEFT(Address1_, 10)
			IF sTemp = "CORNER OF "
				Address1_ = MID(Address1_, 10)
				Address1_ = "CNR" + Address1_
			ELSE
				# "Corner "
				sTemp = LEFT(Address1_, 7)
				IF sTemp = "CORNER "
					Address1_ = MID(Address1_, 7)
					Address1_ = "CNR" + Address1_
				# "Cnr of "
				ELSEIF sTemp = "CNR OF "
					Address1_ = MID(Address1_, 7)
					Address1_ = "CNR" + Address1_
				# "Crn of "
				ELSEIF sTemp = "CRN OF "
					Address1_ = MID(Address1_, 7)
					Address1_ = "CNR" + Address1_
				ELSE
					# "Crn "
					sTemp = LEFT(Address1_, 4)
					IF sTemp = "CRN "
						Address1_ = MID(Address1_, 4)
						Address1_ = "CNR" + Address1_
					END IF
				END IF
			END IF
		END IF
		
		# convert to title case [8Jun06]
		\IFNDEF PRESERVE_CASE_IN_PRE_ADDRESS
			Address1_ = TCASE(Address1_)
			Address2_ = TCASE(Address2_)
			Address3_ = TCASE(Address3_)
		\ENDIF
		# move to pre address lines
		\IFDEF IGNORE_POST_ADDRESS
			\IFDEF IGNORE_PRE_ADDRESS
				PreAddress1_ = Address1_
				PreAddress2_ = Address2_ & Address3_
				Address1_ = ""
				Address2_ = ""
				Address3_ = ""
			\ENDIF
		\ENDIF
	END IF

# place "C/-" in Address1_ instead of in preaddress
	\IFDEF CAREOF_IN_ADDRESSLINE
		IF PreAddress1_ = "C/-"
			Address1_ = PreAddress1_ & Address1_
			PreAddress1_ = ""
		END IF
	\ENDIF

# 28/01/2000: if no dpid, add preAddress to Address1_ if less that 5 characters
	\IFNDEF IGNORE_POST_ADDRESS
		IF Dpid_ = ""
			IF PreAddress2_ = ""
				IF PreAddress1_ <> ""
					i = LEN(PreAddress1_)
					IF i < 5
						i = LEN(Address1_)
						IF i < 25
							PreAddress1_ = PreAddress1_ & Address1_
							Address1_ = PreAddress1_
							PreAddress1_ = ""
						END IF
					END IF
				END IF
			END IF
		END IF
	\ENDIF

# 5/04/2007: (@@@ optional) consider PostAddress_ as locality if no locality was found
	\IFDEF LOCALITYASPOSTADDRESS
		IF PostAddress_ <> ""
			IF Locality_ = ""
				Locality_ = PostAddress_
				PostAddress_ = ""
			END IF
		END IF
	\ENDIF

	\IFDEF OUTPUTADDRESSFIELDS
		# don't place pre/post into address lines, otherwise will get doubled
	\ELSE
		# 25/05/2000: (@@@ optional) include pre & PostAddress_ in the address lines
		# assumes that address lines are filled from the beginning (see above)
		# insert 1st pre address line
		\IFNDEF IGNORE_PRE_ADDRESS
			IF PreAddress1_ <> ""
				IF Address3_ = ""
					Address3_ = Address2_
					Address2_ = Address1_
					Address1_ = PreAddress1_
					# insert 2nd pre address line
					IF PreAddress2_ <> ""
						# is there room? (IF Address3_ = "" AND PostAddress_ = "")
						bDoIt = bFalse
						IF Address3_ = ""
							IF PostAddress_ = ""
								bDoIt = bTrue
							END IF
						END IF
						IF bDoIt = bTrue
							Address3_ = Address2_
							Address2_ = PreAddress2_
						# no room -> join pre1 & pre2 (might lose some info here)
						ELSE
							Address1_ = Address1_ & PreAddress2_
						END IF
					END IF
					\IFDEF CLEAR_PRE_ADDRESS
						PreAddress1_ = ""
						PreAddress2_ = ""
					\ENDIF
				END IF
			END IF
		\ENDIF
		
		# PostAddress_ line (and room for it, else leave in post address)
		\IFNDEF IGNORE_POST_ADDRESS
			IF PostAddress_ <> ""
				IF Address3_ = ""
					IF Address2_ = ""
						IF Address1_ = ""
							Address1_ = PostAddress_
						ELSE
							Address2_ = PostAddress_
						END IF
					ELSE
						Address3_ = PostAddress_
					END IF
					\IFDEF CLEAR_PRE_ADDRESS
						PostAddress_ = ""
					\ENDIF
				END IF
			END IF
		\ENDIF
	\ENDIF #!OUTPUTADDRESSFIELDS

# title case [Apr12]
	IF bInvalidAddress = bTrue
		Address1_ = TCASE(Address1_)
		Address2_ = TCASE(Address2_)
		Address3_ = TCASE(Address3_)
	END IF
# convert "P/LTD" back to "P/L"
	IF bPL = bTrue
		RevertPLFix(Address1_)
		RevertPLFix(Address2_)
		RevertPLFix(Address3_)
		RevertPLFix(PreAddress1_)
		RevertPLFix(PreAddress2_)
		RevertPLFix(PostAddress_)
		RevertPLFix(BuildingName1_)
		RevertPLFix(BuildingName2_)
		RevertPLFix(StreetName_)
	END IF
