diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/404.html b/404.html new file mode 100644 index 000000000..06f4bd87c --- /dev/null +++ b/404.html @@ -0,0 +1,4543 @@ + + + + + + + + + + + + + + + + + + + VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + +

Can't find what you're looking for!

+ +

Unfortunately the page or link you are looking for is no longer available, or has moved.

+ +

+ Please use the search function at the top of the page to find what you're looking for.
+ Additionally, you can report this on the SOPs Issues page. +

+ + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..b33a5bb07 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +sops.vatpac.org \ No newline at end of file diff --git a/aerodromes/Adelaide/index.html b/aerodromes/Adelaide/index.html new file mode 100644 index 000000000..a43165ce3 --- /dev/null +++ b/aerodromes/Adelaide/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Albury/index.html b/aerodromes/Albury/index.html new file mode 100644 index 000000000..e9d63f975 --- /dev/null +++ b/aerodromes/Albury/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Alice/index.html b/aerodromes/Alice/index.html new file mode 100644 index 000000000..e96da765c --- /dev/null +++ b/aerodromes/Alice/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Amberley/index.html b/aerodromes/Amberley/index.html new file mode 100644 index 000000000..015624b90 --- /dev/null +++ b/aerodromes/Amberley/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Archerfield/index.html b/aerodromes/Archerfield/index.html new file mode 100644 index 000000000..0bdf333ac --- /dev/null +++ b/aerodromes/Archerfield/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Avalon/index.html b/aerodromes/Avalon/index.html new file mode 100644 index 000000000..43597ae53 --- /dev/null +++ b/aerodromes/Avalon/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Bankstown/index.html b/aerodromes/Bankstown/index.html new file mode 100644 index 000000000..9cec68515 --- /dev/null +++ b/aerodromes/Bankstown/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Brisbane/index.html b/aerodromes/Brisbane/index.html new file mode 100644 index 000000000..e36627659 --- /dev/null +++ b/aerodromes/Brisbane/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Broome/index.html b/aerodromes/Broome/index.html new file mode 100644 index 000000000..b0acc3446 --- /dev/null +++ b/aerodromes/Broome/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Cairns/index.html b/aerodromes/Cairns/index.html new file mode 100644 index 000000000..444aff4c1 --- /dev/null +++ b/aerodromes/Cairns/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Camden/index.html b/aerodromes/Camden/index.html new file mode 100644 index 000000000..0ce3c4a2f --- /dev/null +++ b/aerodromes/Camden/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Canberra/index.html b/aerodromes/Canberra/index.html new file mode 100644 index 000000000..4a5cc9dfe --- /dev/null +++ b/aerodromes/Canberra/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Coffs/index.html b/aerodromes/Coffs/index.html new file mode 100644 index 000000000..8f1c66b49 --- /dev/null +++ b/aerodromes/Coffs/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Curtin/index.html b/aerodromes/Curtin/index.html new file mode 100644 index 000000000..775ce8485 --- /dev/null +++ b/aerodromes/Curtin/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Darwin/index.html b/aerodromes/Darwin/index.html new file mode 100644 index 000000000..57de6f5ba --- /dev/null +++ b/aerodromes/Darwin/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/EastSale/index.html b/aerodromes/EastSale/index.html new file mode 100644 index 000000000..dfbf5e599 --- /dev/null +++ b/aerodromes/EastSale/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Edinburgh/index.html b/aerodromes/Edinburgh/index.html new file mode 100644 index 000000000..c636cc593 --- /dev/null +++ b/aerodromes/Edinburgh/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Essendon/index.html b/aerodromes/Essendon/index.html new file mode 100644 index 000000000..93deb1022 --- /dev/null +++ b/aerodromes/Essendon/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Gingin/index.html b/aerodromes/Gingin/index.html new file mode 100644 index 000000000..0d628f816 --- /dev/null +++ b/aerodromes/Gingin/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Goldy/index.html b/aerodromes/Goldy/index.html new file mode 100644 index 000000000..addedbbd9 --- /dev/null +++ b/aerodromes/Goldy/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Hammo/index.html b/aerodromes/Hammo/index.html new file mode 100644 index 000000000..cea811400 --- /dev/null +++ b/aerodromes/Hammo/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Hobart/index.html b/aerodromes/Hobart/index.html new file mode 100644 index 000000000..15cc7834e --- /dev/null +++ b/aerodromes/Hobart/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Jandakot/index.html b/aerodromes/Jandakot/index.html new file mode 100644 index 000000000..3c01076fb --- /dev/null +++ b/aerodromes/Jandakot/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Karratha/index.html b/aerodromes/Karratha/index.html new file mode 100644 index 000000000..fb813f1e3 --- /dev/null +++ b/aerodromes/Karratha/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Launceston/index.html b/aerodromes/Launceston/index.html new file mode 100644 index 000000000..8768b2e71 --- /dev/null +++ b/aerodromes/Launceston/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Learmonth/index.html b/aerodromes/Learmonth/index.html new file mode 100644 index 000000000..108cfb3ac --- /dev/null +++ b/aerodromes/Learmonth/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Mackay/index.html b/aerodromes/Mackay/index.html new file mode 100644 index 000000000..6e40da7a1 --- /dev/null +++ b/aerodromes/Mackay/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Melbourne/index.html b/aerodromes/Melbourne/index.html new file mode 100644 index 000000000..f8f555124 --- /dev/null +++ b/aerodromes/Melbourne/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Moorabbin/index.html b/aerodromes/Moorabbin/index.html new file mode 100644 index 000000000..6f1576d1f --- /dev/null +++ b/aerodromes/Moorabbin/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Nowra/index.html b/aerodromes/Nowra/index.html new file mode 100644 index 000000000..707a4a5c6 --- /dev/null +++ b/aerodromes/Nowra/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Oakey/index.html b/aerodromes/Oakey/index.html new file mode 100644 index 000000000..b856c0ba9 --- /dev/null +++ b/aerodromes/Oakey/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Parafield/index.html b/aerodromes/Parafield/index.html new file mode 100644 index 000000000..9a915d29e --- /dev/null +++ b/aerodromes/Parafield/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Pearce/index.html b/aerodromes/Pearce/index.html new file mode 100644 index 000000000..071eeb5d4 --- /dev/null +++ b/aerodromes/Pearce/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Perth/index.html b/aerodromes/Perth/index.html new file mode 100644 index 000000000..f6d30797f --- /dev/null +++ b/aerodromes/Perth/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Richmond/index.html b/aerodromes/Richmond/index.html new file mode 100644 index 000000000..181089d30 --- /dev/null +++ b/aerodromes/Richmond/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Rockhampton/index.html b/aerodromes/Rockhampton/index.html new file mode 100644 index 000000000..cbf99b755 --- /dev/null +++ b/aerodromes/Rockhampton/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Scherger/index.html b/aerodromes/Scherger/index.html new file mode 100644 index 000000000..74789b63d --- /dev/null +++ b/aerodromes/Scherger/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Sunshinecoast/index.html b/aerodromes/Sunshinecoast/index.html new file mode 100644 index 000000000..26bea4e40 --- /dev/null +++ b/aerodromes/Sunshinecoast/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Sydney/index.html b/aerodromes/Sydney/index.html new file mode 100644 index 000000000..f479c7619 --- /dev/null +++ b/aerodromes/Sydney/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Tamworth/index.html b/aerodromes/Tamworth/index.html new file mode 100644 index 000000000..6fd4706ee --- /dev/null +++ b/aerodromes/Tamworth/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Tindal/index.html b/aerodromes/Tindal/index.html new file mode 100644 index 000000000..695c27b95 --- /dev/null +++ b/aerodromes/Tindal/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Townsville/index.html b/aerodromes/Townsville/index.html new file mode 100644 index 000000000..123996782 --- /dev/null +++ b/aerodromes/Townsville/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Williamtown/index.html b/aerodromes/Williamtown/index.html new file mode 100644 index 000000000..3ff7c23e3 --- /dev/null +++ b/aerodromes/Williamtown/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/Woomera/index.html b/aerodromes/Woomera/index.html new file mode 100644 index 000000000..6e6e9dbc5 --- /dev/null +++ b/aerodromes/Woomera/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/aerodromes/classc/Adelaide/index.html b/aerodromes/classc/Adelaide/index.html new file mode 100644 index 000000000..27c69991b --- /dev/null +++ b/aerodromes/classc/Adelaide/index.html @@ -0,0 +1,5091 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Adelaide (YPAD) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Adelaide (YPAD)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Adelaide ADCAdelaide Tower120.500AD_TWR
Adelaide SMCAdelaide Ground121.700AD_GND
Adelaide ACDAdelaide Delivery126.100AD_DEL
Adelaide ATIS134.500YPAD_ATIS
+

Airspace

+

AD ADC is not responsible for any airspace by default.

+

Maneuvering Area Responsibility

+
+

YPAD Maneuvering Area +

+
YPAD Maneuvering Area
+
+
+

Note

+

Where an aircraft will be taxiing via multiple taxiways of the same lettering (e.g. A6, then A5, then A4, etc), refer to the taxiway by only the letter.

+

E.g. an aircraft taxiing from the terminal to runway 05 could be instructed to taxi "via Alpha, cross runway 30, Foxtrot, to holding point Foxtrot Six runway 05".

+
+

Scenic Coastal Flights

+

VFR aircraft may transit the control zone tracking coastal north or southbound, generally at A005. AD TCU is responsible for ensuring these aircraft remain separated from aircraft arriving/departing at YPAD and will likely delegate this responsibility to ADC, who may employ visual separation or other tools to ensure separation is maintained.

+

The TCU controller will coordinate these aircraft with ADC prior to issuing airways clearance, including the intended clearance limit. On receipt of this coordination, ADC should consider any possible conflict from arriving or departing aircraft at YPAD (including the missed approach to runway 23). The clearance limits in the table below will ensure that coastal aircraft remain clear of the runway 05 approach path and runway 23 departure/missed approach path.

+ + + + + + + + + + + + + + + + + +
Direction of TravelClearance Limit
NorthboundBTJ
SouthboundHNLY
+
+

Clearance Limits +

+
Clearance Limits (red) and Approach/Departure Path (green)
+
+
+

Example

+

CNY is a VFR Cessna 172 tracking coastal northbound, approaching PNL. They have contacted AD TCU for clearance.
+TCU -> ADC: "South of PNL, CNY, for coastal northbound, 500ft, clearance limit BTJ"
+ADC -> TCU: "CNY"

+
+

If a delay is expected at the clearance limit, instruct the aircraft to hold there.

+
+

Example

+

CNY: "Adelaide Tower, CNY, maintaining not above 500ft"
+AD ADC: "CNY, Adelaide Tower, hold at the clearance limit, expect onwards clearance in 5 minutes due inbound traffic"
+CNY: "Hold at the clearance limit, CNY"

+
+

Once the conflict is no longer a threat (or if no holding was required in the first place), cancel the clearance limit and issue onwards clearance tracking coastal north/southbound at the desired level.

+
+

Example

+

AD ADC: "CNY, cancel clearance limit, track coastal offshore northbound, not above 500ft"
+CNY: "Cancel clearance limit, track coastal offshore northbound, not above 500ft, CNY"

+
+

Once the aircraft is clear of potential conflict with YPAD (i.e. north of HNLY or south of BTJ), transfer them back to AD TCU.

+

Runway Modes

+

Single runway operations using Runway 05 or 23 (whichever is more favoured by the winds) are preferred at YPAD. However, when strong winds favour Runway 12 or 30, Non-Jets (Runway 12/30 is too short for most jets) would benefit from having that runway available to them as well. As a general rule of thumb, if the Crosswind on Runway 05/23 exceeds 20kts, the more favourable of Runway 12 or 30 shall be in use as well as the more favourable of Runway 05 or 23.

+
+

Example

+

METAR: YPAD 210600Z 15030KT 9999 FEW030 21/11 Q1002 RMK RF00.0/000.0
+ATIS: RUNWAY 23 AND 12 FOR ARRIVALS AND DEPARTURES

+
+
+

Note

+

Where low traffic levels and relevant meteorological conditions permit, non-jet arrivals from the west may be offered runway 12.

+
+

Runway 23 Arrivals

+

With Runway 23 in use for arrivals and the cloud base above A024 but below A043, the ATIS APCH field shall include:
+ACFT FM THE EAST AND JET ACFT FM THE WEST EXP INSTR APCH

+

This allows aircraft on the Victor STAR from the west to join a visual right base without the need to conduct an instrument approach, while keeping aircraft from the east clear of the higher terrain near the Adelaide Hills.

+

Curfew Mode

+

Between the hours of 1330-2030 UTC (1230-1930 UTC HDS), AD ADC may elect to simulate Curfew operations, ie: Runway 05 for arrivals, Runway 23 for departures. When this is in operation, the ATIS shall include CURFEW IN OPERATION UNTIL (time) ZULU.

+

SID Selection

+

Jet Aircraft planned via AVDEN, BENDO, GILES, AREPA, ORBUN. or UPROT, shall be assigned the Procedural SID that terminates at the appropriate waypoint. Jet Aircraft not planned via any of these waypoints shall receive amended routing via the most appropriate SID terminus, unless the pilot indicates they are unable to accept a Procedural SID.

+
+

Example

+

Jet Aircraft planned via AVDEN, assigned runway 23, shall be given the AVDEN SID.

+
+

a) Non-Jet Aircraft; or
+b) Aircraft using Runway 12/30; or
+c) Aircraft that cannot accept a Procedural SID
+Shall be assigned the Radar SID.

+
+

Example

+

Non-Jet Aircraft planned via EEMUE, assigned runway 05, shall be given the AD (RADAR) SID.

+
+

Coordination

+

Auto Release

+

'Next' coordination is not required to AD TCU for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; and
+ b) Assigned the standard assignable level; and
+ c) Assigned a Procedural SID

+

All other aircraft require a 'Next' call to AD TCU.

+
+

Example

+

AD ADC -> AD TCU: "Next, RXA4362, Runway 23"
+AD TCU -> AD ADC: "RXA4362, Track Extended Centreline, Unrestricted"
+AD ADC -> AD TCU: "Track Extended Centreline, RXA4362"

+

AD ADC: "RXA4362, Track Extended Centreline 222 degrees, Runway 23, Cleared for Takeoff"
+RXA4362: "Track Extended Centreline 222 degrees, Runway 23, Cleared for Takeoff, RXA4362"

+
+

The AD TCU controller can suspend/resume Auto Release at any time, with the concurrence of AD ADC.

+

The Standard Assignable level from AD ADC to AD TCU is:
+For Jets: A050
+For Non-Jets: The lower of A040 or the RFL

+

Departures Controller

+

When AAE is online, the AD TCU airspace is split down the 05/23 Runway Centreline. As such, departing aircraft shall be instructed to contact the departures controller corresponding to the direction of turn of the aircraft after departure

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tracking viaDeparture RunwayDepartures Controller
VILAD05/23/12AAE
UPROT05/23/12AAE
AVDEN05/23/12AAE
BENDO05/23/12AAE
ALBUT05/23/12AAE
EEMUE05/23/30AAW
GILES05/23/30AAW
YORKE05/23/30AAW
AREPA05/23/30AAW
HOLIT05/23/30AAW
ORBUN05/23/30AAW
All12AAE
All30AAW
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Amberley/index.html b/aerodromes/classc/Amberley/index.html new file mode 100644 index 000000000..9b892338e --- /dev/null +++ b/aerodromes/classc/Amberley/index.html @@ -0,0 +1,5068 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Amberley (YAMB) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Amberley (YAMB)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Amberley ADCAmberley Tower118.300AMB_TWR
Amberley SMCAmberley Ground129.350AMB_GND
Amberley ACDAmberley Delivery134.600AMB_DEL
Amberley ATIS123.300YAMB_ATIS
+

Airspace

+

AMB ADC owns the Class C airspace in the AMB CTR within 10nm of the YAMB ARP from SFC to A015. This airspace is primarily used for military circuits and initial and pitch approaches.

+

YAMB Aerodrome

+

SID Selection

+

Aircraft planned via BN, JEDDA, MESED, BOBOP, TATEN, shall be assigned the Procedural SID that terminates at the appropriate waypoint. +Aircraft who are not planned via those points or who are negative RNAV may be assigned a RADAR SID or a visual departure.

+

Coded Departures (Fast Jets)

+

Visual Departures are commonly requested by high performance military jets and often processed in the form of a coded departure (e.g. BYRON7 departure), which can be found in the AD2 Sups Page for YAMB. These coded departures provide a corridor with altitude constraints to join the Military Training Areas east of Brisbane, avoiding civilian traffic inbound to Brisbane.

+

Aircraft will depart the circuit visually and track overhead YAMB to begin tracking for their initial waypoint.

+
+

Example

+

CRNG21 plans to enter R637 via the gate MOSSI for Military Training. +AMB ADC: "CRNG21, cleared to YAMB via MOSSI, flight planned route. Runway 15, Northern 1 Departure. Climb to F190. Squawk 3601, Departure Frequency 126.20"

+
+
+

Example

+

WOLF03 was assiged the BYRON7 departure with their initial clearance. +AMB ADC: "WOLF03, make left turn, reach F190 by COWIE, cleared for takeoff"
+WOLF03: "Make left turn, reach F190 by COWIE, cleared for takeoff, WOLF03"

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
DepartureInitial ConstraintRoute
Northern 1F190 at BINUPBINUP MURJO BOBED LESKO MOSSI/ADNUK (Transition)
Central 1F190 at BINUPBINUP MURJO BOBED VIRGE
Byron 7F190 at BINUPCOWIE KIWEE ZANET LOTMA SEMAJ
+
+

Note

+

Charts for the Coded Departures may be in YAMB AD2 Supplements 6.2.25.11 available here: RAAF AIP page

+
+
+

Note

+

Since the Coded Departures are not SIDs, AMB ACD needs to write the name of the coded departure in the Global Ops Field of the FDR and amend the flight plan route to include all relevant tracking points.

+
+

Runway Operations

+

Runways 15/33 are the primary runways at YAMB.

+

Charts

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+

Miscellaneous

+

Circuit Operations

+

The Circuit Area Airspace is allocated to be within 5nm of the YAMB ARP from SFC to A015. Aircraft can be instructed to extend outside of this airspace by ATC for traffic management.

+

Circuit Direction

+ + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDirection
15Right
33Left
04Left
22Left
+

Coordination

+

AMB TCU

+

'Next' coordination is required from AMB ADC to AMB TCU for all aircraft.

+
+

Example

+

AMB ADC -> AMB TCU: "Next, ASY01, runway 33"
+AMB TCU -> AMB ADC: "ASY01, Assigned Heading Right 030, unrestricted"
+AMB ADC -> AMB TCU: "Assigned Heading Heading Right 030, ASY01"

+
+

Level Assignment

+

The Standard Assignable Level from AMB ADC to AMB TCU is:
+a) The Lower of F180 or RFL for Aircraft assigned via Procedural or RNAV SID.
+b) F190 for Aircraft assigned a Coded Departure.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Brisbane/index.html b/aerodromes/classc/Brisbane/index.html new file mode 100644 index 000000000..fb02815b2 --- /dev/null +++ b/aerodromes/classc/Brisbane/index.html @@ -0,0 +1,5247 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Brisbane (YBBN) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Brisbane (YBBN)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Brisbane ADCBrisbane Tower120.500BN_TWR
Brisbane ADC West†Brisbane Tower118.000BN-W_TWR
Brisbane SMC DomesticBrisbane Ground121.700BN_GND
Brisbane SMC South†Brisbane Ground122.250BN-S_GND
Brisbane SMC North†Brisbane Ground124.050BN-N_GND
Brisbane ACDBrisbane Delivery118.850BN_DEL
Brisbane ATIS126.250YBBN_ATIS
+

Non-standard positions may only be used in accordance with VATPAC Air Traffic Services Policy

+

Airspace

+

BN ADC is not responsible for any airspace by default.

+

Maneuvering Area Responsibility

+

There are three SMC positions at Brisbane which are responsible for various parts of the maneuvering area, as shown below.

+
+

YBBN Maneuvering Area North +

+
YBBN Maneuvering Area North
+
+
+

YBBN Maneuvering Area South +

+
YBBN Maneuvering Area South
+
+

Standard Taxi Routes

+

Taxiway A is to be used in the same direction as the duty runway. Taxiway B is to be used in the opposite direction to the duty runway.

+

Taxiway Y is to be used in a westerly direction and Taxiway Z in an easterly direction.

+
+

Tip

+

Aircraft vacating runway 19R may conflict with aircraft taxiing outbound via taxiway Yankee as they turn onto taxiway Sierra. Consider instructing departing aircraft to hold short of Sierra until the conflict can be resolved.

+

A similar conflict may exist between aircraft taxiing inbound via taxiway Zulu and aircraft taxiing outbound for runway 19L. Consider instructing inbound aircraft to hold short of taxiway Y1, allowing the use of Y1 and Charlie in case of a queue for holding point A3.

+
+
+

YBBN Taxi Route +

+
Standard Taxi Routes
+
+

SMC Frequency Change Instructions

+

To minimise conflict in the next SMC area of responsibility, aircraft should be instructed to hold short of predetermined taxiways and instructed to contact the next SMC controller (for international aircraft or less-experienced pilots) or allowed to transfer to the next frequency independently (for domestic aircraft).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Originating SMCReceiving SMCTaxi Instruction
SMC DomesticSMC NorthHold short W
SMC NorthSMC DomesticHold short B4
SMC DomesticSMC SouthHold short B7
SMC SouthSMC DomesticHold short B6
+

When aircraft wish to cross runway 01R/19L and taxi to/from eastern General Aviation Maintenance Area via taxiway H3, they should be instructed to hold short of the runway and contact the next SMC.

+

Runway Modes

+

Winds must always be considered for Runway modes (Crosswind <20kts, Tailwind <5kts), however the order of preference is as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Priority - ModeArrivalsDepartures
1 - SODPROPS19R01R
2 - 19 PROPS19L & 19R19L & 19R
3 - 01 PROPS01L & 01R01L & 01R
+
+

Note

+

The SODPROPS mode is most suitable for Noise Abatement. The PROPS modes are most suitable for higher capacity. Since for the most part, neither of these are a factor on VATSIM, it is up to you which runway mode you would like to operate, subject to winds. Consider favouring the higher capacity PROPS modes during busy times, such as events like Panic Stations.

+
+

When using the SODPROPS mode, pass traffic information to aircraft that are departing and landing at the same time

+
+

Example

+

BN ADC: "ABC, Traffic is DEF, a 737, on short final for the opposite direction parallel runway. Runway 01R, Cleared for Takeoff"
+ABC: "Cleared for Takeoff Runway 01R, ABC"
+BN ADC: "DEF, Traffic is ABC, an A320, departing from the opposite direction parallel runway to the South-West. Runway 19R, Cleared to Land"
+DEF: "Cleared to Land Runway 19R, DEF"

+
+

Parallel Runway Operations

+

Refer to Parallel Runway Separation Standards for more information

+

Runway Selection

+

Aircraft shall be assigned the following runways for departure when PROPS are in progress:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Aircraft trackingRunway
via BIXAD01L/19R
via GUMKI01R/19L
via SCOTT01R/19L
via SANEG01R/19L
via WACKO01L/19R
Other aircraft:
To the NORTH and WEST01L/19R
To the SOUTH and EAST01R/19L
+
+

Tip

+

Runway 01L/19R opened in 2020. Some pilots on VATSIM may have old simulators/scenery, in which case they will only have Runway 01R/19L available. Endeavour to be accommodating of pilots' requests in this instance.

+
+

SID Selection

+

Jet Aircraft planned via BIXAD, GUMKI, SCOTT, SANEG, or WACKO, shall be assigned the Procedural SID that terminates at the appropriate waypoint. Jet Aircraft not planned via any of these waypoints shall receive amended routing via the most appropriate SID terminus, unless the pilot indicates they are unable to accept a Procedural SID.

+
+

Example

+

Jet Aircraft planned via SCOTT, assigned runway 19L, shall be assigned the SCOTT SID.

+
+

Non-Jet aircraft, and aircraft that cannot accept a Procedural SID, shall be assigned the Radar SID.

+
+

Example

+

Non-Jet Aircraft planned via WACKO, assigned runway 01L, shall be assigned the BN (RADAR) SID.

+
+

SODPROPS

+

During the SODPROPS runway mode, Jet departures from Runway 01R shall be assigned the ASISO Procedural SID in lieu of other Procedural SIDs available that terminate at the appropriate waypoint.

+
+

Example

+

Jet Aircraft planned via SCOTT, assigned runway 01R, shall be assigned the ASISO SID, SCOTT Transition.

+
+

ATIS

+

Operational Info

+

When parallel runways are used for departures, the ATIS OPR INFO shall include:
+INDEPENDENT PARALLEL DEPARTURES IN PROGRESS
+When SODPROPS are in operation, the ATIS OPR INFO shall include:
+SIMULTANEOUS OPPOSITE DIRECTION PARALLEL RUNWAY OPERATIONS IN PROGRESS

+

Approach Types

+

The ATIS shall always have EXP INST APCH as the approach type. Visual Approaches are permitted on request, as long as a separation standard exists between the aircraft and any aircraft arriving on the parallel runway during PROPS, or departing from the parallel runway during SODPROPS.

+

Coordination

+

Auto Release

+

'Next' coordination is not required to BN TCU for aircraft that are:
+ a) Departing from a runway nominated on the ATIS (except during SODPROPS^); and
+ b) Assigned the standard assignable level; and
+ c) Assigned a Procedural SID

+

^Auto Release is not available during SODPROPS runway mode. All aircraft must be coordinated from BN ADC to BN TCU.

+

All other aircraft require a 'Next' call to BN TCU.

+
+

Example

+

BN ADC -> BN TCU: "Next, QLK404D, Runway 19L"
+BN TCU -> BN ADC: "QLK404D, heading 160, unrestricted"
+BN ADC -> BN TCU: "Heading 160, QLK404D"

+

BN ADC: "QLK404D, Assigned heading Left 160, Runway 19L, Cleared for Takeoff"
+QLK404D: "Left heading 160, Runway 19L, Cleared for Takeoff, QLK404D"

+
+

The BN TCU controller can suspend/resume Auto Release at any time, with the concurrence of BN ADC.

+

The Standard Assignable level from BN ADC to BN TCU is:
+For Jets: A060
+For Non-Jets: The lower of A040 or the RFL

+

Departures Controller

+

Refer to Brisbane TCU Airspace Division for information on airspace divisions when BDN and/or BDS are online.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Cairns/index.html b/aerodromes/classc/Cairns/index.html new file mode 100644 index 000000000..0d979d6e0 --- /dev/null +++ b/aerodromes/classc/Cairns/index.html @@ -0,0 +1,5399 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Cairns (YBCS) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Cairns (YBCS)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Cairns ADCCairns Tower124.900CS_TWR
Cairns SMCCairns Ground121.700CS_GND
Cairns ACDCairns Delivery128.750CS_DEL
Cairns ATIS131.100YBCS_ATIS
+

Airspace

+

CS ADC is responsible for the Class C airspace within the CS CTR SFC to A010.

+
+

Important

+

CS ADC is responsible for issuing visual approach clearances to some aircraft tracking for runway 33 in CTA, as well as initial airways clearances for VFR aircraft entering the CTR from class G. See Runway 33 Arrival Procedures for more information.

+
+
+

CS ADC Airspace +

+
CS ADC Airspace
+
+

Runway Selection

+

The preferred runway direction is Runway 15.

+

Separation

+

ADC Separation Responsibility

+

When weather conditions are suitable, ADC shall visually separate aircraft operating in the circuit from aircraft on the extended runway centreline when within 5nm. ADC shall also separate aircraft operating on (or departing to join) the Western VFR Corridor while within the CTR.

+
+

Note

+

ADC shall advise TCU when this separation cannot be applied.

+
+

Departures in IMC

+

When instrument approaches are in use to runway 15, and visual separation is not possible due to the weather conditions (i.e. VMC does not exist below A030), do not issue a takeoff clearance to an aircraft if another arriving aircraft is established on less than a 7nm final. This prevents a loss of separation between the two aircraft.

+

Arrivals

+

Runway 15

+

When visual approaches are in use, expect light & medium category aircraft (B737/A320 and below) to track via the Creek Corridor, to join an approx 2nm final. These aircraft will be cleared for a visual approach by CS TCU. See the Cairns DAP Noise Abatement Procedures chart for more information.

+

Runway 33

+

When visual approaches are in use, expect light & medium category aircraft (B737/A320 and below) to track either via a straight in visual approach or via a visual right base. Aircraft inside CTA tracking for a right base to runway 33 will pass overhead the CTR, so CS TCU will not clear them for a visual approach. These aircraft will be coordinated by CS TCU.

+

ADC must assess any potential conflicts with aircraft in the CTR and clear the inbound aircraft for a visual approach when able. Given the limited airspace available, it is crucial that ADC maintains separation assurance between inbound aircraft and those operating in the CTR, to avoid a delay in issuing the visual approach clearance.

+
+

Example

+

TCU -> ADC: "Via right base, RXA5418, will be assigned A020 visual"
+ADC -> TCU: "A020 visual, RXA5418"

+

RXA5418: "Cairns Tower, RXA5418, descending to A020 visual"
+CS ADC: "RXA5418, Cairns Tower, cleared visual approach"
+RXA5418: "Cleared visual approach, RXA5418"

+

CS ADC: "RXA5418, runway 33, cleared to land"
+RXA5418: "Runway 33, cleared to land, RXA5418"

+
+

Departures

+

IFR Departures

+

IFR aircraft shall be processed via one of the following SIDs:

+

a) RWY 15, Jets via AKROM: AKROM SID. Non-Jets via NONUM: NONUM SID
+b) RWY 33, All Jets: EAZEE SID, Radar Transition
+c) All others: CS (RADAR) SID

+
+

Note

+

Non-jet aircraft may be issued a Visual Departure if conditions are suitable.

+
+

VFR Operations

+

The Pier Helipad

+

VFR helicopters transit from the Reef to a floating pontoon helipad on the southeastern shore of the CBD, approximately 2nm from the runway 33 threshold. This helipad is referred to as 'The Pier'.

+
+

The Pier +

+
The Pier (red dot)
+
+

Prior to issuing clearance to these helicopters, ensure that no conflict exists with other arriving/departing traffic, particularly aircraft departing from runway 15 or arriving on runway 33. Visual separation may be applied between these aircraft if appropriate.

+

Arriving helicopters should be cleared direct to The Pier, not above A005 and instructed to report on the ground.

+
+

Example

+

YZM is a VFR R44 tracking from Upolo Cay to False Cape, inbound to The Pier.
+VH-YZM: "Cairns Tower, helicopter YZM, 5nm northeast of False Cape, A005, for The Pier, received Hotel"
+CS ADC: "YZM, Cairns Tower, cleared direct to The Pier, not above A005, report on the ground"
+VH-YZM: "Cleared direct The Pier, not above A005, YZM"

+

VH-YZM: "YZM on the pier"
+CS ADC: "YZM"

+
+

Departing helicopters should be cleared direct to their nominated tracking point not above A005, and instructed to report airborne.

+
+

Example

+

VTB is a VFR Bell 505 on The Pier, intending to track to Cairns Airport for a landing on the southern pads. A 737 is about to depart from runway 15.
+VH-VTB: "Cairns Tower, helicopter VTB, at The Pier, for the southern pads, received India"
+CS ADC: "VTB, Cairns Tower, short delay for clearance"
+VH-VTB: "VTB"

+

CS ADC: "VTB, cleared direct to the control tower, not above A005, report airborne"
+VH-VTB: "Cleared direct to the control tower, not above A005, VTB"

+

VH-VTB: "VTB, airborne"
+CS ADC: "VTB, track southern pads, report on the ground"
+VH-VTB: "Track southern pads, VTB"

+

VH-VTB: "VTB, on the pad"
+CS ADC: "VTB"

+
+

Western VFR Corridor

+

The Western VFR Corridor conflicts with the extended centreline to the north of the aerodrome. Clearances for aircraft entering the CTR must use clear and unambiguous phraseology to eliminate any potential for confusion by the pilot.

+
+

Example

+

NDR: "Cairns Tower, NDR, EDT, A015, for the Western VFR Corridor, Request Clearance"
+CS ADC: "NDR, enter the CTR tracking via the Western VFR corridor at A015. Remain on the corridor until advised."

+
+

If a clearance limit is associated with the clearance, then it must be reiterated to the pilot to remain “on or west of the VFR Corridor”.

+
+

Example

+

NDR: "Cairns Tower, NDR, EDT, A015, for the Western VFR Corridor, Request Clearance"
+CS ADC: "NDR, enter the CTR tracking via the Western VFR Corridor at A015. Clearance limit is ADI, Remain on or west of the Western VFR Corridor at all times."

+
+

Inbound

+

Aircraft planning to enter the CS CTR between Mt Gorton, CGF and Upolo Cay at A005, must contact CS ADC for airways clearance.

+
+

Example

+

NDR: "Cairns Tower, NDR, Cape Grafton, A005, Inbound, Information Alpha, Request Clearance"
+CS ADC: "NDR, enter the CTR tracking for a Right Base runway 33, maintain A005."

+
+

Circuit Direction

+

The circuit height is A010. If an aircraft requires a higher circuit altitude, an airspace release must be requested from CS TCU.

+ + + + + + + + + + + + + + + + + +
RunwayDirection
15Left
33Right
+

ATIS

+

Approach Expectation

+

The ATIS approach expectation shall be EXPECT INSTRUMENT APPROACH when:

+ + + + + + + + + + + + + + + + + +
TimeCondition
DayVMC conditions do not exist below A030
NightAll conditions
+
+

Note

+

This procedure allows aircraft to track via the Creek Corridor (see YBCS DAP Noise Abatement Procedures) for runway 15, or via a visual right base (commenced from vectors or the KEEWI Victor STAR), when VMC exists below A030.

+
+

Taxiway Restrictions

+

Taxiways A2 and A between A2 and A3 are not available to aircraft above 7,000 kilograms. Taxiway A4 is not available to aircraft above 90,000 kilograms. Taxiway Y is not available to aircraft above 10,000 kilograms.

+

Coordination

+

CS TCU

+

Auto Release

+

'Next' coordination is not required for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; and
+ b) Assigned the standard assignable level; and
+ c) Assigned a Procedural SID

+

All other aircraft require a 'Next' call to CS TCU.

+
+

Example

+

CS ADC -> CS TCU: "Next, HND151"
+CS TCU -> CS ADC: "HND151, Heading 030, unrestricted"
+CS ADC -> CS TCU: "Heading 030, HND151"

+

CS ADC: "HND151, Assigned heading Left 030, Runway 15, Cleared for Takeoff"
+HND151: "Left heading 030, Runway 15, Cleared for Takeoff, HNT151"

+
+

The Standard Assignable level from CS ADC to CS TCU is the lower of A060 or the RFL.

+

Arrivals

+

Aircraft tracking via a visual right base to runway 33 will be coordinated by CS TCU (see Runway 33). All other arriving aircraft do not require coordination.

+

ACD to CS TCU

+

The controller assuming responsibility of CS ACD shall give heads-up coordination to the relevant CS TCU controller prior to the issue of the following clearances:
+a) VFR Departures
+b) Aircraft using a runway not on the ATIS

+
+

Example

+

CS ACD -> CS TCU: "ABC, Requesting clearance for a Northbound VFR Coastal departure at A035"
+CS TCU -> CS ACD: "ABC, Cleared for a Northbound VFR Coastal departure, A035"
+CS ACD -> CS TCU: "Cleared for a Northbound VFR Coastal departure, A035, ABC"

+

CS ACD: "ABC, Cleared for a Northbound VFR Coastal departure, A035, Squawk 3601"
+ABC: "Cleared for a Northbound VFR Coastal departure, A035, 3601, ABC"

+
+

CS FLW

+

FLW must advise ADC of any sequence changes within 36 Miles CS.
+All requests for non-duty runway arrivals must be approved by ADC.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Canberra/index.html b/aerodromes/classc/Canberra/index.html new file mode 100644 index 000000000..be22ea37f --- /dev/null +++ b/aerodromes/classc/Canberra/index.html @@ -0,0 +1,5029 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Canberra (YSCB) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Canberra (YSCB)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Canberra ADCCanberra Tower118.700CB_TWR
Canberra SMCCanberra Ground121.700CB_GND
Canberra ATIS127.450YSCB_ATIS
+

Airspace

+

CB ADC is responsible for the Class C Airspace within the CB CTR SFC to A035.

+
+

CB ADC Airspace +

+
CB ADC Airspace
+
+

SID Selection

+

Jet Aircraft planned via CULIN, TANTA, WG, HOWLY, NONUP or AVBEG shall be assigned the Procedural SID that terminates at the appropriate waypoint. Jet Aircraft not planned via any of these waypoints shall receive amended routing via the most appropriate SID terminus, unless the pilot indicates they are unable to accept a Procedural SID.

+

Non-Jet Aircraft planned via AKMIR or DUBUS shall be assigned the Procedural SID that terminates at the appropriate waypoint.

+
+

Example

+

Jet Aircraft planned via TANTA, assigned runway 35, shall be given the TANTA SID.

+
+

a) Jet or Non-Jet aircraft departing Off Mode that don't meet the above critera; or
+b) Aircraft that cannot accept a Procedural SID
+Shall be assigned the Radar SID.

+
+

Example

+

Non-Jet Aircraft planned via TANTA, assigned runway 35, shall be given the CB (RADAR) SID.

+
+

VFR Operations

+

VFR aircraft that will operate only in ADCs airspace shall be assigned SSR code 0040.

+

Aircraft operating in the circuit area are to remain on the ADC frequency. The phrasing of the airways clearance is:

+
+

Example

+

“ABC, cleared to operate in the circuit area, not above A030, squawk 0040”.

+
+

The circuit direction is not specified in the airways clearance, but with a take-off or touch-and-go clearance.

+

Military jet training circuits are conducted at A035, unless otherwise requested by the pilot. ADC shall notify the TCU of the beginning and end of the sortie.

+

City Scenic Flights

+

City Scenic Flights are available by day and to the west of the aerodrome. Aircraft on these routes shall be cleared at A045.

+ + + + + + + + + + + + + + + + + + + + +
RunwayCity Flight OneCity Flight Two
North (anti-clockwise)ALPHA ONEALPHA TWO
South (clockwise)CHARLIE ONECHARLIE TWO
+
+

City Flight One +

+
City Flight One
+
+
+

City Flight Two +

+
City Flight Two
+
+

Helicopter Operations

+

The Canberra CTR contains the Southcare Helicopter Base (YXSB) as well as two hospitals (Calvary Hospital and Canberra Hospital). Helicopters operating to and from these pads require a clearance from CB ADC.

+

Departing Aircraft

+

Helicopters departing the pads require an airways clearance to do so, either taking the form of a clearance to transit the zone to the Class G airspace adjacent to the CTR (if the pilot has no intention to enter CTA) or as a normal airways clearance for a departure into the surrounding CTA. Ensure that no conflict exists with arriving or departing traffic and consider delegating separation responsibility to the VFR aircraft if required. It may also be required to coordination with the TMA controller to ensure no additional conflict exists in their sector.

+

Departing aircraft should not be issued a takeoff clearance (as the helipads are outside the manoeuvring area). Instead, instruct aircraft to 'report airborne'.

+
+

Example

+

RSCU201 is a VFR AW139 helicopter intending to depart Southcare Base (YXSB) to the northwest at A035 (below the base of the Class C steps).
+RSCU201: "Canberra Tower, helicopter RSCU201, Southcase Base, for departure to the northwest, A035, received Juliet, ready"
+CB ADC: "RSCU201, Canberra Tower, transit approved not above A035, report OCTA"
+RSCU201: "Transit approved, not above A035, RSCU201"

+
+
+

Example

+

RSCU209 is an IFR AW139 helicopter intending to depart Canberra Hospital (YXCB) for Bankstown (YSBK) at A090 (inside Class C CTA).
+RSCU209: "Canberra Tower, helicopter RSCU209, on the pad at Canberra Hospital, for Bankstown, received Juliet, ready"
+CB ADC: "RSCU209, Canberra Tower, report sighting a Jetstar A320 on a 3nm final runway 35 and advise able to maintain own separation with that aircraft"
+RSCU209: "Traffic sighted and affirm, RSCU209"
+CB ADC: "RSCU209, pass behind the A320, maintain own separation, caution wake turbulence, cleared to Bankstown via AKMIR, flight planned route, climb A090, squawk 3762"
+RSCU209: "Cleared to Bankstown via AKMIR flight planned route, climb A090, squawk 3762, pass behind the A320 and maintain own separation, RSCU209"

+

Remember to pass traffic information to both aircraft.
+CB ADC: "JST619, traffic is a helicopter becoming airborne from Canberra Hospital, approximately 5nm southwest of the field, maintaining own separation with you, runway 35, cleared to land"

+
+

Arriving Aircraft

+

Helicopters arriving to the pads will generally be coordinated by the TMA controller and should be cleared via a visual approach (when available) and instructed to report on the ground. Do not issue a landing clearance to these aircraft (as the helipads are outside the manoeuvring area). It may be necessary to instruct these helicopters to track via amended visual points or sight and pass other aircraft.

+
+

Example

+

RSCU203: "Canberra Tower, gday, RSCU203"
+CB ADC: "RSCU203, Canberra Tower, report sighting a Qantas 737 lining up on runway 17 and advise able to maintain own separation with that aircraft"
+RSCU203: "Traffic sighted and affirm, RSCU203"
+CB ADC: "RSCU203, that aircraft will be departing upwind, maintain own separation, cleared visual approach, report on the ground"
+RSCU203: "Maintain own separation, cleared visual approach, RSCU203"

+

Remember to pass traffic information to both aircraft.
+CB ADC: "QFA714, traffic is a helicopter 1nm south of the field tracking for Calvary Hospital, opposite direction to you and maintaining own separation, runway 17, cleared for takeoff"

+
+

Coordination

+

Auto Release

+

'Next' coordination is not required to CB TCU for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; and
+ b) Assigned the standard assignable level; and
+ c) Assigned a Procedural SID

+

All other aircraft require a 'Next' call to CB TCU.

+
+

Example

+

CB ADC -> CB TCU: "Next, XEB, runway 35"
+CB TCU -> CB ADC: "XEB, heading 010, Unrestricted"
+CB ADC -> CB TCU: "Heading 010, XEB"

+

CB ADC: "XEB, Assigned heading Right 010, Runway 35, Cleared for Takeoff"
+XEB: "Right heading 010, Runway 35, Cleared for Takeoff, XEB"

+
+

The CB TCU controller can suspend/resume Auto Release at any time, with the concurrence of CB ADC.

+

The Standard Assignable level from CB ADC to CB TCU is:
+For IFR aircraft: A100
+For VFR aircraft: The lower of A040 or the RFL

+

Runway Change

+

Any Runway change must be prior coordinated to CB TCU.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Curtin/index.html b/aerodromes/classc/Curtin/index.html new file mode 100644 index 000000000..630f4db9b --- /dev/null +++ b/aerodromes/classc/Curtin/index.html @@ -0,0 +1,4858 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Curtin (YCIN) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Curtin (YCIN)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Curtin ADCCurtin Tower118.300CIN_TWR
Curtin SMCCurtin Ground126.200CIN_GND
Curtin ACDCurtin Delivery136.800CIN_DEL
Curtin ATIS134.800YCIN_ATIS
+

Airspace

+

CIN ADC owns the Class C airspace within the CIN MIL CTR from SFC to A015.

+

Circuit Direction

+ + + + + + + + + + + + + + + + + +
RunwayDirection
29Left
11Right
+

Coordination

+

CIN TCU

+

'Next' coordination is required from CIN ADC to CIN TCU for all aircraft.

+
+

Example

+

CIN ADC -> CIN TCU: "Next, ASY404, runway 29"
+CIN TCU -> CIN ADC: "ASY404, unrestricted"
+CIN ADC -> CIN TCU: "ASY404"

+
+

The Standard Assignable Level from CIN ADC to CIN TCU is the Lower of F190 or the RFL.

+

TRT(KIY)

+

When CIN TCU is offline, coordination is not required between CIN ADC and TRT(KIY). Aircraft entering TRT(KIY) airspace shall be handed off, and instructed to contact TRT(KIY) for onwards clearance.

+

Charts

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Darwin/index.html b/aerodromes/classc/Darwin/index.html new file mode 100644 index 000000000..339f9aa95 --- /dev/null +++ b/aerodromes/classc/Darwin/index.html @@ -0,0 +1,5087 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Darwin (YPDN) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Darwin (YPDN)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameIDCallsignFrequencyLogin Identifier
Darwin ADCDarwin Tower133.100DN_TWR
Darwin SMCDarwin Ground121.800DN_GND
Darwin ACDDarwin Delivery126.800DN_DEL
Darwin ATIS128.250YPDN_ATIS
+

Airspace

+

ADC owns the airspace within the DN CTR (SFCA010). This airspace is designed to facilitate the processing of helicopter scenic flights and low-level helicopter circuits.
+The CTR extends 7NM from the thresholds of runways 11 and 29 but does not including the Robertson Barracks transit zone.

+

ADC may request DN TCU (SFCA020) from DN TCU to facilitate fixed-wing circuit operations:
+a) Fixed-wing circuit operations are typically conducted at Delissaville (YDLV) due to high traffic density at Darwin
+b) ADC may deny requests for circuits if IFR traffic may be unduly delayed

+
+

DN ADC Airspace +

+
DN ADC Airspace
+
+

Aerodrome

+

Standard Taxi Routes

+

Aircraft transiting to or from the Southern and Northern GA should follow the following standardised taxi routes:
+a) Outbound via V1
+b) Inbound via Y1

+

Traffic permitting, aircraft above 136,000kg MTOW shall be entered/exited for RWY 11/29 from taxiways B2, C3, D or E2 and backtracked as required.

+

Taxiway V has a passing bay, located adjacent to the ARFF section. The passing bay is the preferred location for engine run-ups, no longer than 3 minutes

+

Runway Modes

+

Runway selection shall be coordinated by DN ADC. In any case, a change of runway mode shall not be broadcast on the ATIS until DAW accepts the change.

+

The Runway Mode options available are:

+

a) Runway 29 and Runway 36;
+b) Runway 29 and Runway 18;
+c) Runway 29 only;
+d) Runway 11 and Runway 36;
+e) Runway 11 and Runway 18;
+f) Runway 11 only.

+

Charts

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+

Miscellaneous

+

Circuit Operations

+

VFR aircraft that will operate only in ADCs airspace shall be assigned SSR code 0100

+

Circuit altitude will depend on the type of aircraft. Assign circuit altitudes for the following aircraft types:
+a) MIL Jet: A020
+b) Jet: A015
+c) Non-jet: A010
+d) Helo: A010

+

Coordination

+

Auto Release

+

"Next" Coordination is a procedure where the DN ADC controller gives a heads-up to the DN TCU controller about an impending departure. The DN TCU controller will respond by assigning a heading to the aircraft, for the DN ADC controller to pass on with their takeoff clearance.

+
+

Example

+

DN ADC -> DN TCU: "Next, ABC, runway 18"
+DN TCU -> DN ADC: "ABC, Track Extended Centreline, unrestricted"
+DN ADC -> DN TCU: "Track Extended Centreline, unrestricted, ABC"

+
+

All departures from 18/36 require departure coordination with DN TCU

+

IFR Level Assignment

+

The Standard Assignable level from DN ADC to DN TCU is the lower of F180 or the RFL.
+If the aircraft is not planned via an RNAV SID and has a light wake turbulance cateogry, they are to be assigned the lower of A030 or the RFL.

+

VFR Departures

+

A020 or the planned level; whichever is lower, to all VFR aircraft.

+

VFR aircraft are required to track via one of the published VFR Routes.

+

VFR routes shall be assigned based on the destination radial from Darwin.

+

Assign VFR routes in accordance with the following radial chart:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Outbound RadialAssigned VFR Route
360 – 040VFR Route 1
041 – 084VFR Route 2
085 – 124VFR Route 3
125 – 180VFR Route 4
181 – 224VFR Route 5
225 – 359Direct
+
+

Tip

+

If a VFR aircraft has not planned via a VFR route as above, use the phraseology: “ABC, cleared amended route VFR route 1, maintain A020, squawk 4512”

+
+

Auto-Release Wedge

+

The Darwin auto-release wedges extend from the departure end runway threshold, 30 degrees splayed from the centreline, to 7nm

+

Auto-release at Darwin is only available for VFR aircraft and low-level IFR aircraft.

+

Tower may depart aircraft that conform with the above conditions within the auto-release wedge using the following headings:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Departure TypeRunway 11Runway 29
VFRH070V, H106V or H140VH260V, H286V or H320V
IFR (Visual Dep)H070V, H106V, or H140VH260V, H286V or H320V
IFR (Radar)H070, H106 or H140H260, H286 or H320
+
+

Tip

+

Tower shall provide visual separation between aircraft in the auto-release wedge and subsequent departures until the preceding departure has been maneuvered by TCU

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/EastSale/index.html b/aerodromes/classc/EastSale/index.html new file mode 100644 index 000000000..6b4665593 --- /dev/null +++ b/aerodromes/classc/EastSale/index.html @@ -0,0 +1,5247 @@ + + + + + + + + + + + + + + + + + + + + + + + + + East Sale (YMES) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

East Sale (YMES)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
East Sale ADCEast Sale Tower118.300ES_TWR
East Sale SMCEast Sale Ground127.250ES_GND
East Sale ACDEast Sale Delivery134.100ES_DEL
East Sale ATIS125.40YMES_ATIS
+

Airspace

+

ES ADC owns no airspace. Release may be available from ES APP for circuits.

+

Flight Category

+
    +
  • Resuming VFR:
  • +
  • Recovering military aircraft must automatically revert to VFR at the following points:
      +
    • At the initial point when recovering via military stream landing pattern (initial and pitch).
    • +
    • At Hi-Key.
    • +
    • Following a touch and go, go-around, or visual overshoot when a local IFR aircraft has indicated an intention to join the circuit.
    • +
    +
  • +
+

Runway Modes

+

Single runway operations only.

+

Circuit Procedures

+

The East Sale Circuit Area (ESL CIRA) is active at all times when R360A is active.

+

Circuit operations occur within a 5NM radius of ESL ARP, at the following altitudes:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNormal AltitudeLow Level Altitude
DayNight
Non JetA010A004Circling Minima
JetA015A006Circling Minima
+ +

Circuit Direction

+ + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDirection
09Left
22Left
04Right
27Right
+

Circuit Saturation

+

ATC should declare the circuit saturated when aircraft exceeds the below table. +When the circuit is saturated further circuits will be unavailable until numbers are within tolerance of the table. +This number may be reduced by ATC due to complexity of operations and prevailing weather in order to ensure safety.

+ + + + + + + + + + + + + + + + + + + +
TimeESL DayESL NightWSL DayWSL Night
Day6555
+

Low Approach

+
    +
  • By day, pilots of local aircraft may request a low approach.
  • +
  • Pilots are responsible for ensuring that no collision risk exists and that there is suitable spacing to continue the approach and for the potential/subsequent go-around.
  • +
+

Standard Taxi Routes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayOutbound RouteInbound Route
Runway 27E2 or Eastern Check BaysD2
Runway 09D2 or Western Check BaysE2
Runway 22E2 or Eastern Check BaysJ
Runway 04JD2
+
+

ESL TAXI INBOUND

+
ESL TAXI INBOUND
+
+
+

ESL TAXI OUTBOUND

+
ESL TAXI OUTBOUND
+
+

Helicopter Operations

+
    +
  • Helicopter Circuits:
  • +
  • When RWY09/27 is being used for fixed-wing circuit training, it is preferred that helicopters utilise threshold runway 04 (runway 09/27 direction) for landing and take-off to increase segregation between final approach and upwind segments.
  • +
  • When helicopters require use of TWY A (Pad Alpha) for circuit training, base turns should be sequenced to avoid conflict during the final approach segment.
  • +
+

Lanes

+

The 16 individual training areas within the ESL military airspace are separated by 4 outbound lanes. +These lanes are used by aircraft transiting to/from exterior training areas or for entry and exit of ESL military airspace. +Lanes are defined by GNSS waypoints situated at 12, 35, and 50 NM from YMES AD.

+

Outbound Lanes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Lane Direction12NM GNSS Waypoint35NM GNSS Waypoint50NM GNSS WaypointBearing
NorthernLEKEMGONEBLANOS359
EasternVEMDAKADRUTAVET090
SouthernSABAXLUTUKNOLOX180
WesternDUGADLERKODUNNE270
+
    +
  • Vertical Dimensions:
    + Lanes extend from SFC or the base of restricted airspace to F160.
  • +
+

Example Departure Clearance via Lane

+

Aircraft departing ESL military airspace may be instructed to track via a lane at or below F160.

+
+

Example

+

BRCT21 is departing East Sale via the Eastern Lane at FL110 to Orbost (YORB). The departure clearance would be issued as follows: +ES SMC -> BRCT21: "BRCT21 CLEARED TO YORB, VIA EASTERN LANE, FPR, FL110, SQUAWK 1234, DEPARTURES 123.3"

+
+

If BRCT21 was departing at or above FL160, then departure clearance is as normal.

+

Level Assignment

+
    +
  • F160 or RFL whichever is lower for fixed-wing aircraft.
  • +
  • A040 or RFL whichever is lower for rotary-wing aircraft.
  • +
+

Coordination

+

Auto Release

+

Auto release is not utilised at East Sale. 'Next' coordination is required from ES ADC to ES TCU for all aircraft.

+
+

Example

+

ES ADC -> ES TCU: "Next, ASY01, runway 09"
+ES TCU -> ES ADC: "ASY01, Assigned Heading Left 030, unrestricted"
+ES ADC -> ES TCU: "Left Heading 030, ASY01"

+
+

Helicopters departing from helicopter spots will be treated as if departing from the duty runway.

+
+

Example

+

PSDN14 is a VFR helicopter departing from the threshold of RWY04 (in the direction of runway 27)
+ES ADC -> ES TCU: "Next, PSDN14, runway 27"
+ES TCU -> ES ADC: "PSDN14, right turn, unrestricted"
+ES ADC -> ES TCU: "Right turn, PSDN14"

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Edinburgh/index.html b/aerodromes/classc/Edinburgh/index.html new file mode 100644 index 000000000..c8dcdb784 --- /dev/null +++ b/aerodromes/classc/Edinburgh/index.html @@ -0,0 +1,4609 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Edinburgh (YPED) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Edinburgh (YPED)

+ +

Reserved.

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Essendon/index.html b/aerodromes/classc/Essendon/index.html new file mode 100644 index 000000000..f737ca80a --- /dev/null +++ b/aerodromes/classc/Essendon/index.html @@ -0,0 +1,5306 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Essendon (YMEN) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Essendon (YMEN)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Essendon ADCEssendon Tower125.100EN_TWR
Essendon SMCEssendon Ground121.900EN_GND
Essendon ATIS119.800YMEN_ATIS
+

Airspace

+

EN ADC is responsible for the Class C airspace shown below, SFC to A020.

+
+

EN ADC Airspace

+
+

Runway Selection

+

Consideration of the Melbourne duty runway(s) should be made when nominating runways. The effect of Melbourne traffic on a runway selection takes priority over compliance with DAP Noise Abatement Procedures.

+

The 26A17D runway mode is most optimal for facilitating separation with YMML traffic.

+

Departures

+

IFR flights shall be cleared via:
+ a) When cloud base and visibility exceeds A020 and 5 KM, visual departure;
+ b) otherwise; EN (RADAR) SID.

+

Start clearance is required for:
+ a) Flights to ML;
+ b) Flights to MB and AV planned above A020 (i.e. via ML TCU Class C).

+

Arrivals

+

IFR

+

ML TCU shall clear aircraft for approach via the appropriate arrival gate:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayArrival Gate
26MONTY
35MONTY
175NM FINAL
085NM FINAL
+
+

Note

+

EN ADC must not permit aircraft to depart from the RWY 26 extended centreline until passed LUY and within the vertical limits of EN airspace.

+
+

VFR

+

VFR arrivals from Class G shall be cleared (at not above A015) via:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DirectionVFR Approach PointRWY 17, 26RWY 35
NorthKAODCTDCT
North EastYYNDCTDCT
EastDSNDCTDCT
South EastAPLMCGMCG
SouthSNPMVCFGN
South WestWESMVCDCT
+

VFR Operations

+

Circuit Direction

+ + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDirection
35Right
26Left
17Left
08Right
+

Circuit Altitude

+

Circuits are to be flown at A015

+

Separation

+

EN ADC is responsible for all separation with YMML Traffic, including arrivals to RWY34 via the MONTY-SHEED track, and all potential arrivals, departures, and missed approach paths.
+Some important points to note are that:
+- Aircraft operating on or south of the 08/26 Centreline are separated with YMML 09/27 Traffic at all times
+- Aircraft operating on or east of the 17/35 Centreline are only visually separated with YMML 16/34 Traffic in Day VMC
+- Aircraft conducting the ILS 26 Published Missed Approach are only visually separated with YMML 16/34 Traffic in Day VMC

+

EN ADC must assume that any runway at YMML may be used for arrival, departure, or a missed approach, at any time.
+When the cloud base is below A020, or the Visibility is below 5000m, all aircraft operating within 3nm of the 09/27 or 16/34 extended centreline must be boundary coordinated to ML ADC, as prescribed in Coordination

+

If ML ADC nominates a restriction, and EN ADC determines they cannot maintain visual or lateral separation with the YMML traffic, EN ADC must delay the aircraft in their airspace until the separation can be assured.

+

Miscellaneous

+

Traffic in EN ADC airspace shall squawk 0100 unless a discrete code is required.

+

Melbourne City Orbits

+

EN ADC is responsible for facilitating aircraft requesting city orbits. They shall be conducted at an altitude of:
+A015 by day
+A022 by night

+
+

Example

+

EOG: "Essendon Tower, EOG, approaching WMS, A015, Requesting 1 left-hand city orbit, in receipt of L"
+EN ADC: "EOG, Essendon Tower, cleared 1 left-hand city orbit A015"
+EOG: "Cleared 1 left-hand city orbit A015, EOG"
+When orbit is complete and aircraft is leaving CTA laterally:
+EN ADC: "EOG, control services terminated, frequency change approved"
+EOG: "EOG"

+
+

ATIS

+

YMEN ATIS identifiers only uses letters A through to M, due to nearby YMML using letters N through Y

+

Coordination

+

ML TCU

+

SMC to ML TCU

+

When an aircraft requests start clearance, the EN SMC controller shall coordinate with ML TCU to obtain the start clearance.

+

Departures

+

Essendon departures that will not enter ML TCU Class C airspace are not required to be coordinated.

+

All aircraft departing into Class C must be coordinated to ML TCU with a "Next" Call

+
+

Example

+

EN ADC -> ML TCU: "Next, FD318"
+ML TCU -> EN ADC: "FD318, heading 330, unrestricted"
+EN ADC -> ML TCU: "Heading 330, FD318"

+
+

The Standard Assignable level from EN ADC to ML TCU is the lower of A030 or the RFL, any other level must be prior coordinated.

+

Arrivals/Overfliers

+

ML TCU will heads-up coordinate arrivals/overfliers from Class C to EN ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to EN ADC, unless EN ADC nominates a restriction.
+VFR aircraft require a level readback.

+
+

Example

+

ML TCU -> EN ADC: "via KAO, KHU"
+EN ADC -> ML TCU: "KHU, A015"

+
+
+

Note

+

For aircraft not tracking via an Arrival Gate (ML TCU shall clear aircraft for approach via the appropriate arrival gate:), ML TCU is required to coordinate descent of aircraft into EN ADC airspace.

+
+

When “The Coffin” is released, ML TCU is required to coordinate any use of Runway 27 prior to use.

+

Runway Change

+

Any Runway change must be prior coordinated to ML TCU

+

ML ADC

+

EN ADC is responsible for separation with all YMML traffic, and must coordinate any aircraft operating in EN ADC airspace that cannot be visually or laterally separated with the 09/27 or 16/34 Extended Centrelines at YMML.

+
+

Example

+

EN ADC -> ML ADC: "Boundary Ident, OXG, Published Missed Approach from the ILS 26"
+ML ADC -> EN ADC: "OXG, My restriction is QFA451 on a 10nm final RWY 34. Your separation"
+EN ADC -> ML ADC: "My separation with QFA451, OXG"

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Gingin/index.html b/aerodromes/classc/Gingin/index.html new file mode 100644 index 000000000..8d38559f9 --- /dev/null +++ b/aerodromes/classc/Gingin/index.html @@ -0,0 +1,4609 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Gingin (YGIG) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Gingin (YGIG)

+ +

Reserved.

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Goldy/index.html b/aerodromes/classc/Goldy/index.html new file mode 100644 index 000000000..8b8a6e5e8 --- /dev/null +++ b/aerodromes/classc/Goldy/index.html @@ -0,0 +1,5077 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Gold Coast (YBCG) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Gold Coast (YBCG)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Gold Coast ADCGold Coast Tower118.700CG_TWR
Gold Coast SMCGold Coast Ground121.800CG_GND
Gold Coast ACDGold Coast Delivery128.750CG_DEL
Gold Coast ATIS134.500YBCG_ATIS
+

Airspace

+

CG ADC is responsible for the Class C Airspace within the CG CTR SFC to A015.

+
+

CG ADC Airspace +

+
CG ADC Airspace
+
+

Departures

+

RNAV jet-aircraft planned via APAGI shall be issued the APAGI SID.

+
+

Note

+

For RNP (0.3) approved operators, the RWY14 CUDGN SID and RWY32 BURLI SID are available for departures via APAGI.

+
+

The GOLD COAST (RADAR) SID shall be assigned to all other IFR aircraft, except those assigned Runway 35.
+IFR departures from Runway 35 shall be assigned a visual departure.

+

Radar SID aircraft shall be cleared subject to the following conditions for noise abatement purposes:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Via1432
NorthLeft (14)/Right (32) turn and then over water until A030Left (14)/Right (32) turn and then over water until A030
EastLeft (14)/Right (32) turn and then over water until A030Left (14)/Right (32) turn and then over water until A030
South JetsMinor right turn then over water until 5 DMEOver water until south of KCFF (CG130/7 NM) and A050
South Non-Jetsleft(14)/right(32) turn and then over water until A030Left (14)/Right (32) turn and then over water until A030
+

Arrivals

+

Arriving aircraft that are operating at or below A015 may contact ADC for inbound clearance. These aircraft shall be assigned a discrete SSR code but shall not be radar identified.
+Aircraft shall be cleared subject to the following conditions:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Via1432
North JetsNot below A050 until vectored over water to join finalVia right circuit for 10 NM final or right base south of DNGR
North Non-JetsNot below A030 until vectored over water to join finalVia right circuit for 10 NM final or right base south of DNGR
EastVia LAMSI STAR or over water until finalJoin 10 NM final
South JetsVia STAR or not below A050 until over water to join finalVia STAR to join final
South Non-JetsVia STAR or not below A030 until over water to join finalIMC: via STAR or VMC: Join left base for 2 NM final
+

Runway Selection

+

Preferred runway is Runway 14 - all hours +The crosswind Runways 17/35 may be used at the same time as the main runways.

+

Preferred RWY 14 Approach (All Hours) - Noise Abatement

+

The preferred approach for Jet aircraft above 5,700KG MTOW (unless due weather or critical operations requirements) is as follows:

+
  1. RNAV-W (RNP) RWY 14
  2. RNAV-Y (RNP) RWY 14
  3. RNAV-Z (GNSS) RWY 14
  4. VISUAL APCH RWY 14
  5. ILS RWY 14
+ +

Circuit Direction

+

Circuits are to be conducted at A010.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDirection
14Left
32Right
17Left
35Right
+

VFR Procedures

+

Aircraft transiting the Gold Coast CTR shall be cleared via the inland VFR route.
+Aircraft tracking southbound should contact ADC at Robina Town Centre (ROT) for clearance.
+Aircraft tracking northbound should contact ADC approaching Cudgen Lake for clearance.
+Aircraft requiring to transit the CTR coastal will be subject to delays depending on traffic in the Gold Coast CTR.

+

Helicopter Operations

+

Local helicopter operations are conducted on the Western Grass which is the area contained by blue gable markers north of the VOR and west of the runway intersection. This is marked on the aerodrome chart as “HELO OPS”.

+
+

Note

+

Western Grass is outside of the maneuvering area and is not controlled by ATC – no take-off or landing clearances shall be provided for this area.

+
+

The HLS (Helipad) is located between the GA Apron and Taxiway Golf. +Circuits from the Western Grass are to be made in the same direction as the duty runway.

+

Coordination

+

Auto Release

+

'Next' coordination is not required to BN TCU for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; and
+ b) Assigned the standard assignable level; and
+ c) Assigned a Procedural SID

+

All other aircraft require a 'Next' call to CG TCU.

+
+

Example

+

CG ADC -> BAC: "Next, CBN, runway 14"
+BAC -> CG ADC: "CBN, heading 030, unrestricted"
+CG ADC -> BAC: "Heading 030, CBN"

+

CG ADC: "CBN, Assigned heading left 030, Runway 14, Cleared for Takeoff"
+CBN: "Left heading 030, Runway 14, Cleared for Takeoff, CBN"

+
+

The BN TCU controller can suspend/resume Auto Release at any time, with the concurrence of CG ADC.

+

The Standard Assignable level from CG ADC to BN TCU is:
+For Jets: A060
+For Non-Jets: The lower of A060 or the RFL

+

Start Clearance

+

A start clearance is required for aircraft planned to YBBN. Start clearance must be coordinated with BN TCU.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Learmonth/index.html b/aerodromes/classc/Learmonth/index.html new file mode 100644 index 000000000..cfbab9235 --- /dev/null +++ b/aerodromes/classc/Learmonth/index.html @@ -0,0 +1,4852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Learmonth (YPLM) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Learmonth (YPLM)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Learmonth ADCLearmonth Tower118.300LM_TWR
Learmonth SMCLearmonth Ground126.200LM_GND
Learmonth ATIS123.300YPLM_ATIS
+

Airspace

+

LM ADC owns the Class C airspace within the LM CTR from SFC to A015.

+

Circuit Direction

+ + + + + + + + + + + + + + + + + +
RunwayDirection
36Right
18Left
+

Coordination

+

LM TCU

+

'Next' coordination is required from LM ADC to LM TCU for all aircraft.

+
+

Example

+

LM ADC -> LM TCU: "Next, QFA1601, runway 36"
+LM TCU -> LM ADC: "QFA1601, Right heading 060 Visual, unrestricted"
+LM ADC -> LM TCU: "Right heading 060 Visual, QFA1601"

+
+

The Standard Assignable Level from LM ADC to LM TCU is the Lower of F270 or the RFL.

+

OLW

+

When LM TCU is offline, coordination is not required between LM ADC and OLW. Aircraft entering OLW airspace shall be handed off, and instructed to contact OLW for onwards clearance.

+

Charts

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Melbourne/index.html b/aerodromes/classc/Melbourne/index.html new file mode 100644 index 000000000..ba3a0a853 --- /dev/null +++ b/aerodromes/classc/Melbourne/index.html @@ -0,0 +1,5538 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Melbourne (YMML) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Melbourne (YMML)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Melbourne ADCMelbourne Tower120.500ML_TWR
Melbourne SMCMelbourne Ground121.700ML_GND
Melbourne ACDMelbourne Delivery127.200ML_DEL
Melbourne ATIS118.000YMML_ATIS
+

Standard Taxi Routes

+

Except when the traffic situation warrants, taxi clearances shall conform to the following diagram:

+
+

YMML Standard Taxi Routes +

+
YMML Standard Taxi Routes
+
+

Airspace

+

ML ADC is not responsible for any airspace by default.

+

Runway Modes

+

If winds are too great, single runway operations may be necessary (eg, Runway 16 for Arrivals and Departures). However, pending wind limitations (Crosswind <20kts, Tailwind <5kts), the following runway modes are to be used

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ModeArrivalsDepartures
27AD/34D2734 (Via MNG, NONIX, DOSEL and BOGES), 27 (All other deps)
16A/27D1627
09A/16D0916
+
+

Information

+

When utilising the 27AD/34D runway mode, Heavy Aircraft may require Runway 34 for departure due to the shorter length of Runway 27. Assigning Runway 34 to aircraft from the southern apron can also improve aerodrome efficiency due to the reduced taxi distance.

+
+
+

Note

+

See Runway Mode Formatting for details on how to format each runway mode in the ATIS.

+
+

SID Selection

+

Jet Aircraft planned via MNG, NONIX, DOSEL, CORRS, KEPPA, NEVIS, SUNTI, ESDIG, or CRENA, shall be assigned the Procedural SID that terminates at the appropriate waypoint. Jet Aircraft not planned via any of these waypoints shall receive amended routing via the most appropriate SID terminus, unless the pilot indicates they are unable to accept a Procedural SID.

+
+

Example

+

Jet Aircraft planned via DOSEL, assigned runway 27, shall be given the DOSEL SID.

+
+

Off Mode Departures

+
+

Definition

+

Off Mode: Aircraft departing from a runway not prescribed as active for departures on the ATIS. For example, a heavy aircraft that operationally requires Runway 16 for departure during the 16A/27D Mode.

+
+

For jet aircraft departing Runway 16 Off Mode via MNG, NONIX, DOSEL, KEPPA, NEVIS, or ESDIG, the ISPEG SID must be assigned. Off Mode departures to the south-east shall be assigned the relevant Procedural SID.

+
+

ISPEG1 SID +

+
Runway 16 and 27 departure conflicts visualised with the ISPEG1 SID
+
+
+

Note

+

The ISPEG1 SID does not resolve all conflicts. Departures via SUNTI and CORRS need to be handled tactically by ML TCU.

+
+

RADAR SID

+

a) Jet aircraft departing Off Mode that don't meet the above critera; or
+b) Non-Jet Aircraft; or
+c) All aircraft using Runway 09; or
+d) Aircraft that cannot accept a Procedural SID
+Shall be assigned the Radar SID.

+
+

Example

+

Non-Jet Aircraft planned via DOSEL, assigned runway 34, shall be given the ML (RADAR) SID.

+
+

ATIS

+

ATIS Identifier

+

YMML ATIS identifiers only uses letters N through to Y, due to nearby YMEN using letters A through M.

+

Approach Expectation

+

With Runway 34 in use for arrivals and the cloud base above A030 but below A042, the APCH field shall include:
+ACFT ON THE ALPHA STAR EXP INSTR APCH

+

This permits controllers to assign aircraft either the Alpha or Victor STAR and process them for a GLS/RNP approach or a visual approach (depending on traffic flow and pilot preference).

+

Runway Mode formatting

+ + + + + + + + + + + + + + + + + + + + + +
ModeATIS Runway information
27AD/34D27 FOR ARR, RWY 34 FOR DEPS VIA MNG, NONIX, DOSEL AND BOGES, RWY 27 FOR ALL OTHER DEPS
16A/27D16 FOR ARR, RWY 27 FOR DEP
09A/16D09 FOR ARR, RWY 16 FOR DEP
+

Operational Info

+

Independent Crossing Runway Operations

+

When using runway mode 09A/16D, the ATIS OPR INFO shall include:
+SIMUL INDEP CROSSING RWY OPS IN PROG

+

This allows for both Runway 09 and Runway 16 to operate independently of each other, with aircraft departing Runway 16 from Taxiway Echo.

+

ACD Pushback Requests

+

When implementing the Pushback Requests on ACD procedure, the OPR INFO shall include:
+ALL DEPARTURES MUST REQUEST PUSH BACK ON 127.2

+

Miscellaneous

+

Sunbury Corridor

+

Day VFR Helicopters may request clearance via the Sunbury Corridor. It is defined as the corridor 1nm either side of a track from SWT - PWLC - 16/27 Intersection at YMML.

+
+

Sunbury Corridor +

+
Sunbury Corridor
+
+

Boundary Coordination must be completed to ML TCU for clearances in this airspace

+
+

Example

+

ML ADC -> ML TCU: "For Ident, HM3, Sunbury Corridor, not above A020"
+ML TCU -> ML ADC: "HM3, No Restrictions"

+
+

Due to the close proximity of the airspace to the arrival and departure paths at YMML, controllers should be aware of surrounding traffic before issuing a clearance to helicopters.

+
+

Example

+

HM3: "Melbourne Tower, HM3, approaching SWT, A020, for YMEN via the Sunbury Corridor, request clearance"
+ML ADC: "HM3, cleared to YMEN, track Sunbury Corridor, not above A020"
+HM3: "Cleared to YMEN, track Sunbury Corridor, not above A020, HM3"

+
+

If necessary, consider issuing a clearance limit for separation or instruct helicopters to report sighting and to maintain own separation with other aircraft. Alternatively, tower controllers can simulate visual separation provided no risk of collision exists and both aircraft remain in sight of the controller at all times.

+
+

Example

+

ML ADC: "HM3, report sighting a Jetstar A320, 4nm final runway 16"
+HM3: "Traffic sighted, HM3"
+ML ADC: "HM3, pass behind that aircraft, maintain own separation, caution wake turbulence"
+HM3: "Pass behind the A320, maintain own separation, HM3"

+
+

Remember to pass traffic information to both aircraft.

+
+

Example

+

ML ADC: "JST515, traffic is a helicopter, 2nm northwest of the field, tracking for Essendon and maintaining own separation with you, runway 16, cleared to land"
+JST515: "Runway 16, cleared to land, JST515"

+
+

Workload Management

+

During busy events, such as Milk Run Monday, the SMC controller may end up with a much higher workload than the ACD controller. Additionally, delays may need to be implemented for aircraft requesting pushback, so as to not overload the taxiways and holding points.

+

Pushback Requests on ACD

+

To mitigate this, pushback requests may be done on ACD frequency, to balance the workload. A few steps must be followed to properly execute this procedure.

+
    +
  1. SMC and ACD coordinate to implement the procedure, due to high SMC workload.
  2. +
  3. SMC coordinates with ADC in order to have the ATIS updated.
  4. +
  5. When ACD has finished issuing an airways clearance, they will remind pilots to "Contact me when ready for pushback".
  6. +
  7. When a pilot requests pushback, ACD will instruct them to Monitor (not contact) Ground on 121.7, and advise their position in the queue.
  8. +
  9. ACD will move the strip in to the Queue section of the Cleared bay^ in OzStrips, to denote they are awaiting pushback approval†.
  10. +
  11. Eventually, SMC will have adequate space on the aprons, taxiways, and holding point, as well as time to make assessments.
  12. +
  13. SMC will scan the Cleared Queue bay for the next aircraft in line, and call them to approve their pushback.
  14. +
+
+

Example

+

ML SMC -> ML ACD: "It's getting quite busy. Happy to implement Pushback requests on your frequency?"
+ML ACD -> ML SMC: "Understood, affirm"
+ML SMC -> ML ACD: "Thanks, I'll talk to Tower"

+

ML SMC -> ML ADC: "Can we please get ALL DEPARTURES MUST REQUEST PUSH BACK ON 127.2 on the ATIS?"
+ML ADC -> ML SMC: "Wilco"

+

QFA401: "Melbourne Delivery, QFA401, Request Clearance"
+ML ACD: "QFA401, Melbourne Delivery. Cleared to..."
+QFA401: "Cleared to... we are bay B27, QFA401"
+ML ACD: "QFA401, Contact me when ready for pushback"
+...
+QFA401: "Request Pushback"
+ML ACD: "QFA401, Monitor Ground 121.7, Number 5. They will call you when pushback is available"
+QFA401: "Monitor 121.7, QFA401"
+ML SMC will move QFA401's strip to the Cleared Queue bay
+QFA401 will change frequency, but not contact ML SMC
+...
+ML SMC: "QFA401, Melbourne Ground, push approved"

+
+

Queue Management

+

Remember that the bottom aircraft represents the front of the queue.

+

^ Additionally, the strips must remain in the strip bay of their current state, even if they are in a queue. For example, if they have received an airways clearance and are in the queue for pushback, they must remain in the Cleared bay, not the Pushback bay.

+
+

Cleared Queue Bay +

+
Cleared Queue Bay
+
+

COBT Slot Times

+

† Aircraft that are compliant with their booked slot time should be moved to the front of the queue

+
+

COBT Slot Time +

+
COBT Slot Time
+
+

Coordination

+

Auto Release

+
+

Important

+

Melbourne utilises auto release for all Procedural SIDs and the ML (RADAR) SID provided aircraft are assigned the Standard Assignable Level and a Standard Assignable Heading.

+
+

'Next' coordination is not required for aircraft that are:

+
    +
  • Assigned a Procedural SID
      +
    • Departing from a runway nominated on the ATIS; and
    • +
    • Assigned A050
    • +
    +
  • +
  • Assigned the ML (RADAR) SID +
  • +
  • Assigned the ISPEG SID
      +
    • Departing from Runway 16 during the 16A27D Runway Mode; and
    • +
    • Assigned A050; and
    • +
    • Tracking via MNG, NONIX, DOSEL, KEPPA, NEVIS or ESDIG
    • +
    +
  • +
+

All other aircraft require a 'Next' call to ML TCU.

+
+

Example

+

ML ADC -> ML TCU: "Next, JIA, runway 34"
+ML TCU -> ML ADC: "JIA, Track Extended Centreline, Unrestricted"
+ML ADC -> ML TCU: "Track Extended Centreline, JIA"

+

ML ADC: "JIA, Track Extended Centreline 340 degrees, Runway 34, Cleared for Takeoff"
+JIA: "Track Extended Centreline 340 degrees, Runway 34, Cleared for Takeoff, JIA"

+
+

The ML TCU controller can suspend/resume Auto Release at any time, with the concurrence of ML ADC.

+

The Standard Assignable level from ML ADC to ML TCU is the lower of A050 or the RFL.

+

Standard Assignable Departure Headings

+

Aircraft that have been cleared the ML (RADAR) SID must receive an assigned heading with their line up or takeoff clearance.

+

The following Standard Assignable Headings may be used for aircraft assigned the ML (RADAR) SID, depending on their direction of travel.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayWNESES
09*----
16**290290160260
27320290260260
34340340340260
+

*When Runway 09 is in use for departures, ML TCU shall nominate a heading to ML ADC for use as a standard assignable heading.

+

**When Runway 09 is in use for arrivals, all Runway 16 departures shall be assigned heading 160.

+

Runway Change

+

Any runway change must be prior coordinated to MAE and EN ADC.

+

Departures Controller

+

Refer to Melbourne TCU Airspace Division for information on airspace divisions when MDN and/or MDS are online.

+

EN ADC

+

EN ADC is responsible for separation with all YMML traffic, and will coordinate any aircraft operating in EN ADC airspace that cannot be visually or laterally separated with YMML traffic.

+
+

Example

+

EN ADC -> ML ADC: "Boundary Ident, OXG, Published Missed Approach from the ILS 26"
+ML ADC -> EN ADC: "OXG, My restriction is QFA451 on a 10nm final RWY 34. Your separation"
+EN ADC -> ML ADC: "My separation with QFA451, OXG"

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Nowra/index.html b/aerodromes/classc/Nowra/index.html new file mode 100644 index 000000000..318e70f53 --- /dev/null +++ b/aerodromes/classc/Nowra/index.html @@ -0,0 +1,5036 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Nowra (YSNW) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Nowra (YSNW)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Nowra ADCNowra Tower118.850NW_TWR
Nowra SMCNowra Ground135.850NW_GND
Nowra ACDNowra Delivery128.350NW_DEL
Nowra ATIS125.65YSNW_ATIS
+

Airspace

+

NW ADC owns the Class C airspace from SFC to A020, within a 5nm radius of the NWA TACAN. This airspace is designed to facilitate helicopter and circuit traffic.

+

Runway Modes

+

Any combination of runway configurations are permitted, including single runway operations during strong wind conditions. The following list dictates common runway modes.

+
    +
  • Runway 21 and Runway 08;
  • +
  • Runway 21 and Runway 26;
  • +
  • Runway 03 and Runway 08;
  • +
  • Runway 03 and Runway 26;
  • +
+

Circuit Procedures

+

Circuit operations occur within a 5NM radius of NWA TACAN, at the following altitudes:

+
    +
  • Fixed Wing: A020
  • +
  • Rotary Wing: A012
  • +
  • Flight Deck Procedural Trainer: not above A007
  • +
+

Circuit Direction

+ + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDirection
08Right
21Right
03Left
26Left
+

Helicopter Operations

+

VFR helicopters may elect to operate to/from designated positions (helicopter spots) on the aerodrome by both day and night, remaining clear of the active runway/s. IFR helicopters must operate from/to the active duty runway.

+

Helicopter Spots

+

Take-offs and landings to the Helicopter Spots should be parallel to the duty RWY direction. Normally the most upwind Helicopter Spot parallel to the RWY is designated for departures, and the downwind Helicopter Spot designated for arrivals. Helicopter Spots have been designed to allow simultaneous arrivals and departures of an adjacent Helicopter Spot. After landing at a Helicopter Spot, helicopters shall not vacate the Spot until in receipt of a taxi clearance from SMC.

+

The following pre-defined helicopter spots can be used for this purpose. These spots are physically marked with bidirectional numbers in addition to the standard “H” marking.

+
    +
  • Spot 1 (Taxiway C2)
  • +
  • Spot 2 (Taxiway C3)
  • +
  • Spot 3 (Taxiway B4)
  • +
  • Spot 4 (Taxiway B4)
  • +
  • Spot 5 (Taxiway B3)
  • +
  • Spot 6 (Taxiway B3)
  • +
  • Spot 7 (Taxiway A2)
  • +
  • Spot 8 (Taxiway A2)
  • +
+
+

NW VFR CRD

+
NW VFR CRD
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Active RunwayDeparture Spots (Order of Preference)Arrival Spots (Order of Preference)
Runway 08Spot 2 (C3), Spot 1 (C2)Spot 8 (A2), Spot 7 (A2)
Runway 26Spot 8 (A2), Spot 7 (A2)Spot 2 (C3), Spot 1 (C2)
Runway 03Spot 6 (B3), Spot 5 (B3)Spot 4 (B4), Spot 3 (B4)
Runway 21Spot 4 (B4), Spot 3 (B4)Spot 6 (B3), Spot 5 (B3)
+
+

Example

+

NW ADC: "TAIP52, spot 2, cleared to land"
+TAIP52: "Spot 2, cleared to land, TAIP52"

+
+

Charts

+

Aerodrome and instrument approach charts are available in the AIP, or otherwise in the RAAF TERMA document, available towards the bottom of RAAF AIP page.

+

Coordination

+

Auto Release

+

Auto release is not utilised at Nowra. 'Next' coordination is required from NW ADC to NW TCU for all aircraft.

+
+

Example

+

NW ADC -> NW TCU: "Next, ASY01, runway 08"
+NW TCU -> NW ADC: "ASY01, Assigned Heading Left 030, unrestricted"
+NW ADC -> NW TCU: "Assigned Heading Heading Left 030, ASY01"

+
+

Helicopters departing from helicopter spots will be treated as if departing from the duty runway.

+
+

Example

+

PSDN14 is a VFR helicopter departing from spot 2 (in the direction of runway 08)
+NW ADC -> NW TCU: "Next, PSDN14, runway 08"
+NW TCU -> NW ADC: "PSDN14, right turn, unrestricted"
+NW ADC -> NW TCU: "Right turn, PSDN14"

+
+

Level Assignment

+

The Standard Assignable Level from NW ADC to NW TCU is F120 or RFL, whichever is lower.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Oakey/index.html b/aerodromes/classc/Oakey/index.html new file mode 100644 index 000000000..a27330ee6 --- /dev/null +++ b/aerodromes/classc/Oakey/index.html @@ -0,0 +1,4901 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Oakey (YBOK) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Oakey (YBOK)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Oakey ADCOakey Tower120.100OK_TWR
Oakey SMCOakey Ground121.900OK_GND
Oakey ATIS124.300YBOK_ATIS
+

Airspace

+

OK ADC owns the airspace within 5 DME of the OK VOR from SFC to A025. This airspace is designed to facilitate circuit traffic.

+

Charts

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+

Miscellaneous

+

Circuit Heights

+

a) Standard Circuit A024
+b) Low Level Circuit A017

+

Circuit Direction

+

The standard circuit direction is to the north of the field.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDirection
32Right
14Left
23Right
05Left
09Left
27Right
+

Coordination

+

OK TCU

+

'Next' coordination is required from OK ADC to OK TCU for all aircraft not remaining in the circuit.

+
+

Example

+

OK ADC -> OK TCU: "Next, MRCH01, runway 32"
+OK TCU -> OK ADC: "MRCH01, Make Right Turn, unrestricted"
+OK ADC -> OK TCU: "Make Right Turn, MRCH01"

+
+

The Standard Assignable level from OK ADC to OK TCU is the lower of F120 or the RFL.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Pearce/index.html b/aerodromes/classc/Pearce/index.html new file mode 100644 index 000000000..bc68f872d --- /dev/null +++ b/aerodromes/classc/Pearce/index.html @@ -0,0 +1,4609 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Pearce (YPEA) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Pearce (YPEA)

+ +

Reserved.

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Perth/index.html b/aerodromes/classc/Perth/index.html new file mode 100644 index 000000000..260b00c58 --- /dev/null +++ b/aerodromes/classc/Perth/index.html @@ -0,0 +1,5020 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Perth (YPPH) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Perth (YPPH)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin ID
Perth ADCPerth Tower127.400PH_TWR
Perth SMC WestPerth Ground121.700PH_GND
Perth SMC East†Perth Ground122.200PH-E_GND
Perth ACDPerth Delivery118.550PH_DEL
Perth ATISN/A123.800YPPH_ATIS
+

Non-standard positions may only be used in accordance with VATPAC Air Traffic Services Policy

+

Airspace

+

PH ADC is not responsible for any airspace by default.

+

Runway Selection

+

Southwest Plan

+

With the Southwest Plan active, all departures shall be assigned runway 21. Arrivals will be processed to either runway 21 or 24 based on their feeder fix, as per the table below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Feeder FixAssigned Runway
JULIM21
SAPKO21
IPMOR21
KABLI24 (or 21 if operationally required)
LAVEX24
SOLUS24
+

The ATIS shall notify EXPECT ILS APCH.

+

Northeast Plan

+

With the Northeast Plan active, departures via AVNEX, OTLED, OLMAM, SOLUS, and OPEGA shall be assigned runway 03. All other departures shall be assigned runway 06. All arrivals will be processed to runway 03.

+

When both Runway 03 and Runway 06 are nominated as departure runways, broadcast the following: RWY 03 FOR DEP VIA OTLED, AVNEX, OLMAM, SOLUS AND OPEGA. RWY 06 FOR ALL OTHER DEP.

+

In the following conditions, ATIS shall notify EXPECT ILS APCH:
+ - By night; and/or
+ - Cloud base of A032 or below

+

Circuit Training

+

Circuit training traffic shall be issued SSR code and clearance to operate within circuit area not above A015. Circuit training is typically conducted on Runway 03/21.

+

All circuits are to be conducted to the east of Runway 03/21 (right-hand circuit Runway 03).

+

Helicopter Operations

+

There are no helipad facilities at YPPH. Helicopters should be issued an airways clearance in accordance with the fixed-wing operation applicable to their flight rules (i.e. SID for IFR helicopters, VFR departure via appropriate VFR route if necessary for VFR helicopters). Helicopters should be cleared to takeoff/land from runways or taxiways, as deemed appropriate by ADC. The point of takeoff/landing must be specified by ADC.

+
+

Example

+

PH ADC: "YOE, taxiway Romeo, cleared to land"

+

PH ADC: "HWD, runway 21, cleared for takeoff"

+
+

Scenic Flights

+

When traffic permits, VFR scenic flights over Perth are cleared via VICTOR 65 route (CTE-PCTY-HKE). Coordination with PH TCU is required prior to issuing this clearance, see ACD to PH TCU.

+

Coordination

+

Auto Release

+

'Next' coordination is not required for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; and
+ b) Assigned the standard assignable level; and
+ c) Assigned a Procedural SID

+

All other aircraft require a 'Next' call to PH TCU.

+
+

Example

+

PH ADC -> PH TCU: "Next, ABC, runway 03"
+PH TCU -> PH ADC: "ABC, Heading 010, unrestricted"
+PH ADC -> PH TCU: "Heading 010, ABC"

+

PH ADC: "ABC, Assigned heading left 010, Runway 03, Cleared for Takeoff"
+ABC: "Left heading 010, Runway 010, Cleared for Takeoff, ABC"

+
+

The PH TCU controller can suspend/resume Auto Release at any time, with the concurrence of PH ADC.

+

The Standard Assignable level from PH ADC to PH TCU is the lower of A050 or the RFL.

+

Departures Controller

+

Refer to Perth TCU Airspace Division for information on airspace divisions when PHD is online.

+

ACD to PH TCU

+

The controller assuming responsibility of ACD shall give heads-up coordination to the relevant PH TCU controller prior to the issue of the following clearances:
+a) VFR Departures
+b) Aircraft using a runway not on the ATIS

+
+

Example

+

ABC: "Perth Delivery, ABC, request Victor 65"
+PH ACD: "ABC, Perth Delivery, standby"

+

PH ACD -> PH TCU: "ABC, requesting Victor 65"
+PH TCU -> PH ACD: "ABC, cleared Victor 65, 1,500ft"
+PH ACD -> PH TCU: "Cleared Victor 65, 1,500ft, ABC"

+

PH ACD: "ABC, cleared Victor 65, climb to 1,500ft, squawk 0442"
+ABC: "Cleared Victor 65, climb to 1,500ft, squawk 0442, ABC"

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Richmond/index.html b/aerodromes/classc/Richmond/index.html new file mode 100644 index 000000000..f65df2acd --- /dev/null +++ b/aerodromes/classc/Richmond/index.html @@ -0,0 +1,4609 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Richmond (YSRI) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Richmond (YSRI)

+ +

Reserved.

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Scherger/index.html b/aerodromes/classc/Scherger/index.html new file mode 100644 index 000000000..689266c1e --- /dev/null +++ b/aerodromes/classc/Scherger/index.html @@ -0,0 +1,4852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Scherger (YBSG) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Scherger (YBSG)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Scherger ADCScherger Tower118.300SG_TWR
Scherger SMCScherger Ground126.200SG_GND
Scherger ATIS134.800YBSG_ATIS
+

Airspace

+

SG ADC owns the Class C airspace within the SG CTR from SFC to A015.

+

Circuit Direction

+ + + + + + + + + + + + + + + + + +
RunwayDirection
30Right
12Left
+

Coordination

+

SG TCU

+

'Next' coordination is required from SG ADC to SG TCU for all aircraft.

+
+

Example

+

SG ADC -> SG TCU: "Next, ASY219, runway 30"
+SG TCU -> SG ADC: "ASY219, unrestricted"
+SG ADC -> SG TCU: "ASY219"

+
+

The Standard Assignable Level from SG ADC to SG TCU is the lower of F240 or the RFL.

+

ISA(ARA)

+

When SG TCU is offline, coordination is not required between SG ADC and ISA(ARA). Aircraft entering ISA(ARA) airspace shall be handed off, and instructed to contact ISA(ARA) for onwards clearance.

+

Charts

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Sydney/index.html b/aerodromes/classc/Sydney/index.html new file mode 100644 index 000000000..5fead1116 --- /dev/null +++ b/aerodromes/classc/Sydney/index.html @@ -0,0 +1,6208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sydney (YSSY) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Sydney (YSSY)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Sydney ADC WestSydney Tower120.500SY_TWR
Sydney ADC East†Sydney Tower124.700SY-E_TWR
Sydney SMC WestSydney Ground126.500SY_GND
Sydney SMC East†Sydney Ground121.700SY-E_GND
Sydney Coordinator†Sydney Coordinator127.600SY-C_GND
Sydney ACDSydney Delivery133.800SY_DEL
Sydney ATIS126.250YSSY_ATIS
+

Non-standard positions may only be used in accordance with VATPAC Air Traffic Services Policy

+

Airspace

+

SY ADC is responsible for the Class C airspace in the SY CTR SFC to A005 as shown below.

+
+

SY ADC Airspace +

+
SY ADC Airspace
+
+

Helicopter Operations

+

Refer to Heliport Responsibility to determine which ADC position (when both are online) is responsible for managing helicopter arrivals and departures.

+

Departures

+

VFR helicopters are generally processed via one of Sydney's Helicopter Routes. IFR helicopters should conform to fixed wing ops and be processed via the SY (RADAR) SID from an appropriate runway, unless a visual departure is acceptable.

+

SY ACD will issue airways clearance for a Helicopter Route through a coded clearance.

+
+

Tip

+

You can find details of each Helicopter Route (including applicable clearance limits) in the ERSA FAC YSSY.

+
+
+

Example

+

YOE: "Sydney Delivery, helicopter YOE, for the Harbour Bridge 5 outbound, request clearance"
+SY ACD: "YOE, Delivery, cleared Harbour Bridge 5 outbound, squawk 0215, departure frequency 123.0"
+YOE: "Cleared Harbour Bridge 5 outbound, squawk 0215, departure frequency 123.0, YOE"

+
+

Most helicopters will be capable of departing from their company helipad. If reposition is required to Helipad 1 (the primary helipad), this must be approved by SY ADC.

+
+

Example

+

YOE: "Sydney Tower, helicopter YOE, Hotel 7, request reposition Hotel 1"
+SY ADC: "YOE, reposition approved"
+YOE: "Reposition approved, YOE"

+
+

Helipad 1 is controlled by SY ADC and treated like a runway (takeoff clearances required). All other pads are outside Tower's jurisdiction and do not require a takeoff/landing clearance, however, approval must still be sought for helicopters to become airborne in the SY CTR. This approval is communicated in the form of a requirement to 'report airborne'.

+
+

Example

+

HWD: "Sydney Tower, helicopter HWD, Hotel 7, for the Harbour Bridge 5 outbound, ready"
+SY ADC: "HWD, Sydney Tower, report airborne"
+HWD: "HWD"

+

HWD: "HWD, airborne"
+SY ADC: "HWD, contact departures"
+HWD: "Departures, HWD"

+
+

Helicopter operations should be accommodated without unduly delaying fixed wing traffic to/from the aerodrome. Where possible, visually separate helicopters and fixed wing aircraft, and when necessary, delegate responsibility for separation to the helicopter.

+
+

Example

+

SY ADC: "HSZ, traffic is a 737 shortly rolling on runway 34R, report in sight"
+HSZ: "Traffic sighted, HSZ"
+SY ADC: "HSZ, maintain own separation, caution wake turbulence, report airborne"
+HSZ: "Maintain own separation, wilco, HSZ"

+
+

Arrivals

+

VFR helicopters are generally processed via by one of Sydney's Helicopter Routes. IFR helicopters should conform to fixed wing ops and be processed via an appropriate runway.

+

SY TCU will clear helicopters for all inbound Helicopter Routes, with the exception of the CAPE BANKS 5 INBOUND and WANDA 5 INBOUND. Tower controllers should assess the current traffic situation and issue clearances for these aircraft when available. Each procedure is delivered as a coded clearance, which includes automatic altitude assignment, tracking, and a clearance limit designed to separate helicopters from fixed-wing aircraft.

+
+

Example

+

YZD: "Sydney Tower, helicopter YZD, JIBN, A005, received Tango, request Cape Banks 5 Inbound"
+SY ADC: "YZD, Sydney Tower, cleared Cape Banks 5 Inbound, report at the Container Terminal"
+YZD: "Cleared Cape Banks 5 Inbound, YZD"

+

YZD: "YZD, Container Terminal"
+SY ADC: "YZD, cleared visual approach, report on the ground"
+YZD: "Cleared visual approach, wilco, YZD"

+
+
+

Tip

+

You can find details of each Helicopter Route (including applicable clearance limits) in the YSSY ERSA FAC.

+
+

During times of peak fixed wing traffic, instruct helicopters to hold at their designated clearance limit on their Helicopter Route and maintain own separation on approach to the heliport.

+
+

Example

+

SY ADC: "YOE, hold at the clearance limit, traffic is a 717 on a 4nm final to runway 25, report in sight"
+YOE: "Hold at the clearance limit, traffic sighted, YOE"
+SY ADC: "YOE, pass behind that aircraft, maintain own separation, caution wake turbulence, cleared visual approach, report on the ground"
+YOE: "Pass behind the 717, maintain own separation, cleared visual approach, YOE"

+

Remember to pass traffic information to both aircraft.
+SY ADC: "QJE1745, traffic is a helicopter, currently 3nm north of the field, they'll maintain own separation and pass behind you on approach to the heliport, runway 25, cleared to land"
+QJE1745: "Runway 25, cleared to land, QJE1745"

+

YOE: "YOE, on the pad"
+SY ADC: "YOE"

+
+

Helipad 1 is controlled by SY ADC and treated like a runway (landing clearances required). All other pads are outside Tower's jurisdiction and do not require a takeoff/landing clearance. Helicopters should be instructed to 'report on the ground' so the controller knows when they are no longer active in their airspace.

+

Maneuvering Area Responsibility

+
+

YSSY Maneuvering Area +

+
Maneuvering Area
+
+

Standard Taxi Routes

+

Except when the traffic situation warrants, taxi clearances shall conform to the following diagram:

+
+

YSSY Taxi Route +

+
Standard Taxi Routes
+
+
+

Tip

+

For aircraft taxiing northbound on B, consider instructing them to hold short of taxiway B8 when 34L or 16R are in use for arrivals, in order to separate from aircraft using the B7 & B9 rapid exits.

+
+

ERSA FAC YSSY noise abatement procedures require jet aircraft to depart runway 34L from full length only. This should be simulated where practical but intersection departures should be offered to jet aircraft on request where available.

+

Runway 16L/34R

+

When both ADC and SMC are online, SMC shall issue aircraft departing on runway 16L/34R with a taxi limit in accordance with the table below. When runway 34R is in use, ADC shall issue further taxi to the holding point, considering any conflict with arriving aircraft taxiing via U1 and L.

+ + + + + + + + + + + + + + + + + +
Departure RunwayTaxi Limit
Runway 16LHolding point B10
Runway 34RTaxiway S
+
+

Example

+

SY SMC: "VOZ853, taxi Charlie, cross runway 25, hold short Sierra"
+VOZ853: "Taxi Charlie, cross runway 25, hold short Sierra, VOZ853"

+

VOZ853: "Sydney Tower, VOZ853, holding short Sierra, ready"
+SY ADC: "VOZ853, Sydney Tower, give way to the inbound Jetstar A320, taxi holding point Tango Six, runway 34R"

+
+

Aircraft landing on runway 16L/34R are expected to vacate the runway and taxi via the standard taxi routes to join taxiway Lima. If pilots are unfamiliar with local procedures, they should be instructed by ADC to taxi accordingly. Where possible, outbound aircraft should give way to inbound aircraft to avoid creating congestion at the runway exits.

+
+

Example

+

SY ADC: "JAL52, taxi Tango, Lima, on Lima contact Ground 121.7"

+
+

Transferring Between SMCs

+

When both SMC positions are online and an aircraft is to be passed from one to the other (e.g. an aircraft taxis from the domestic terminal for runway 34L), they should be instructed to hold short of runway 16R/34L and to contact the next SMC frequency.

+
+

Example

+

SMC East: "JST412, cross runway 25, taxi Lima, hold short runway 34L, on Lima contact ground 126.5"
+JST412: "Cross runway 25, taxi Lima, hold short runway 34L, contact ground 126.5, JST412"

+

JST412: "Sydney Ground, JST412, holding short runway 34L"
+SMC West: "JST412, cross runway 34L, taxi holding point Alpha Six"
+JST412: "Cross runway 34L, taxi holding point Alpha Six, JST412"

+
+

Generally, aircraft shall cross runway 16R/34L in the following directions at the following locations:

+ + + + + + + + + + + + + + + + + + + + + +
LocationDirection of Taxi
Taxiway GolfEastbound
Runway 25Westbound
Taxiway LimaAs required
+

Runway Modes

+

Preferred Runway Modes

+

Winds must always be considered for Runway modes (Crosswind <20kts, Tailwind <5kts), however the order of preference is as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Priority - ModeArrivalsDepartures
1 - SODPROPS34L16L
2 - 34 PROPS34L & 34R34L & 34R
2 - 16 PROPS16L & 16R16L & 16R
3 - 16D/07A0716L & 16R
3 - 25D/34A34L & 34R25
4 - 16D/25A2516L & 16R
5 - 070707
5 - 252525
*Curfew34L16R
+

*Permitted between the hours of 2300 and 0600 Local. If the pilot does not want to participate in curfew mode operations, the controller must accommodate this request.

+
+

Note

+

In general, the SODPROPS, 16D/07A, and 25D/34A modes are most suitable for Noise Abatement. The PROPS modes are most suitable for higher capacity. Since for the most part, neither of these are a factor on VATSIM, it is up to you which runway mode you would like to operate, subject to winds. Consider favouring the higher capacity PROPS modes during busy times, such as events like Milk Run Monday or Panic Stations.

+
+
+

Tip

+

Take in to account an aircraft's weight when runways 16L/34R or 07/25 are in use. Heavier aircraft may operationally require the longer Runway 16R/34L, or pilots may prefer a departure from 16R instead of 16L so they have a shorter taxi. If in doubt, ask the pilot and try to be accommodating of these requests.

+
+

SODPROPS

+

When using the SODPROPS mode, pass traffic information to aircraft that are departing and landing at the same time.

+
+

Example

+

SY ADC: "JST521, traffic is a 737 on a 3nm final for the opposite direction parallel runway, runway 16L, cleared for takeoff"
+JST521: "Runway 16L, cleared for takeoff, JST521"
+SY ADC: "VOZ954, traffic is an A320 departing from the opposite direction parallel runway to the southeast, runway 34L, cleared to land"
+VOZ954: "Runway 34L, cleared to land, VOZ954"

+
+

Heliport Responsibility

+

When runway 25 is in use, the responsibility for management of the helicopter area falls to ADC West. When runway 25 is not in use, ADC East (if online) takes responsibility for the heliport.

+

Parallel Runway Operations

+

Refer to Parallel Runway Separation Standards for more information

+

Go-arounds / Missed Approaches

+

When operating under PROPS, go around headings shall diverge from the extended centreline of the parallel runway by at least 30°. Aircraft cleared the ILS or IVA may follow the published missed approach in order to meet this requirement.
+Go arounds / missed approaches shall be coordinated with the SY TCU as per the standard procedure.

+

Runway Selection

+

Unless operationally required, aircraft shall be assigned the following runways for departure when PROPS are in progress:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Aircraft trackingRunway
via KADOM16R/34L
Jets via WOL16R/34R
Non-Jets via WOL16R/34L
via RIC16R/34L
via OLSEM16L/34R
Other aircraft:
To the NORTH and EAST16L/34R
To the SOUTH and WEST16R/34L
+
+

Note

+

During times of heavy traffic, it may be beneficial for ACD to balance the load between Runways 34L and 34R for domestic jet departures via WOL. Non-jet departures via WOL should still be processed on 34L. The same principle may be applied to the Runway 16 direction when the 16R holding points are becoming congested and a large amount of heavy, international aircraft are planned to depart during a given window.

+

Where the traffic levels are normal, preference should be given to departing aircraft in accordance with the runway selection table above.

+
+

SID Selection

+
+

Tip

+

A radar SID (e.g. SY (RADAR) SID) is distinct from a procedural SID with a RADAR transition (eg, RIC SID, RADAR transition). A radar SID can be identified in the DAPs as having a "(RADAR)" at the end of the name.

+
+

Runway 07

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeViaSID
JetOLSEM
WOL
FISHA SID, Relevant Transition
JetAll othersFISHA SID, RADAR Transition
Non-JetAllRADAR SID
+

Runway 16L

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeViaSID
JetOLSEM
NOBAR
DIPSO
EVONN
CAWLY
OPTIC
KEVIN SID, Relevant Transition
JetWOLABBEY SID, WOL Transition
JetAll othersKEVIN SID, RADAR Transition
Non-JetAllRADAR SID
+

Runway 16R

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeViaSID
JetRIC
KADOM
WOL
GROOK SID, Relevant Transition
JetAll othersGROOK SID, RADAR Transition
Non-JetAllRADAR SID
+

Runway 25

+ + + + + + + + + + + + + + + +
TypeViaSID
AllAllRADAR SID
+

Runway 34L

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeViaSID
JetWOLWOL SID
JetKADOMKADOM SID
JetRICRIC SID, RIC Transition
JetAll othersRIC SID, RADAR Transition
Non-JetAllRADAR SID
+

Runway 34R

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeViaSID
JetOLSEMOLSEM SID
JetWOLMARUB SID, WOL Transition
JetAll othersMARUB SID, RADAR Transition
Non-JetAllRADAR SID
+

Climb Gradient Requirements

+

Climb Gradient Requirements apply to all Procedural SIDs. It is the pilot's responsibility to advise if they are unable to meet these requirements. Pilots that advise this can be assigned a RADAR SID instead.

+

ATIS

+

Approach Types

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Cloud BaseVisibilityApproach
>3000FT>5000MEXP INDEP VISUAL APCH
Between 2000FT & 3000FT>5000MEXP INSTR APCH THEN INDEP VISUAL APCH WHEN VISUAL
Below 2000FT or<5000MEXP INSTR APCH
+
+

Important

+

Independent Visual Approaches (IVAs) may only be run during Parallel Runway Operations (PROPS). During single runway operations, regular visual approaches (blank ATIS 'APCH' field) should be used instead.

+
+

When Independent Visual Approaches are run during PROPS, the APCH field must also include DO NOT PASS THRU ASSIGNED RWY CL.

+

Operational Info

+
+

For the following approach types:

+
    +
  • +

    EXP INSTR APCH

    +
  • +
  • +

    EXP INSTR APCH THEN INDEP VISUAL APCH WHEN VISUAL

    +
  • +
+

the ATIS OPR INFO shall include INDEP PARL DEPS IN PROG.

+
+

Note

+

This permits independent departures (two simultaneous departures on parallel runways) but NOT independent approaches (two simultaneous arrivals on parallel runways without perscribed separation minima).

+
+
+

+
+

For the following approach type,

+
    +
  • EXP INDEP VISUAL APCH
  • +
+

the ATIS OPR INFO shall include INDEP PARL APPROACHES AND DEPS IN PROG.

+
+

+
+

When SODPROPS are in operation, the ATIS OPR INFO shall include SIMUL OPP DIR PARL RWY OPS IN PROG.

+
+

+
+

When Coordinator is online, the ATIS OPR INFO shall include WHEN READY FOR PUSH BACK OR TAXI CTC COORDINATOR 127.6.

+

When Coordinator is online and start approval is required, the ATIS OPR INFO shall include START APPROVAL RQ. WHEN READY FOR PUSH BACK OR ENGINE START, CTC SYDNEY COORDINATOR ON FREQ 127.6, FOR START TIME.

+
+
+

Example

+

+ IVAs on the ATIS +

+
+

Sydney Coordinator

+

Sydney Coordinator is activated to reduce frequency congestion on SMC and ensure compliance with pre-determined slot times. The position is rarely used on VATSIM and is only beneficial with the large amounts of traffic seen during annual events like WorldFlight. When Coordinator is online, all departures are first directed to them prior to monitoring SMC.

+
+

Important

+

Sydney Coordinator is a non-standard position which may only be used in accordance with VATPAC Air Traffic Services Policy.

+
+
+

Tip

+

The responsibilities of Sydney Coordinator may also be delegated to ACD when there is high SMC workload however no seperate Coordinator controller available (as per NOTAM YSSY 220).

+
+

A few steps must be followed during the operation of coordinator:

+
    +
  1. SMC and COORD coordinate to implement the procedure.
  2. +
  3. SMC coordinates with ADC in order to have the ATIS updated to include WHEN READY FOR PUSH BACK OR TAXI CTC COORDINATOR 127.6.
  4. +
  5. When ACD has finished issuing an airways clearance, they will handoff pilots to Coordinator "contact Coordinator 127.6 for pushback" OR remind pilots to "contact me when ready for pushback" (during combined ACD and COORD).
  6. +
  7. When a pilot requests pushback, COORD will assess their priority based on apron congestion and number of aircraft at the holding point.
  8. +
  9. COORD will either instruct them to Monitor (not contact) SMC, or remain on the Coordinator frequency for a pushback delay (as per the below phraseology).
  10. +
  11. Once the aircraft is monitoring SMC, COORD will move the strip to the Queue section of the Cleared bay^ in OzStrips, to denote they are awaiting pushback approval†.
  12. +
  13. Eventually, SMC will have adequate space on the aprons, taxiways, and holding point, as well as time to make assessments.
  14. +
  15. SMC will scan the Cleared Queue bay for the next aircraft in line, and call them to approve their pushback.
  16. +
+
+

Example

+

VOZ543: "Sydney Delivery, VOZ543, PDC read back"
+SY ACD: "VOZ543, go ahead the read back"
+VOZ543: "OLSEM1 departure, squawk 1336, bay 33, VOZ543"
+SY ACD: "VOZ543, contact Coordinator 127.6 for pushback"
+VOZ543: "127.6 for push, VOZ543"
+...
+VOZ543: "Sydney Coordinator, VOZ543, bay 33, request pushback"
+SY COORD: "VOZ543, monitor ground 121.7"
+VOZ543: "Monitor 121.7, VOZ543"
+...
+SY SMC: "VOZ543, Sydney Ground, pushback approved."

+
+
+

Note

+

If a delay is required prior to transferring an aircraft to SMC, provide an estimated delay value to the pilot.

+
+
+

Example

+

VOZ543: "Sydney Coordinator, VOZ543, bay 33, request pushback"
+SY COORD: "VOZ543, estimated delay 10 minutes, remain this frequency."

+
+

Start Approval

+

When delays for taxi are excessive (e.g. 15–30 minutes), it may be necessary to include the following ATIS OPR INFO: START APPROVAL RQ. WHEN READY FOR PUSH BACK OR ENGINE START, CTC SYDNEY COORDINATOR ON FREQ 127.6, FOR START TIME.

+

This will ensure aircraft don't start their engines before a 30 minute wait, thereby burning considerable fuel and potentially disrupting the latter parts of the flight (e.g. the aircraft may not have enough fuel for lengthy en-route sequencing or holds).

+

Queue Management

+

Remember that the bottom aircraft represents the front of the queue.

+

^ Additionally, the strips must remain in the strip bay of their current state, even if they are in a queue. For example, if they have received an airways clearance and are in the queue for pushback, they must remain in the Cleared bay, not the Pushback bay.

+
+

Cleared Queue Bay +

+
Cleared Queue Bay
+
+

COBT Slot Times

+

† Aircraft that are compliant with their booked slot time should be moved to the front of the queue

+
+

COBT Slot Time +

+
COBT Slot Time
+
+

Coordination

+

Auto Release

+
+

Important

+

YSSY utilises auto release for all Procedural SIDs (except ABBEY SID during SODPROPS), and the SY (RADAR) SID provided aircraft are assigned the standard assignable level and a Standard Assignable Heading.

+
+

'Next' coordination is not required for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; and
+ b) Assigned the Standard assignable level; and
+ c) Assigned a Procedural SID (except ABBEY SID); or
+ d) Assigned a Standard Assignable Heading

+

All other aircraft require a 'Next' call to SY TCU.

+

'Next' coordination is additionally required for:
+ a) Visual departures
+ b) Departures to YSBK
+ c) After a go around, the next departure from that runway
+ d) Jets departing 16L via WOL
+ e) All aircraft during the Curfew Runway Mode

+
+

Example

+

SY ADC -> SY TCU: "Next, MHQ, Runway 34R"
+SY TCU -> SY ADC: "MHQ, heading 030, unrestricted"
+SY ADC -> SY TCU: "Heading 030, MHQ"

+

SY ADC: "MHQ, Assigned heading right 030, Runway 34R, Cleared for Takeoff"
+MHQ: "Right heading 030, Runway 34R, Cleared for Takeoff, MHQ"

+
+

The SY TCU controller can suspend/resume Auto Release at any time, with the concurrence of SY ADC.

+

The Standard Assignable level from SY ADC to SY TCU is:
+For Jets: A050
+For Non-Jets: The lower of A030 or the RFL

+

Departures Controller

+

Refer to Sydney TCU Airspace Division for information on airspace divisions when SDN and/or SDS are online.

+

Standard Assignable Departure Headings

+

Aircraft that have been cleared the SY (RADAR) SID must receive an assigned heading with their line up or takeoff clearance. 'Next' coordination is not required to the SY TCU controller when the departing aircraft has been assigned the standard assignable level and assigned one of the headings listed below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayJetNon-Jet
07070020, 110
16L125125 (RWY 25 in use), 090 (RWY 25 not in use)
16R170210
25300, 240020, 210, 240
34L290230
34R030, 070350
+
+

Tip

+

If strong winds are present at altitude, TWR/DEP should discuss slight changes to these headings (+/- 5 degrees) to compensate for large crosswind components.

+
+

Between ADC and SMC

+

Inactive Runway Releases

+

SY ADC has responsibility of all runways, requiring SY SMC to coordinate with SY ADC to allow aircraft to cross runways whilst taxiing. SY SMC may request, or SY ADC may elect, to release certain runways to the SY SMC controller, so they may let aircraft cross the runway without coordination (for example, releasing runway 07/25 to SY SMC whilst PROPS are in progress.) This release may also be cancelled at the controller's discretion.

+

ACD to SY TCU

+

The controller assuming responsibility of SY ACD shall give heads-up coordination to the relevant SY TCU controller prior to the issue of the following clearances:
+a) VFR Departures
+b) Aircraft using a runway not on the ATIS

+
+

Example

+

TEK: "Sydney Delivery, TEK, for YSHL via CUL, A025, request clearance"
+SY ACD: "TEK, Sydney Delivery, standby"

+

SY ACD -> SY TCU: "TEK, requesting clearance for YSHL via CUL, A025"
+SY TCU -> SY ACD: "TEK, cleared to YSHL via CUL, A025"
+SY ACD -> SY TCU: "Cleared to YSHL via CUL, A025, TEK"

+

SY ACD: "TEK, cleared to YSHL via CUL, climb A025, squawk 0552, departure frequency 123.0"
+TEK: "Cleared to YSHL via CUL, climb A025, squawk 0552, departure frequency 123.0, TEK"

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Tindal/index.html b/aerodromes/classc/Tindal/index.html new file mode 100644 index 000000000..df7a93c90 --- /dev/null +++ b/aerodromes/classc/Tindal/index.html @@ -0,0 +1,4609 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Tindal (YPTN) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Tindal (YPTN)

+ +

Reserved.

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Townsville/index.html b/aerodromes/classc/Townsville/index.html new file mode 100644 index 000000000..04905f221 --- /dev/null +++ b/aerodromes/classc/Townsville/index.html @@ -0,0 +1,4998 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Townsville (YBTL) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Townsville (YBTL)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Townsville ADCTownsville Tower118.300TL_TWR
Townsville SMCTownsville Ground121.800TL_GND
Townsville ACDTownsville Delivery128.100TL_DEL
Townsville ATIS133.500YBTL_ATIS
+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+

Airspace

+

TL ADC owns the Class C airspace in the TL CTR (Extends to 7NM from the thresholds of Runway 01/19) from SFC to A015. This airspace is designed to facilitate Helicopter Traffic and Ciruit Traffic.

+

Aerodrome

+

Runway Operations

+

Runway 01/19 are the primary runways at Townsville. +Runway 07/25 may be used in conjunction with 01/19 for VFR arrivals and Helicopter Traffic.

+

NON-RNAV Departures

+

For non-RNAV approved IFR aircaft with a wake turbulence category of medium or greater, issue a RADAR SID. +For non-RNAV approved IFR aircraft with a wake turbulence category of light, issue a visual departure or RADAR SID

+

Charts

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+

Miscellaneous

+

Circuit Operations

+

VFR aircraft conducting circuits inside TL ADCs airspace shall be at or below A015. Higher circuit altitude may be given if voice coordinated with TL TCU.

+

Circuit Direction

+ + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDirection
01Left
07Left
19Right
25Right
+

Helicopter Procedures

+

Procedures relating to Helicopters can be found in the Airforce AIP AD2 SUPPS Section for Townsville. (7.5 - 7.9) +YBTL AD2 SUPPS Page

+

Coordination

+

Auto Release

+

'Next' coordination is not required from TL ADC to TL TCU for aircraft that are:
+a) Departing from a runway nominated in the ATIS; and
+b) Assigned the standard assignable level;
+c) Assigned a Procedural SID

+
+

Example

+

TL ADC -> TL TCU: "Next, DNGO05, runway 19"
+TL TCU -> TL ADC: "DNGO05, Assigned Heading Left 150, unrestricted"
+TL ADC -> TL TCU: "Assigned Heading Left 150, DNGO05"

+
+

The Standard Assignable level from TL ADC to TL TCU is the lower of F180 or the RFL.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/Williamtown/index.html b/aerodromes/classc/Williamtown/index.html new file mode 100644 index 000000000..3f9a71ab4 --- /dev/null +++ b/aerodromes/classc/Williamtown/index.html @@ -0,0 +1,4834 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Williamtown (YWLM) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Williamtown (YWLM)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Williamtown ADCWilly Tower118.300WLM_TWR
Williamtown SMCWilly Ground121.800WLM_GND
Williamtown ACDWilly Delivery130.350WLM_DEL
Williamtown ATIS134.450YWLM_ATIS
+

Airspace

+

WLM ADC owns the airspace within the WLM MIL CTR A (SFC-A050). This may be amended/released as required between WLM ADC and WLM TCU.

+
+

WLM ADC Airspace +

+
WLM ADC Airspace
+
+

Charts

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+

Coordination

+

Departures

+

'Next' coordination is not required from WLM ADC to WLM TCU for aircraft that are:
+a) Departing from a runway nominated in the ATIS; and
+b) Assigned the standard assignable level;
+c) Assigned a Procedural SID

+
+

Example

+

WLM ADC -> WLM TCU: "Next, MVP"
+WLM TCU -> WLM ADC: "MVP, Left Heading 010, Unrestricted"
+WLM ADC -> WLM TCU: "Left Heading 010, MVP"

+
+

The Standard Assignable level from WLM ADC to WLM TCU is the lower of F120 or the RFL.

+

Arrivals/Overfliers

+

Voiceless coordination is in place from WLM TCU to WLM ADC for arrivals cleared for an approach on to a runway nominated on the ATIS. All other aircraft and all overfliers must be heads-up coordinated as soon as practical.

+
+

Example

+

WLM TCU -> WLM ADC: "via WLM, ZULU, Close formation of 5, do you have any restrictions or requirements?”
+WLM ADC -> WLM TCU: "ZULU, no restrictions or requirements, A040"

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classc/img/CBCTY1.png b/aerodromes/classc/img/CBCTY1.png new file mode 100644 index 000000000..943da147b Binary files /dev/null and b/aerodromes/classc/img/CBCTY1.png differ diff --git a/aerodromes/classc/img/CBCTY2.png b/aerodromes/classc/img/CBCTY2.png new file mode 100644 index 000000000..ef58fe113 Binary files /dev/null and b/aerodromes/classc/img/CBCTY2.png differ diff --git a/aerodromes/classc/img/CBTWR.png b/aerodromes/classc/img/CBTWR.png new file mode 100644 index 000000000..4941b7c99 Binary files /dev/null and b/aerodromes/classc/img/CBTWR.png differ diff --git a/aerodromes/classc/img/CGTWR.png b/aerodromes/classc/img/CGTWR.png new file mode 100644 index 000000000..70dc6477a Binary files /dev/null and b/aerodromes/classc/img/CGTWR.png differ diff --git a/aerodromes/classc/img/CSTWR.png b/aerodromes/classc/img/CSTWR.png new file mode 100644 index 000000000..63f07dba2 Binary files /dev/null and b/aerodromes/classc/img/CSTWR.png differ diff --git a/aerodromes/classc/img/ENTWR.png b/aerodromes/classc/img/ENTWR.png new file mode 100644 index 000000000..7cc53772f Binary files /dev/null and b/aerodromes/classc/img/ENTWR.png differ diff --git a/aerodromes/classc/img/ISPEG1SID.png b/aerodromes/classc/img/ISPEG1SID.png new file mode 100644 index 000000000..fcc216c01 Binary files /dev/null and b/aerodromes/classc/img/ISPEG1SID.png differ diff --git a/aerodromes/classc/img/MLTCUairspace.png b/aerodromes/classc/img/MLTCUairspace.png new file mode 100644 index 000000000..56f2ebdf4 Binary files /dev/null and b/aerodromes/classc/img/MLTCUairspace.png differ diff --git a/aerodromes/classc/img/PHTWR.png b/aerodromes/classc/img/PHTWR.png new file mode 100644 index 000000000..651d2d5df Binary files /dev/null and b/aerodromes/classc/img/PHTWR.png differ diff --git a/aerodromes/classc/img/SYTWR.png b/aerodromes/classc/img/SYTWR.png new file mode 100644 index 000000000..5575e1cbe Binary files /dev/null and b/aerodromes/classc/img/SYTWR.png differ diff --git a/aerodromes/classc/img/adadc.png b/aerodromes/classc/img/adadc.png new file mode 100644 index 000000000..8f127843b Binary files /dev/null and b/aerodromes/classc/img/adadc.png differ diff --git a/aerodromes/classc/img/adclearancelimits.png b/aerodromes/classc/img/adclearancelimits.png new file mode 100644 index 000000000..4aeae4c7a Binary files /dev/null and b/aerodromes/classc/img/adclearancelimits.png differ diff --git a/aerodromes/classc/img/avctr.png b/aerodromes/classc/img/avctr.png new file mode 100644 index 000000000..a2d558d9d Binary files /dev/null and b/aerodromes/classc/img/avctr.png differ diff --git a/aerodromes/classc/img/bnadc.png b/aerodromes/classc/img/bnadc.png new file mode 100644 index 000000000..fc0098281 Binary files /dev/null and b/aerodromes/classc/img/bnadc.png differ diff --git a/aerodromes/classc/img/cbadc.png b/aerodromes/classc/img/cbadc.png new file mode 100644 index 000000000..02105a8c5 Binary files /dev/null and b/aerodromes/classc/img/cbadc.png differ diff --git a/aerodromes/classc/img/cgadc.png b/aerodromes/classc/img/cgadc.png new file mode 100644 index 000000000..bffac3e25 Binary files /dev/null and b/aerodromes/classc/img/cgadc.png differ diff --git a/aerodromes/classc/img/clrqbay.png b/aerodromes/classc/img/clrqbay.png new file mode 100644 index 000000000..2222687d7 Binary files /dev/null and b/aerodromes/classc/img/clrqbay.png differ diff --git a/aerodromes/classc/img/csadc.png b/aerodromes/classc/img/csadc.png new file mode 100644 index 000000000..48d0b5b3e Binary files /dev/null and b/aerodromes/classc/img/csadc.png differ diff --git a/aerodromes/classc/img/dnadc.png b/aerodromes/classc/img/dnadc.png new file mode 100644 index 000000000..1b499da83 Binary files /dev/null and b/aerodromes/classc/img/dnadc.png differ diff --git a/aerodromes/classc/img/dntcu.png b/aerodromes/classc/img/dntcu.png new file mode 100644 index 000000000..9c34c815d Binary files /dev/null and b/aerodromes/classc/img/dntcu.png differ diff --git a/aerodromes/classc/img/enadc.png b/aerodromes/classc/img/enadc.png new file mode 100644 index 000000000..1e3727e26 Binary files /dev/null and b/aerodromes/classc/img/enadc.png differ diff --git a/aerodromes/classc/img/esl_taxi_inbound.png b/aerodromes/classc/img/esl_taxi_inbound.png new file mode 100644 index 000000000..18a446f0e Binary files /dev/null and b/aerodromes/classc/img/esl_taxi_inbound.png differ diff --git a/aerodromes/classc/img/esl_taxi_outbound.png b/aerodromes/classc/img/esl_taxi_outbound.png new file mode 100644 index 000000000..99ecd81bc Binary files /dev/null and b/aerodromes/classc/img/esl_taxi_outbound.png differ diff --git a/aerodromes/classc/img/mladc.png b/aerodromes/classc/img/mladc.png new file mode 100644 index 000000000..e90584a9f Binary files /dev/null and b/aerodromes/classc/img/mladc.png differ diff --git a/aerodromes/classc/img/nwrotaryslots.png b/aerodromes/classc/img/nwrotaryslots.png new file mode 100644 index 000000000..8a3eb4594 Binary files /dev/null and b/aerodromes/classc/img/nwrotaryslots.png differ diff --git a/aerodromes/classc/img/phadc.png b/aerodromes/classc/img/phadc.png new file mode 100644 index 000000000..879b0ea1f Binary files /dev/null and b/aerodromes/classc/img/phadc.png differ diff --git a/aerodromes/classc/img/slottime.png b/aerodromes/classc/img/slottime.png new file mode 100644 index 000000000..866385fc0 Binary files /dev/null and b/aerodromes/classc/img/slottime.png differ diff --git a/aerodromes/classc/img/sunburycorridor.png b/aerodromes/classc/img/sunburycorridor.png new file mode 100644 index 000000000..435452a15 Binary files /dev/null and b/aerodromes/classc/img/sunburycorridor.png differ diff --git a/aerodromes/classc/img/thepier.png b/aerodromes/classc/img/thepier.png new file mode 100644 index 000000000..949c51b83 Binary files /dev/null and b/aerodromes/classc/img/thepier.png differ diff --git a/aerodromes/classc/img/tltcu.png b/aerodromes/classc/img/tltcu.png new file mode 100644 index 000000000..dc9456936 Binary files /dev/null and b/aerodromes/classc/img/tltcu.png differ diff --git a/aerodromes/classc/img/victor_routes.png b/aerodromes/classc/img/victor_routes.png new file mode 100644 index 000000000..f260474ba Binary files /dev/null and b/aerodromes/classc/img/victor_routes.png differ diff --git a/aerodromes/classc/img/wlmadc.png b/aerodromes/classc/img/wlmadc.png new file mode 100644 index 000000000..97e3061e5 Binary files /dev/null and b/aerodromes/classc/img/wlmadc.png differ diff --git a/aerodromes/classc/img/wlmapp.png b/aerodromes/classc/img/wlmapp.png new file mode 100644 index 000000000..a01211399 Binary files /dev/null and b/aerodromes/classc/img/wlmapp.png differ diff --git a/aerodromes/classc/img/wlmtcu.png b/aerodromes/classc/img/wlmtcu.png new file mode 100644 index 000000000..30d8323a6 Binary files /dev/null and b/aerodromes/classc/img/wlmtcu.png differ diff --git a/aerodromes/classc/img/wlmtwr.png b/aerodromes/classc/img/wlmtwr.png new file mode 100644 index 000000000..648185a39 Binary files /dev/null and b/aerodromes/classc/img/wlmtwr.png differ diff --git a/aerodromes/classc/img/ybbn_maneuvring_area_north.png b/aerodromes/classc/img/ybbn_maneuvring_area_north.png new file mode 100644 index 000000000..aaff477bc Binary files /dev/null and b/aerodromes/classc/img/ybbn_maneuvring_area_north.png differ diff --git a/aerodromes/classc/img/ybbn_maneuvring_area_south.png b/aerodromes/classc/img/ybbn_maneuvring_area_south.png new file mode 100644 index 000000000..da2fd8eb9 Binary files /dev/null and b/aerodromes/classc/img/ybbn_maneuvring_area_south.png differ diff --git a/aerodromes/classc/img/ybbn_taxi_routes.png b/aerodromes/classc/img/ybbn_taxi_routes.png new file mode 100644 index 000000000..c713242c7 Binary files /dev/null and b/aerodromes/classc/img/ybbn_taxi_routes.png differ diff --git a/aerodromes/classc/img/ymmlstdtaxi.png b/aerodromes/classc/img/ymmlstdtaxi.png new file mode 100644 index 000000000..b7519b9ce Binary files /dev/null and b/aerodromes/classc/img/ymmlstdtaxi.png differ diff --git a/aerodromes/classc/img/ypad_maneuvring_area.png b/aerodromes/classc/img/ypad_maneuvring_area.png new file mode 100644 index 000000000..e189ca955 Binary files /dev/null and b/aerodromes/classc/img/ypad_maneuvring_area.png differ diff --git a/aerodromes/classc/img/yssy_atis_example.png b/aerodromes/classc/img/yssy_atis_example.png new file mode 100644 index 000000000..5fdef0b5f Binary files /dev/null and b/aerodromes/classc/img/yssy_atis_example.png differ diff --git a/aerodromes/classc/img/yssy_maneuvring_area.png b/aerodromes/classc/img/yssy_maneuvring_area.png new file mode 100644 index 000000000..a0c19cbe6 Binary files /dev/null and b/aerodromes/classc/img/yssy_maneuvring_area.png differ diff --git a/aerodromes/classc/img/yssy_taxi_routes.png b/aerodromes/classc/img/yssy_taxi_routes.png new file mode 100644 index 000000000..66dda4dbc Binary files /dev/null and b/aerodromes/classc/img/yssy_taxi_routes.png differ diff --git a/aerodromes/classc/index.html b/aerodromes/classc/index.html new file mode 100644 index 000000000..0e697f4a2 --- /dev/null +++ b/aerodromes/classc/index.html @@ -0,0 +1,4605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Overview - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Overview

+ +

Local Instructions for all Class C towered aerodromes in Australia. For simulation purposes only.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Archerfield/index.html b/aerodromes/classd/Archerfield/index.html new file mode 100644 index 000000000..5346190dd --- /dev/null +++ b/aerodromes/classd/Archerfield/index.html @@ -0,0 +1,5112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Archerfield (YBAF) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Archerfield (YBAF)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Archerfield ADCArcher Tower118.100AF_TWR
Archerfield SMCArcher Ground129.300AF_GND
Archerfield ATIS120.900YBAF_ATIS
+
+

YSBK Maneuvering Area +

+
Maneuvering Area
+
+

Airspace

+

AF ADC is responsible for the Class D airspace in the AF CTR SFC to A015.

+
+

AF ADC Airspace +

+
AF ADC Airspace
+
+

Refer to Class D Tower Separation Standards for more information.

+

VFR Arrival Procedures

+

VFR aircraft should track via a VFR inbound point at A015 and be instructed as below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VFR Approach PointRWYs 04RWYs 22RWYs 10RWYs 28
TVT"Join Base RWY 04L, report CBRG""Join Base RWY 22R, report CBRG""Join Final RWY 10L, report CBRG""Join Downwind RWY 28R, maintain A015, report CBRG"
GON"Join Final RWY 04L""Join Downwind RWY 22R, maintain A015""Join Final RWY 10R""Join Downwind RWY 28L, maintain A015"
PKR"Join Base RWY 04R, report Logan Bridge""Join Base RWY 22L, report Logan Bridge""Join Base RWY 10R, report Logan Bridge""Join Base 28L, report Logan Bridge"
TAR"Join Base RWY 04R""Join Base RWY 22L""Join Downwind RWY 10R, maintain A015""Join Final RWY 28L"
+
+

Note

+

Aircraft joining downwind are instructed to maintain A015 for separation with aircraft departing the zone at A010. Once inbound aircraft are clear of the departure track, they should be "cleared visual approach".

+
+

VFR Departure Procedures

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Planned Departure Tracks"Intentions"Tracking Requirement
BTN 310 & 019 DEGNorthern DepartureTrack via WTBG
BTN 020 & 099 DEGEastern DepartureTrack via Gateway Motorway and Pacific Motorway Intersection (Not available when Rwy 22 active EXC if departing into Class C)
BTN 100 & 204 DEGSouthern DepartureTrack 135 DEG from Archerfield
BTN 205 & 309 DEGWestern DepartureDEP AF CTR on a track between 220 & 309. Acft must nominate outbound DEP track with TAXI call
OtherAs approved by ATC
+

VFR departures will depart the control zone at A010.

+

Aircraft should advise planned Departure Procedure to AF SMC with TAXI call and AF ADC with READY call.

+
+

Example

+

VPF: "Archer Ground, Cherokee VPF is on the Main Apron, solo, Western Departure, received information Alpha, request taxi"

+

VPF: "Archer Tower, Cherokee VPF is B8, runway 10 Left for Western Departure, ready"

+
+

Circuits

+

The circuit direction changes depending on time of day and runway being used.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDayNight
04RRight-
04LLeft-
22RRight-
22LLeft-
10RRight-
10LLeftLeft
28RRightRight
28LLeft-
+

Circuits are to be flown at A010.

+

ATIS

+

Runway Nomination

+

The ATIS must indicate the current runway config and nominate what each runway is being used for. This should be reflected on the ATIS as below:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayRWY Field
Single RWYALL OPERATIONS RWY (Number)
RWY 10/28RWY 10L/28R FOR ARRIVALS AND DEPARTURES NORTH; RWY 10R/28L FOR ARRIVALS AND DEPARTURES SOUTH
RWY 04RWY 04L FOR ARRIVALS AND DEPARTURES NORTH AND WEST; RWY 04R FOR ARRIVALS AND DEPARTURES SOUTH AND EAST
RWY 22RWY 22. EASTERN DEPARTURES NOT AVAILABLE. RWY 22R FOR ARRIVALS AND DEPARTURES NORTH AND WEST; RWY 22L FOR ARRIVALS SOUTH AND EAST AND DEPARTURES SOUTH
+

Approach Expectation

+

The APCH field should include EXP INST APCH when:
+ - the ceiling is at or below A029; or
+ - visibility is less than 5000m

+

Coordination

+

Departures

+

When aircraft planned via a CTA departure are ready for takeoff and expected to depart imminently, AF ADC shall seek release of the aircraft through a 'Next' call.

+
+

Example

+

AF ADC -> BN TCU: "Next, XMM, Runway 10L"
+BN TCU -> AF ADC: "XMM, Unrestricted"
+AF ADC -> BN TCU: "XMM"

+
+

The Standard Assignable level from AF ADC to BN TCU is the lower of A040 or the RFL, any other level must be prior coordinated.

+

Arrivals/Overfliers

+

BN TCU will heads-up coordinate arrivals/overfliers from Class C to AF ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to AF ADC, unless AF ADC nominates a restriction.
+VFR aircraft require a level readback.

+
+

Example

+

BN TCU -> AF ADC: "via TVT for the visual approach, UJE"
+AF ADC -> BN TCU: "UJE, visual approach"

+
+
+

Tip

+

Remember that IFR aircraft are only separated from other IFR or SVFR aircraft in class D. You should generally be able to issue a clearance for an approach and use other separation methods (visual separation, holding a departure on the ground) if separation is required with these aircraft.

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Avalon/index.html b/aerodromes/classd/Avalon/index.html new file mode 100644 index 000000000..cd65db3a7 --- /dev/null +++ b/aerodromes/classd/Avalon/index.html @@ -0,0 +1,4971 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Avalon (YMAV) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Avalon (YMAV)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Avalon ADCAvalon Tower120.100AV_TWR
Avalon ATIS118.200YMAV_ATIS
+

Airspace

+

AV ADC is responsible for the Class D Airspace within the AV CTR SFC to A025. This airspace may be released to ML TCU with the concurrence of both controllers.
+ML TCU is responsible for the Class E Airspace to the North, South, and Above the AV CTR.
+ML TCU is repsonsible for the Class G Airspace to the East of the AV CTR, and to the West of the AV CTR within 30 DME ML.
+YWE is responsible for the Class G Airspace to the West of the AV CTR outside 30 DME ML.
+YWE(WON) is responsible for the Class G Airspace to the South East of the AV CTR outside 30 DME ML.

+
+

AV ADC Airspace

+
+

Refer to Class D Tower Separation Standards for more information.

+

SID Selection

+

Aircraft planned via ML shall be assigned the JUSTY SID.

+

Aircraft not planned via ML, and tracking to the North East, shall be recleared via ML, and assigned the JUSTY SID.

+

All other IFR aircraft shall be assigned the Radar SID.

+

Circuit Direction

+ + + + + + + + + + + + + + + + + +
RunwayDirection
18Left
36Right
+

Coordination

+

ML TCU

+

Departures

+

'Next' coordination is not required to ML TCU for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; or
+ b) Assigned the standard assignable level; or
+ c) Assigned a Procedural SID

+

All other aircraft require a 'Next' call to ML TCU.

+
+

Example

+

AV ADC -> MDS: "Next, UJI, Runway 18"
+MDS -> AV ADC: "UJI, heading 030, unrestricted"
+AV ADC -> MDS: "Heading 030, UJI"

+
+

The Standard Assignable level from AV ADC to ML TCU is the lower of A040 or the RFL.

+

Arrivals/Overfliers

+

ML TCU will heads-up coordinate arrivals/overfliers from Class C to AV ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to AV ADC, unless AV ADC nominates a restriction.
+VFR aircraft will not be coordinated, and will need to receive their airways clearance from AV ADC.

+
+

Example

+

MDS -> AV ADC: "via TEMPL for the ILS-Y 18, JST631"
+AV ADC -> MDS: "JST631, ILS-Y 18"

+
+
+

Tip

+

Remember that IFR aircraft are only separated from other IFR or SVFR aircraft in class D. You should generally be able to issue a clearance for an approach and use other separation methods (visual separation, holding a departure on the ground) if separation is required with these aircraft.

+
+

Runway Change

+

Any Runway change must be prior coordinated to the relevant TCU Controller.

+

TCU Controller

+

When MDN and/or MDS are online, the relevant TCU controller is whoever is responsible for MDS.

+

YWE/WON

+

AV ADC only borders YWE/WON Class G airspace, and as such, no coordination is required between AV ADC and YWE/WON.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Bankstown/index.html b/aerodromes/classd/Bankstown/index.html new file mode 100644 index 000000000..62221a1f6 --- /dev/null +++ b/aerodromes/classd/Bankstown/index.html @@ -0,0 +1,5235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Bankstown (YSBK) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Bankstown (YSBK)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Bankstown ADCBankstown Tower132.800BK_TWR
Bankstown SMCBankstown Ground119.900BK_GND
Bankstown ATIS120.900YSBK_ATIS
+
+

YSBK Maneuvering Area +

+
Maneuvering Area
+
+

Airspace

+

BK ADC is responsible for the Class D airspace in the BK CTR SFC to A015.

+
+

BK ADC Airspace +

+
BK ADC Airspace
+
+

Refer to Class D Tower Separation Standards for more information.

+

Fixed-Wing Operations

+

VFR Inbound Procedures

+

VFR aircraft will report inbound at PSP or TWRN. They should be instructed to join the circuit as below:

+ + + + + + + + + + + + + + + + + + + + +
VFR Approach PointRWYs 29RWYs 11
PSP"Join right downwind runway 29R, maintain A015", then when abeam RWYs 11 threshold or clear of departing traffic, "Cleared visual approach""Join final runway 11L, report 3nm"
TWRN"Join crosswind runway 29R, maintain A015", then when abeam RWYs 11 threshold or clear of departing traffic, "Cleared visual approach""Join final runway 11L, report at Warwick Farm"
+
+

Note

+

Aircraft joining final in the RWY 11 direction are not assigned a level and are expected to commence a visual approach in accordance with the tracking instructions issued by ADC. Aircraft are required to enter the control zone at A010. There is no need to clear these aircraft for a visual approach.

+
+

VFR Outbound Procedures

+

VFR aircraft should report ready to BK ADC with their departure intentions. A takeoff clearance constitutes a clearance to depart the zone by extending the pilot's requested leg of the circuit. Aircraft departing the zone into class G airspace will transfer to area frequency upon leaving the zone, no explicit frequency transfer is given to these aircraft.

+

Aircraft departing a leg of the circuit will climb to and maintain the following levels until clear of the zone:
+RWY 29 direction: A010
+RWY 11 direction: A015

+

Circuits

+

The circuit direction changes depending on time of day and runway being used.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDayNight
11LLeft-
11CLeftRight
11RRight-
29LLeft-
29CRightLeft
29RRight-
+

Circuits to be flown at A010

+

Helicopter Operations

+

General

+

These procedures apply during hours of daylight only. During hours of darkness, all helicopters must revert to fixed-wing operations.

+

The Main Pad (abeam taxiway Mike) is treated like a runway and requires a takeoff/landing clearance. Helicopters are permitted to become airborne from a limited number of other locations on the aerodrome, such as taxiway November Two, and should be instructed to "report airborne" or "report on the ground".

+

Reporting Points

+

Three helicopter reporting points help keep helicopters segregated from other traffic.

+

CWST: Michels Patisserie located 1.2nm west of CNTH on the water pipeline
+CNTH: Northern end of Regents Park Railway Station, roughly 300 metres north of the water pipeline
+CSTH: Intersection of two creeks enclosing a sewage treatment works 2.1nm south of the aerodrome reference point

+

Inbound Procedures

+

Helicopters should track inbound at A007 via one of the normal inbound points (PSP or TWRN) or via Olympic Park and report to BK ADC at that point. In response, BK ADC should instruct the aircraft to track as below:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Inbound PointRWY 11 ConfigRWY 29 Config
PSP"Report CWST", then
"Join base main pad"
"Report CNTH", then
"Join base main pad"
TWRN"Report CSTH, A005", then
"Overfly midfield at A005, join downwind main pad"
"Report CSTH, A005", then
"Overfly midfield at A005, join downwind main pad"
Olympic Park"Report CWST", then
"Join base main pad"
"Report CNTH", then
"Join base main pad"
+
+

Note

+

Helicopters tracking via CSTH will pass over the runway complex midfield at A005 to join downwind. Be mindful of aircraft in the fixed-wing circuit and pass traffic information to both aircraft prior to the fixed-wing aircraft turning final.

+

Example:
+"LOI, traffic is a helicopter overflying the aerodrome to the north at A005, runway left, cleared touch and go"
+"YZD, traffic is a Cherokee turning final for runway left, overfly midfield at A005, join downwind main pad"

+
+

Outbound Procedures

+

Helicopters should track outbound via one of the helicopter reporting points at A007. Departures to the north must track via CWST when RWY 29s are in use and CNTH when RWY 11s are in use.

+

Helicopters shall report ready to BK ADC with their departure intentions. In response, BK ADC will clear the aircraft for takeoff and instruct them to track via the appropriate exit gate.

+
+

Example

+

YZD: "Bankstown Tower, helicopter YZD, main pad, for Choppers North departure, ready"
+BK ADC: "YZD, Bankstown Tower, depart Choppers North, main pad, cleared for takeoff"

+
+
+

Note

+

Helicopters tracking via CSTH will pass over the runway complex midfield at A005 to join downwind. Be mindful of aircraft in the fixed-wing circuit and pass traffic information to both aircraft prior to the helicopter becoming airborne.

+

Example:
+"XEL, traffic is a helicopter overflying the aerodrome to the south at A005, runway left, cleared touch and go"
+"YZD, traffic is a Cherokee turning final for runway left, depart Choppers South, main pad, cleared for takeoff"

+
+

Circuits

+

Circuits are conducted within the lateral confines of the fixed-wing circuit at A007, in the same direction as the current runway config. The termination point of the circuit is the Main Pad.

+
+

Example

+

BK ADC: "SUA, main pad, cleared stop and go"

+
+

ATIS

+

Runway Nomination

+

The ATIS must indicate the current runway config and nominate what each parallel runway is being used for. The northern runway (11L/29R) is primarily used for VFR arrivals and departures, the southern runway (11R/29L) for circuit training, and the centre runway for IFR arrivals/departures and VFR overflow.

+

This should be reflected on the ATIS as below:
+RWY 11L FOR ARRIVALS AND DEPARTURES; RWY 11R FOR CIRCUIT TRAINING; RWY 11C IN USE

+

Operational Info

+

When the crosswind component exceeds 15 knots, the OPR INFO field must include:
+CROSSWIND ALERT – DO NOT PASS THROUGH FINAL FOR YOUR ASSIGNED RUNWAY

+

Coordination

+

Departures

+

When the aircraft is ready for departure, Tower will coordinate with the relevant Class C sector above them for permission to release the aircraft into their CTA.

+
+

Example

+

BK ADC -> SY TCU: "Next, UJN, runway 29C"
+SY TCU -> BK ADC: "UJN, unrestricted"
+BK ADC -> SY TCU: "UJN"

+
+

The Standard Assignable level from BK ADC to SY TCU is A030, any other level must be prior coordinated.

+

Aircraft shall be instructed to contact SY TCU passing A015.

+

Arrivals/Overfliers

+

SY TCU will heads-up coordinate arrivals/overfliers from Class C to BK ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to BK ADC, unless BK ADC nominates a restriction.
+VFR aircraft require a level readback.

+
+

Example

+

SY TCU -> BK ADC: "via GRB, UJN"
+BK ADC -> SY TCU: "UJN, A010"

+
+
+

Tip

+

Remember that IFR aircraft are only separated from other IFR or SVFR aircraft in class D. You should generally be able to issue a clearance for an approach and use other separation methods (visual separation, holding a departure on the ground) if separation is required with these aircraft.

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Camden/index.html b/aerodromes/classd/Camden/index.html new file mode 100644 index 000000000..8aed2b718 --- /dev/null +++ b/aerodromes/classd/Camden/index.html @@ -0,0 +1,5141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Camden (YSCN) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Camden (YSCN)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Camden ADCCamden Tower120.100CN_TWR
Camden SMCCamden Ground121.900CN_GND
Camden ATIS125.100YSCN_ATIS
+
+

YSCN Maneuvering Area

+
Maneuvering Area
+
+

Airspace

+

CN ADC is responsible for the Class D airspace in the CN CTR SFC to A020.

+
+

CN ADC Airspace

+
CN ADC Airspace
+
+

Refer to Class D Tower Separation Standards for more information.

+

Departures

+

All aircraft must depart at A013 via an extended leg of the circuit. +Upon reaching 2NM CN, all VFR aircraft should monitor the appropriate area frequency (Sydney Approach). A frequency transfer will not be issued to VFR aircraft. +Departing IFR aircraft will receive a frequency transfer.

+

Depart On Climb

+

Some aircraft may request to leave the CTR on climb above A013. If there is no reported traffic above the zone and no conflicting traffic at A018, aircraft may be cleared to depart on climb.

+
+

Example

+

CN ADC: "PCN, runway 06, cleared for takeoff"
+PCN: "Runway 06, cleared for takeoff, PCN"

+

PCN: "PCN, request depart on climb"
+CN ADC: "PCN, depart on climb"

+
+

Arrivals

+

VFR Inbound Procedures

+

VFR aircraft should track via one of the VFR inbound points and be instructed as below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VFR Approach PointRWYs 06RWYs 24
BRY"Join Downwind RWY 06, Maintain A018, Report 2NM""Join Final RWY 24, Maintain A018, Report Oran Park (ONPK)"
MEG"Overfly Camden to join Mid-Field Crosswind RWY 06, Maintain A018, Report Overhead""Overfly Camden to join Mid-Field Crosswind RWY 24, Maintain A018, Report Overhead"
PIC"Overfly Camden to join Mid-Field Crosswind RWY 06, Maintain 1800ft, Report Overhead""Overfly Camden to join Mid-Field Crosswind RWY 24, Maintain A018, Report Overhead"
THK"Join Final RWY 06, Maintain A018, Report 3NM""Join Downwind RWY 24, Maintain A018, Report 2NM"
MYF"Join Base RWY 06, Maintain A018, Report 2NM""Join Base RWY 24, Maintain A018, Report 2NM"
+

When Aircraft are clear of conflicting traffic below, aircraft may "cleared visual approach".

+

When an aircraft reports at their specified report point (or on downwind), issue the aircraft its sequence in the circuit.

+
+

Example

+

"XEM, number 3 Runway 06, follow the C172 on base"

+
+

Instrument Approaches

+

The only instrument approach at YSCN is the RNP W approach. This approach commences OCTA and enters the Camden control zone.

+

SY TCU will not clear aircraft for the approach (as it commences OCTA) and will transfer aircraft to CN ADC at SCNWI. CN ADC shall issue airways clearance on first contact in accordance with the table below.

+ + + + + + + + + + + + + + + + + +
ScenarioClearance
Aircraft is visual & circuit traffic exists"Cleared RNP-W approach, not below A018"
Aircraft not visual or no circuit traffic"Cleared RNP-W approach, runway 06/24"
+
+

Note

+

The circuit altitude at YSCN is A013 and the overfly altitude is A018. Aircraft issued a restriction to descend not below A018 should be instructed to join the circuit once clear of traffic established in the circuit area.

+
+

Circuits

+

The circuit direction changes depending on time of day and runway being used.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDayNight
06LeftLeft
24RightRight
10 (Grass)Left-
28 (Grass)Right-
+

Circuits are flown at A013 (High Performance Aircraft: A018)

+

When an aircraft reports on downwind, indicate their position in the sequence (and give a follow instruction if the sequence has changed since the last circuit).

+
+

Example

+

JKA: "JKA, downwind, touch and go"
+CN ADC: "JKA, number 2"

+
+

ATIS

+

Approach Expectation

+

When there is more than SCT cloud on the YSCN METAR area below A035, the APCH field must include EXP INST APCH.

+

Coordination

+

Departures

+

CN ADC must advise SY TCU when the aircraft has called 'Ready'. In response to a ready call, SY TCU will issue a traffic statement.

+
+

Example

+

CN ADC -> SRI: "Ready, MHQ, Runway 06"
+SRI -> CN ADC: "MHQ, traffic is MEH, an IFR AC50, tracking SHL RAKSO SB2WI, A035, estimate RAKSO time 35" (or "No Reported IFR Traffic")
+CN ADC -> SRI: "Traffic is MEH tracking SHL RAKSO SB2WI A035, RAKSO at 35"

+

CN ADC: "MHQ, traffic is MEH, IFR AC50 tracking SHL RAKSO SB2WI at A035, estimating RAKSO at time 35, runway 06, cleared for takeoff"
+MHQ: "Runway 06, cleared for takeoff, MHQ"

+

CN ADC: "MHQ, contact Sydney Centre on 124.55"

+
+
+

Note

+

Note: Because aircraft enter Class G after departure, an airways clearance need not be issued by CN ADC. This will be done on first contact with Sydney TCU. +Therefore, a next call & departure instructions are not required. You must however, pass the above (ready) coordination & obtain a traffic statement.

+
+

Arrivals/Overfliers

+

SY TCU will coordinate inbound IFR aircraft. CN ADC is responsible for issuing a clearance into the CN CTR and for coordination with SY TCU in the event of a missed approach (or on completion of airwork if applicable).

+

SY TCU will NOT clear the aircraft for the approach.

+
+

Example

+

SRI -> CN ADC: “via RNP W, HRP”
+CN ADC -> SRI: “HRP”

+
+

CN ADC must issue an airways clearance to these aircraft on first contact.

+

IFR overflying YSCN

+

SRI will advise CN ADC of observed IFR aircraft overflying CN CTR below A025.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Hobart/index.html b/aerodromes/classd/Hobart/index.html new file mode 100644 index 000000000..aa5728429 --- /dev/null +++ b/aerodromes/classd/Hobart/index.html @@ -0,0 +1,5140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Hobart (YMHB) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+ +
+ + + +
+
+ + + + +

Hobart (YMHB)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Hobart ADCHobart Tower118.100HB_TWR
Hobart SMCHobart Ground121.700HB_GND
Hobart ATIS128.450YMHB_ATIS
+

Maneuvering Area Responsibility

+
+

YMHB Maneuvering Area

+
+

Airspace

+

HB ADC is responsible for the Class D airspace in the HB CTR:
+North of the Runway Centreline: SFC to A015
+South of the Runway Centreline: SFC to A025

+
+

HB ADC Airspace +

+
HB ADC Airspace
+
+

Refer to Class D Tower Separation Standards for more information.

+

SID Selection

+

Jet Aircraft planned via RIBLI, LATUM, or LAVOP, shall be assigned the Procedural SID that terminates at the appropriate waypoint.

+

Non-Jet Aircraft planned via RIBLI, KANLI, or LAVOP, shall be assigned the Procedural SID that terminates at the appropriate waypoint.

+

Other aircraft shall be assigned an appropriate Procedural SID or a visual departure.

+

ATIS

+

YMHB ATIS identifiers range from N to Y, as YMLT uses A through M.

+

Cambridge (YCBG)

+

Due to it's close proximity, HB ADC & SMC are responsible for clearances into and out of Cambridge (YCBG), which sits inside the Hobart Class D control zone.

+

Departures

+

Prior to leaving the apron, all outbound aircraft will establish communications with HB SMC for Airways Clearance.

+

All IFR Aircraft departing Cambridge shall be assigned a Visual Departure or one of Hobart's Procedural SIDs.

+
+

Note

+

Both VFR and IFR aircraft require a clearance to operate in Class D airspace (even if this is an implied clearance to depart a leg of the circuit). The examples below show an IFR aircraft departing.

+
+
+

Example

+

NDR: "Hobart Ground, NDR, for Devonport, Request Clearance"
+HB SMC: "NDR, Cleared to Devonport via KANLI flight plan route, KANLI3 Departure, Climb via SID A045, Squawk 4432"

+
+

When ready to taxi and prior to leaving the apron aircraft must contact HB ADC, advising intended runway for departure and receipt of YMHB ATIS, to obtain traffic information.

+
+

Example

+

NDR: "Hobart Tower, NDR, taxiing Cambridge Runway 32, received Hobart Information D"
+HB ADC: "NDR, No reported IFR traffic, report ready"
+NDR: "Wilco, NDR"

+
+

Takeoff clearances are not given. Aircraft will remain clear of the active runway and report ready to HB ADC. Aircraft must not enter an active runway or become airborne until departure instructions have been issued.

+
+

Example

+

NDR: "NDR, Ready"
+HB ADC: "NDR, track via the KANLI3 departure, report airborne"
+NDR: "Track via the KANLI3 departure, wilco, NDR"

+
+

Arrivals

+

Inbound VFR aircraft should be instructed to join a leg of the circuit and cleared for a visual approach (traffic permitting). In IMC, IFR aircraft will fly one of Hobart's instrument approaches until visual, then break off to circle to land.

+

As a landing clearance is not given, aircraft should instead be informed of any traffic operating on the aerodrome and instructed to report clear of the runway.

+
+

Example

+

UJA is an IFR Aero Commander who has been cleared the YMHB RNAV-Z RWY 30 approach by HB APP and handed off to HB ADC.
+UJA: "Hobart Tower, UJA"
+HB ADC: "UJA, Hobart Tower, report visual"
+UJA: "Wilco, UJA"

+

UJA: "UJA, visual"
+HB ADC: "UJA, track for final runway 30, no reported traffic, report clear of the runway"
+UJA: "Track for final runway 30, wilco, UJA"

+
+
+

Example

+

KLR is a VFR Cherokee who is tracking inbound on the Victor East VFR route.
+HB ADC: "KLR, enter the control zone tracking via the Victor East, A015, clearance limit Sorell"
+KLR: "Enter control zone tracking via the Victor East, A015, clearance limit Sorell, KLR"

+

KLR: "KLR, approaching Sorell"
+HB ADC: "KLR, join base runway 12, cleared visual approach, no reported traffic, report clear of the runway"
+KLR: "Join base runway 12, cleared visual approach, wilco, KLR"

+
+

VFR Operations

+

Circuit Direction

+ + + + + + + + + + + + + + + + + +
RunwayDirection
12Left
30Right
+

Inbound / Outbound

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VictorInboundOutbound
NorthwestCBV-CPA-RCH west of the Colebrook/Richmond Road to west abeam RADTWest abeam RADT-RCH-CPA-CBV west of the Richmond/Colebrook Road
NortheastCBV-CPA-Orielton-SORL east of Colebrook Road to CPA then Orielton east of Tasman HWY to SORLAs directed by ATC to SORL then Orielton east of Tasman HWY, thence east of Colebrook Rd east of CPA to CBV
EastDLY-SORL north of the Arthur HWYAs directed by ATC to SORL
SouthwestDRP to-YCBG west of Mt RumneyEest of Mt Rumney to DRP
SouthCREM-LAUD-YCBGLAUD-CREM
WestBOWB to Risdon Vale thence Cambridge townshipRisdon Vale thence BOWB
+
+

Victor Routes

+
+

Clearances for aircraft entering the CTR must be worded so as to leave no possibility for misinterpretation by the pilot.

+
+

Example

+

NDR: "Hobart Tower, NDR, CPA, A015, on the Victor Northwest, received Romeo, request clearance"
+HB ADC: "NDR, enter the CTR tracking via the Victor Northwest at A015."

+
+

Coordination

+

Departures

+

'Next' coordination is not required to HBA for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; and
+ b) Assigned the standard assignable level; and
+ c) Assigned a SID

+

All other aircraft require a 'Next' call to HBA.

+
+

Example

+

HB ADC -> HBA: "Next, ABC, runway 12"
+HBA -> HB ADC: "ABC, Heading 150 Visual, unrestricted"
+HB ADC -> HBA: "Heading 150 Visual, ABC"

+

HB ADC: "ABC, Assigned heading right 150 Visual, Runway 12, Cleared for Takeoff"
+ABC: "Right heading 150 Visual, Runway 12, Cleared for Takeoff, ABC"

+
+

The HBA controller can suspend/resume Auto Release at any time, with the concurrence of HB ADC.

+
+

Note

+

"Next" Coordination to HBA is not required for aircraft assigned a Procedural SID and the Standard Assignable Level.

+
+

HB SMC shall give heads-up coordination to HBA controller prior to the issue of the following clearances:
+a) VFR Departures
+b) Aircraft using a runway not on the ATIS

+

The Standard Assignable level from HB ADC to HBA is:
+For IFR Aircraft: A080
+For VFR Aircraft: The lower of A045 or the RFL.

+

Arrivals/Overfliers

+

HBA will heads-up coordinate arrivals/overfliers from Class C to HB ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to HB ADC, unless HB ADC nominates a restriction.
+VFR aircraft require a level readback.

+
+

Example

+

HBA -> HB ADC: "via BAVUR for the RNAV-W RWY 12, QJE1551"
+HB ADC -> HBA: "QJE1551, RNP-W RWY 12"

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Jandakot/index.html b/aerodromes/classd/Jandakot/index.html new file mode 100644 index 000000000..f3320b584 --- /dev/null +++ b/aerodromes/classd/Jandakot/index.html @@ -0,0 +1,5171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Jandakot (YPJT) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Jandakot (YPJT)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Jandakot ADCJandakot Tower118.100JT_TWR
Jandakot SMCJandakot Ground124.300JT_GND
Jandakot ATIS128.650YPJT_ATIS
+
+

YPJT Maneuvering Area +

+
Maneuvering Area
+
+

Airspace

+

JT ADC is responsible for the Class D airspace in the JT CTR SFC to A015.

+
+

JT ADC Airspace +

+
JT ADC Airspace
+
+

Fixed-Wing Operations

+

VFR Arrivals

+

VFR aircraft will report inbound at BOAT, POWR, OAKF or RUSS at A015. JT ADC will instruct aircraft to maintain A015 or remain outside the control zone (workload permitting). Aircraft will then report again at ADWD when inbound from BOAT or POWR, or FDL when inbound from OAKF or RUSS. They should then be instructed to join the circuit as below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
VFR Approach PointRWYs 06RWYs 24RWY 12RWY 30
ADWD"Join base runway 06L""Join right downwind runway 24R, maintain A015", until the aircraft are clear of RWY 24R departures via Fiona Stanley Hospital and FREM, then "Cleared Visual Approach""Join final runway 12""Join downwind ruwnay 30, maintain A015", until the aircraft is clear of RWY 30 departures via YGB, then "Cleared Visual Approach"
FDL"Join downwind runway 06L, maintain A015". Aircraft should fly overhead the airfield between the control tower and the upwind end of the runway and join the circuit. Once established in the circuit, "Cleared visual approach""Join right downwind runway 24R, maintain A015". Aircraft should fly overhead the airfield between the control tower and the upwind end of the runway and join the circuit. Once established in the circuit, "Cleared visual approach""Join right downwind runway 12""Join final runway 30"
+

All aircraft will arrive on runway 06L/24R or 12/30.

+
+

Note

+

Circuit joining instructions given without an assigned altitude imply clearance to conduct the visual approach. There is no need to clear these aircraft for a visual approach.

+
+

VFR Departures

+

VFR aircraft should report ready to JT ADC with their departure intentions. A takeoff clearance constitutes a clearance to depart the zone by extending the pilot's requested leg of the circuit. Aircraft departing the zone into class G airspace will transfer to area frequency upon leaving the zone, no explicit frequency transfer is given to these aircraft.

+

Aircraft departing a leg of the circuit will climb to and maintain the following levels until clear of the zone:
+All runways: A010

+

VFR aircraft will depart via set outbound departure routes. Aircraft will track extended circuit legs to the departure point. These departure points include: YGB, FREM via Fiona Stanley Hospital, and SHOP.

+

Departures via FREM and YGB will depart on runway 06L/24R. Runway 06R/24L is used for circuit traffic and departures via SHOP.

+

IFR Arrivals

+

PH TCU will coordinate all IFR arrivals in accordance with coordination procedures.

+

IFR Departures

+

All IFR Departures must be assigned the most appropriate SID in accordance with the aircraft's direction of flight.

+ + + + + + + + + + + + + + + + + + + + + +
DirectionSID
South/WestTONEG
North/North-westISPET
East/North-eastSCARP
+

Circuits

+

The circuit direction changes depending on tower opening hours and runway being used.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayTower OpenTower Closed
06LLeftRight
06RRight-
24LLeft-
24RRightLeft
12LeftLeft
30LeftLeft
+

Circuits to be flown at A010

+

Helicopter Operations

+

General

+

Unless otherwise depicted in the ERSA FAC YPJT, all helicopters must comply with fixed wing procedures.

+

Circuits

+

Circuits are conducted within the lateral confines of the fixed-wing circuit at A008, in the same direction as the current runway config. The termination point of the circuit is the Main Pad.

+

ATIS

+

Runway Nomination

+

The ATIS must indicate the current runway config and nominate what each parallel runway is being used for. The northern runway (06L/24R) is primarily used for VFR arrivals and departures, the southern runway (06R/24L) for circuit training and departures via SHOP, and the cross runway (12/30) for arrivals/departures when weather is unsuitable for parallel rwunay operations.

+

This should be reflected on the ATIS as below:
+RWY 06R FOR CIRCUITS AND DEPARTURES VIA ARMADALE SHOPS; RWY 06L FOR ARRIVALS AND ALL OTHER DEPARTURES
+RWY 24L FOR CIRCUITS AND DEPARTURES VIA ARMADALE SHOPS; RWY 24R FOR ARRIVALS AND ALL OTHER DEPARTURES

+

When PH RWY 03 is in operation, the ATIS should include: +DUE PERTH DUTY RUNWAY 03, CAUTION WAKE TURBULANCE

+

Coordination

+

Next Call

+

When the aircraft is ready for departure, JT ADC will coordinate with the relevant PH TCU controller above them for permission to release the aircraft into their CTA.

+
+

Example

+

JT ADC -> PH TCU: "Next, FD420, runway 24R"
+PH TCU -> JT ADC: "FD420, Unrestricted"
+JT ADC -> PH TCU: "FD420"

+
+

The Standard Assignable level from JT ADC to PH TCU is the lower of A030 or the RFL, any other level must be prior coordinated.

+

Arrivals/Overfliers

+

PH TCU will heads-up coordinate arrivals/overfliers from Class C to JT ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to JT ADC, unless JT ADC nominates a restriction.
+VFR aircraft require a level readback.

+
+

Example

+

PH TCU -> JT ADC: "via RNAV-Z RWY 06L, FD416, circling to land RWY 24R"
+JT ADC -> PH TCU: "FD416, RNAV-Z RWY 06L with a circle to land RWY 24R"

+
+
+

Tip

+

Remember that IFR aircraft are only separated from other IFR or SVFR aircraft in class D. You should generally be able to issue a clearance for an approach and use other separation methods (visual separation, holding a departure on the ground) if separation is required with these aircraft.

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Launceston/index.html b/aerodromes/classd/Launceston/index.html new file mode 100644 index 000000000..cc8921583 --- /dev/null +++ b/aerodromes/classd/Launceston/index.html @@ -0,0 +1,4979 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Launceston (YMLT) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Launceston (YMLT)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Launceston ADCLauny Tower118.700LT_TWR
Launceston ATIS134.750YMLT_ATIS
+

Maneuvering Area Responsibility

+
+

YMLT Maneuvering Area

+
+

Airspace

+

LT ADC is responsible for the Class D airspace in the LT CTR SFC to A015.

+
+

Launceston Tower Airspace

+
+

Refer to Class D Tower Separation Standards for more information.

+

SID Selection

+

Aircraft planned via MIKIS, TASUM, or VEKLO shall be assigned the relevant Procedural SID.

+

Aircraft planned via IRSOM, MORGO, ONAGI, VIMAP, NUNPA, or MOTRA, departing Runway 32L, shall be assigned the relevant ALPHA Procedural SID.

+

Aircraft planned via ONAGI, VIMAP, NUNPA, or MOTRA, departing Runway 14R, shall be assigned the relevant BRAVO Procedural SID.

+

Non-Jet Aircraft planned via IRSOM, ONAGI, or MORGO may be assigned the relevant CHARLIE Procedural SID on pilot request.

+

Aircraft not planned via any of the above waypoints, shall be recleared via the most appropriate one, and assigned the Procedural SID.

+

Aircraft unable to accept a SID, or that cannot practically accept amended routing via the above points, shall be assigned the RADAR SID.

+

ATIS

+

YMLT ATIS identifiers range from A to M, as YMHB uses N through Y.

+

VFR Operations

+

Circuit Direction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDayNight
14LLeft-
14RRightRight
32LLeftLeft
32RRight-
18Left-
36Left-
+

Coordination

+

Departures

+

'Next' coordination is not required to LTA for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; and
+ b) Assigned the standard assignable level; and
+ c) Assigned a SID

+

All other aircraft require a 'Next' call to LTA.

+
+

Example

+

LT ADC -> LTA: "Next, ABC, runway 14L"
+LTA -> LT ADC: "ABC, Heading 150 Visual, unrestricted"
+LT ADC -> LTA: "Heading 150 Visual, ABC"

+

LT ADC: "ABC, turn right heading 150 Visual, Runway 14L, Cleared for Takeoff"
+ABC: "Right heading 150 Visual, Runway 12, Cleared for Takeoff, ABC"

+
+

The LTA controller can suspend/resume Auto Release at any time, with the concurrence of LT ADC.

+

LT ADC shall give heads-up coordination to LTA controller prior to the issue of the following clearances:
+a) VFR Departures
+b) Aircraft using a runway not on the ATIS

+

The Standard Assignable level from LT ADC to LTA is:
+For IFR Aircraft: A080
+For VFR Aircraft: The lower of A045 or the RFL.

+

Arrivals/Overfliers

+

LTA will heads-up coordinate arrivals/overfliers from LTA CTA to LT ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to LT ADC, unless LT ADC nominates a restriction.
+VFR aircraft require a level readback.

+
+

Example

+

LTA -> LT ADC: "via IRSOM for the DGA, TFW"
+LT ADC -> LTA: "TFW, DGA"

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Mackay/index.html b/aerodromes/classd/Mackay/index.html new file mode 100644 index 000000000..3a06dc77e --- /dev/null +++ b/aerodromes/classd/Mackay/index.html @@ -0,0 +1,4862 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Mackay (YBMK) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Mackay (YBMK)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Mackay ADCMackay Tower124.500MK_TWR
Mackay SMCMackay Ground121.700MK_GND
Mackay ATIS128.000YBMK_ATIS
+

Airspace

+

MK ADC is responsible for the Class D airspace in the MK CTR SFC to A010.

+
+

MK ADC Airspace

+
+

Refer to Class D Tower Separation Standards for more information.

+

Coordination

+

Departures

+

Auto Release

+

'Next' coordination is not required to MKA for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; and
+ b) Assigned the standard assignable level; and
+ c) Assigned a Procedural SID

+
+

Example

+

MK ADC -> MKA: "Next, ABC, runway 14"
+MKA -> MK ADC: "ABC, Heading 150 Visual, unrestricted"
+MK ADC -> MKA: "Heading 150 Visual unrestricted, ABC"

+
+

The TCU controller can suspend/resume Auto Release at any time, with the concurrence of MKA.

+

The Standard Assignable level from MKADC to MKA is the lower of A060 or the RFL.

+

SMC

+

The controller assuming responsibility of SMC shall give heads-up coordination to MKA prior to the issue of the following clearances:

+
    +
  • VFR Departures
  • +
  • Aircraft using a runway not on the ATIS
  • +
+

Arrivals/Overfliers

+

MKA will heads-up coordinate arrivals/overfliers from Class C to MK ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to MK ADC, unless MK ADC nominates a restriction.
+VFR aircraft require a level readback.

+
+

Example

+

MKA -> MK ADC: "Via BAVAM for the RNP RWY 32, VOZ1164”
+MK ADC -> MKA: "VOZ1164, RNP RWY 32"

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Moorabbin/index.html b/aerodromes/classd/Moorabbin/index.html new file mode 100644 index 000000000..6ffc27cfb --- /dev/null +++ b/aerodromes/classd/Moorabbin/index.html @@ -0,0 +1,4972 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Moorabbin (YMMB) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Moorabbin (YMMB)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Moorabbin ADCMoorabbin Tower118.100MB_TWR
Moorabbin SMCMoorabbin Ground134.250MB_GND
Moorabbin ATIS120.900YMMB_ATIS
+

Airspace

+

MB ADC is responsible for the Class D airspace in the MB CTR SFC to A025.

+
+

MB ADC Airspace +

+
MB ADC Airspace
+
+

Refer to Class D Tower Separation Standards for more information.

+

Runway 04/22

+

Runway 04/22 is not to be used as an active runway. Used for emergencies only

+

VFR Inbound Procedures

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VFR Approach PointRWY 13RWY 17RWY 31RWY 35
BTOJoin final 13RJoin base 17RJoin downwind 31LJoin oblique downwind 35L
BAWJoin base 13RJoin base 17RJoin oblique downwind 31LJoin base 35L
CARRJoin downwind 13RJoin downwind 17RJoin oblique base 31LJoin final 35L
GMHJoin downwind 13LJoin base 17LJoin oblique base 31RJoin base 35R
ACEJoin base 13LJoin oblique base 17LJoin base 31RJoin oblique downwind 35R
+

Circuits

+

Circuits are to be flown at A010.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDayNight
13LLeftLeft
13RRight-
31LLeft-
31RRightRight
17LLeftLeft
17RRight-
35LLeft-
35RRightRight
+

Coordination

+

Departures

+

Departures in to ML TCU Class C airspace require a "Next" call, where ML TCU will provide the cleared level. There is no standard assignable level.

+
+

Example

+

MB ADC -> MDS: "Next, SGE"
+MDS -> MB ADC: "SGE, A060"
+MB ADC -> MDS: "A060, SGE"

+
+

Departing aircraft will be cleared to leave and re-enter controlled airspace on climb to their assigned level, due to the structure of the Class C airspace around YMMB.

+
+

Example

+

MB ADC: "SGE, Cleared to leave and re-enter controlled airspace climbing to A060, no reported IFR traffic. Contact Melbourne Departures on 129.4"
+SGE: "Cleared to leave and re-enter controlled airspace climbing to A060, Departures 129.4, SGE"

+
+

Arrivals/Overfliers

+

ML TCU will heads-up coordinate arrivals/overfliers from Class C to MB ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to MB ADC, unless MB ADC nominates a restriction.
+VFR aircraft will not be coordinated, and will need to receive their airways clearance from MB ADC.

+
+

Example

+

MDS -> MB ADC: "To the west, PLE, for the NDB-A"
+MB ADC -> MDS: "PLE, NDB-A"

+
+
+

Tip

+

Remember that IFR aircraft are only separated from other IFR or SVFR aircraft in class D. Use other separation methods, such as holding a departure on the ground, if separation is required with these aircraft.

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Parafield/index.html b/aerodromes/classd/Parafield/index.html new file mode 100644 index 000000000..f9782a747 --- /dev/null +++ b/aerodromes/classd/Parafield/index.html @@ -0,0 +1,5015 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Parafield (YPPF) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Parafield (YPPF)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Parafield ADCParafield Tower118.700PF_TWR
Parafield SMCParafield Ground119.900PF_GND
Parafield ATIS120.900YPPF_ATIS
+
+

YPPF Maneuvering Area +

+
Maneuvering Area
+
+

Airspace

+

PF ADC is responsible for the Class D airspace in the PF CTR SFC to A015.

+
+

PF ADC Airspace +

+
PF ADC Airspace
+
+

Circuits

+

Circuits to be flown at A010

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RunwayDayNight
03LLeftLeft
03RRight-
21LLeft-
21RRightRight
08LLeft-
08RRight-
26LLeft-
26RRight-
+

VFR Inbound Procedures

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
VFR Approach PointRWYs 03RWYs 21RWYs 08RWYs 26
OHBJoin base (or downwind) RWY 21RJoin base (or downwind) RWY 03LJoin final RWY 08LJoin downwind RWY 26R
DMWJoin downwind RWY 03RJoin 3NM final RWY 21LJoin downwind RWY 08LJoin final RWY 26R
+
+

Note

+

Visually monitor all aircraft to ensure tracking South of Bolivar Strobe, to ensure aircraft remain outside of Edinburgh CTR. +

+Bolivar +

+
+

ATIS

+

Operational Info

+

ATIS broadcast BY DAY shall follow the format:
+RWY 21R (OR 03L) FOR ARRS & DEPS WEST, RWY 21L (OR 03R) ARRS & DEPS EAST
+OR
+RWY 26R (OR 08L) FOR ARRS & DEPS, RWY 26L (OR 08R) FOR CCT TRAINING

+

ATIS broadcast BY NIGHT shall follow the format:
+RWY 21R (OR 03L) FOR ALL OPERATIONS

+

Approach Expectation

+

The APCH field should include EXP INST APCH when:
+ - the ceiling is at or below A020; or
+ - visibility is less than 5000m

+

Coordination

+

Departures

+

When the aircraft is ready for departure, PF ADC will coordinate with the relevant Class C sector above them for permission to release the aircraft into their CTA.

+
+

Example

+

PF ADC -> AAW: "Next, XMM, 03L"
+AAW -> PF ADC: "XMM, Heading 020, unrestricted"
+PF ADC -> AAW: "Heading 020, XMM"

+
+

The Standard Assignable level from PF ADC to AD TCU is the lower of A030 or the RFL, any other level must be prior coordinated.

+

Arrivals

+

AD TCU will heads-up coordinate arrivals/overfliers from Class C to PF ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to PF ADC, unless PF ADC nominates a restriction.
+VFR aircraft require a level readback.

+
+

Example

+

AAW -> PF ADC: "via PAL, YTS"
+PF ADC -> AAW: "YTS, A010"

+
+
+

Tip

+

Remember that IFR aircraft are only separated from other IFR or SVFR aircraft in class D. You should generally be able to issue a clearance for an approach and use other separation methods (visual separation, holding a departure on the ground) if separation is required with these aircraft.

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/Rockhampton/index.html b/aerodromes/classd/Rockhampton/index.html new file mode 100644 index 000000000..5f11bcd18 --- /dev/null +++ b/aerodromes/classd/Rockhampton/index.html @@ -0,0 +1,4862 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Rockhampton (YBRK) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Rockhampton (YBRK)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Rockhampton ADCRocky Tower118.100RK_TWR
Rockhampton SMCRocky Ground121.800RK_GND
Rockhampton ATIS128.500YBRK_ATIS
+

Airspace

+

RK ADC is responsible for the Class D airspace in the RK CTR SFC to A010.

+
+

RK ADC Airspace

+
+

Refer to Class D Tower Separation Standards for more information.

+

Coordination

+

Departures

+

Auto Release

+

'Next' coordination is not required to RKA for aircraft that are:
+ a) Departing from a runway nominated on the ATIS; and
+ b) Assigned the standard assignable level; and
+ c) Assigned a Procedural SID

+
+

Example

+

RK ADC -> RKA: "Next, VJE"
+RKA -> RK ADC: "VJE, Track Extended Centreline, Unrestricted"
+RK ADC -> RKA: "Track Extended Centreline, VJE"

+
+

The TCU controller can suspend/resume Auto Release at any time, with the concurrence of RKA.

+

The Standard Assignable level from MK/RK ADC to MKA/RKA is the lower of A060 or the RFL.

+

MK/RK SMC

+

The controller assuming responsibility of SMC shall give heads-up coordination to RKA controller prior to the issue of the following clearances:

+
    +
  • VFR Departures
  • +
  • Aircraft using a runway not on the ATIS
  • +
+

Arrivals/Overfliers

+

RKA will heads-up coordinate arrivals/overfliers from Class C to RK ADC.
+IFR aircraft will be cleared for the coordinated approach (Instrument or Visual) prior to handoff to RK ADC, unless RK ADC nominates a restriction.
+VFR aircraft require a level readback.

+
+

Example

+

RKA -> RK ADC: "Via SARUS for the visual approach, VJN”
+RK ADC -> RKA: "VJN, visual approach"

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/classd/img/AVTWR.png b/aerodromes/classd/img/AVTWR.png new file mode 100644 index 000000000..77d6d4cbc Binary files /dev/null and b/aerodromes/classd/img/AVTWR.png differ diff --git a/aerodromes/classd/img/BKTWR.png b/aerodromes/classd/img/BKTWR.png new file mode 100644 index 000000000..b959b4028 Binary files /dev/null and b/aerodromes/classd/img/BKTWR.png differ diff --git a/aerodromes/classd/img/HBTWR.png b/aerodromes/classd/img/HBTWR.png new file mode 100644 index 000000000..af33657d0 Binary files /dev/null and b/aerodromes/classd/img/HBTWR.png differ diff --git a/aerodromes/classd/img/IMCminlvl.png b/aerodromes/classd/img/IMCminlvl.png new file mode 100644 index 000000000..5f0a394c9 Binary files /dev/null and b/aerodromes/classd/img/IMCminlvl.png differ diff --git a/aerodromes/classd/img/JTTWR.png b/aerodromes/classd/img/JTTWR.png new file mode 100644 index 000000000..ed2a96efb Binary files /dev/null and b/aerodromes/classd/img/JTTWR.png differ diff --git a/aerodromes/classd/img/LTTWR.png b/aerodromes/classd/img/LTTWR.png new file mode 100644 index 000000000..99bef5ff0 Binary files /dev/null and b/aerodromes/classd/img/LTTWR.png differ diff --git a/aerodromes/classd/img/MKTWR.png b/aerodromes/classd/img/MKTWR.png new file mode 100644 index 000000000..ebb1e1abb Binary files /dev/null and b/aerodromes/classd/img/MKTWR.png differ diff --git a/aerodromes/classd/img/MKairspace.png b/aerodromes/classd/img/MKairspace.png new file mode 100644 index 000000000..a1b0a2560 Binary files /dev/null and b/aerodromes/classd/img/MKairspace.png differ diff --git a/aerodromes/classd/img/MLTCUairspace.png b/aerodromes/classd/img/MLTCUairspace.png new file mode 100644 index 000000000..56f2ebdf4 Binary files /dev/null and b/aerodromes/classd/img/MLTCUairspace.png differ diff --git a/aerodromes/classd/img/PFTWR.png b/aerodromes/classd/img/PFTWR.png new file mode 100644 index 000000000..22a437879 Binary files /dev/null and b/aerodromes/classd/img/PFTWR.png differ diff --git a/aerodromes/classd/img/RKTWR.png b/aerodromes/classd/img/RKTWR.png new file mode 100644 index 000000000..c2b5f96a4 Binary files /dev/null and b/aerodromes/classd/img/RKTWR.png differ diff --git a/aerodromes/classd/img/RKairspace.png b/aerodromes/classd/img/RKairspace.png new file mode 100644 index 000000000..feb5e2995 Binary files /dev/null and b/aerodromes/classd/img/RKairspace.png differ diff --git a/aerodromes/classd/img/TRI.jpg b/aerodromes/classd/img/TRI.jpg new file mode 100644 index 000000000..81814e2eb Binary files /dev/null and b/aerodromes/classd/img/TRI.jpg differ diff --git a/aerodromes/classd/img/YBAF_ManMapB.PNG b/aerodromes/classd/img/YBAF_ManMapB.PNG new file mode 100644 index 000000000..26d2497c8 Binary files /dev/null and b/aerodromes/classd/img/YBAF_ManMapB.PNG differ diff --git a/aerodromes/classd/img/YBAF_Vatsys.PNG b/aerodromes/classd/img/YBAF_Vatsys.PNG new file mode 100644 index 000000000..2cad7e22f Binary files /dev/null and b/aerodromes/classd/img/YBAF_Vatsys.PNG differ diff --git a/aerodromes/classd/img/YBAS_airspace.png b/aerodromes/classd/img/YBAS_airspace.png new file mode 100644 index 000000000..f65d99bcb Binary files /dev/null and b/aerodromes/classd/img/YBAS_airspace.png differ diff --git a/aerodromes/classd/img/YSCN_ManMap.PNG b/aerodromes/classd/img/YSCN_ManMap.PNG new file mode 100644 index 000000000..34cb89502 Binary files /dev/null and b/aerodromes/classd/img/YSCN_ManMap.PNG differ diff --git a/aerodromes/classd/img/YSCN_Vatsys.PNG b/aerodromes/classd/img/YSCN_Vatsys.PNG new file mode 100644 index 000000000..dff48d4bc Binary files /dev/null and b/aerodromes/classd/img/YSCN_Vatsys.PNG differ diff --git a/aerodromes/classd/img/avctr.png b/aerodromes/classd/img/avctr.png new file mode 100644 index 000000000..a2d558d9d Binary files /dev/null and b/aerodromes/classd/img/avctr.png differ diff --git a/aerodromes/classd/img/bolivar.png b/aerodromes/classd/img/bolivar.png new file mode 100644 index 000000000..df0c68558 Binary files /dev/null and b/aerodromes/classd/img/bolivar.png differ diff --git a/aerodromes/classd/img/hbadc.png b/aerodromes/classd/img/hbadc.png new file mode 100644 index 000000000..9e3bb8cf5 Binary files /dev/null and b/aerodromes/classd/img/hbadc.png differ diff --git a/aerodromes/classd/img/hbtwr_profile.png b/aerodromes/classd/img/hbtwr_profile.png new file mode 100644 index 000000000..817bdea25 Binary files /dev/null and b/aerodromes/classd/img/hbtwr_profile.png differ diff --git a/aerodromes/classd/img/lttwr_profile.png b/aerodromes/classd/img/lttwr_profile.png new file mode 100644 index 000000000..a55615311 Binary files /dev/null and b/aerodromes/classd/img/lttwr_profile.png differ diff --git a/aerodromes/classd/img/mbairspace.png b/aerodromes/classd/img/mbairspace.png new file mode 100644 index 000000000..324dca016 Binary files /dev/null and b/aerodromes/classd/img/mbairspace.png differ diff --git a/aerodromes/classd/img/r574.png b/aerodromes/classd/img/r574.png new file mode 100644 index 000000000..575a8107a Binary files /dev/null and b/aerodromes/classd/img/r574.png differ diff --git a/aerodromes/classd/img/victor_routes.png b/aerodromes/classd/img/victor_routes.png new file mode 100644 index 000000000..f260474ba Binary files /dev/null and b/aerodromes/classd/img/victor_routes.png differ diff --git a/aerodromes/classd/img/ymhb_maneuvring_area.png b/aerodromes/classd/img/ymhb_maneuvring_area.png new file mode 100644 index 000000000..19bc66cd5 Binary files /dev/null and b/aerodromes/classd/img/ymhb_maneuvring_area.png differ diff --git a/aerodromes/classd/img/ymlt_maneuvring_area.png b/aerodromes/classd/img/ymlt_maneuvring_area.png new file mode 100644 index 000000000..8d785e882 Binary files /dev/null and b/aerodromes/classd/img/ymlt_maneuvring_area.png differ diff --git a/aerodromes/classd/img/ypjt_maneuvring_area.png b/aerodromes/classd/img/ypjt_maneuvring_area.png new file mode 100644 index 000000000..bff658af8 Binary files /dev/null and b/aerodromes/classd/img/ypjt_maneuvring_area.png differ diff --git a/aerodromes/classd/img/yppf_maneuvring_area.png b/aerodromes/classd/img/yppf_maneuvring_area.png new file mode 100644 index 000000000..392c745f2 Binary files /dev/null and b/aerodromes/classd/img/yppf_maneuvring_area.png differ diff --git a/aerodromes/classd/img/ysbk_maneuvring_area.png b/aerodromes/classd/img/ysbk_maneuvring_area.png new file mode 100644 index 000000000..61b7e7c7f Binary files /dev/null and b/aerodromes/classd/img/ysbk_maneuvring_area.png differ diff --git a/aerodromes/classd/index.html b/aerodromes/classd/index.html new file mode 100644 index 000000000..0e07c0a36 --- /dev/null +++ b/aerodromes/classd/index.html @@ -0,0 +1,4605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Overview - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Overview

+ +

Local Instructions for all Class D towered aerodromes in Australia. For simulation purposes only.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/index.html b/aerodromes/index.html new file mode 100644 index 000000000..65e6c89e0 --- /dev/null +++ b/aerodromes/index.html @@ -0,0 +1,4603 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Overview - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Overview

+ +

Local Instructions for all towered aerodromes in Australia. For simulation purposes only.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/procedural/Albury/index.html b/aerodromes/procedural/Albury/index.html new file mode 100644 index 000000000..655a41385 --- /dev/null +++ b/aerodromes/procedural/Albury/index.html @@ -0,0 +1,4824 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Albury (YMAY) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Albury (YMAY)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Albury ADCAlbury Tower123.250AY_TWR
Albury SMCAlbury Ground121.800AY_GND
Albury ATISN/A133.850YMAY_ATIS
+

Airspace

+
+

AY ADC Airspace +

+
AY ADC Airspace
+
+

AY ADC is responsible for the Class D airspace in the AY CTR SFC to A045.

+

Refer to Class D Tower Separation Standards for more information.

+

Surveillance

+

Surveillance coverage can be expected to be available at all levels in the AY CTR. Although AY ADC is not permitted to use surveillance for separation, ELW(BLA) may assist by establishing surveillance separation standards via coordination

+

Coordination

+

Departures

+

A 'Next' call is made for all aircraft when they are next to depart. AY ADC must inform ELW(BLA) if the aircraft does not depart within 2 minutes of the next call.

+
+

Example

+

AY ADC -> BLA: "Next, AM324"
+BLA -> AY ADC: "AM324, Unrestricted"
+AY ADC -> BLA: "AM324"

+
+

The Standard Assignable level from AY TWR to ELW(BLA) is the lower of A070 or the RFL, any other level must be prior coordinated.

+

Arrivals/Overfliers

+

ELW(BLA) will heads-up coordinate all arrivals/overfliers to AY ADC

+
+

Example

+

BLA -> AY ADC: "Via ARRAN1 Arrival, RXA6783”
+AY ADC -> BLA: "RXA6783"

+
+

The Standard Assignable level from ELW(BLA) to AY ADC is A080, any other level must be prior coordinated.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/procedural/Alice/index.html b/aerodromes/procedural/Alice/index.html new file mode 100644 index 000000000..50901401e --- /dev/null +++ b/aerodromes/procedural/Alice/index.html @@ -0,0 +1,4818 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Alice Springs (YBAS) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Alice Springs (YBAS)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Alice Springs ADCAlice Tower118.300AS_TWR
Alice Springs ATISN/A123.000YBAS_ATIS
+

Airspace

+

AS ADC is responsible for the Class D airspace SFC to A045, as well as the Class C airspace A045 to A065, within the AS CTR.

+
+

AD ADC Airspace +

+
AD ADC Airspace
+
+

Refer to Class D Tower Separation Standards for more information.

+

Surveillance

+

Surveillance coverage can be expected to be available at all levels in the AS CTR. Although AS ADC is not permitted to use surveillance for separation, ASP may assist by establishing surveillance separation standards via coordination

+

Coordination

+

Departures

+

Departures from YBAS in to ASP Class C will be coordinated when ready for departure.

+
+

Example

+

AS ADC -> ASP: "Next, QFA797"
+ASP -> AS ADC: "QFA797, Unrestricted"
+AS ADC -> ASP: "QFA797"

+
+

The Standard Assignable level from AS ADC to ASP is the lower of A070 or the RFL, any other level must be prior coordinated.

+

Arrivals/Overfliers

+

ASP will heads-up coordinate all arrivals/overfliers to AS ADC

+
+

Example

+

ASP -> AS ADC: "Via SADEL, QFA1956”
+AS ADC -> ASP: "QFA1956"

+
+

The Standard Assignable level from ASP to AS ADC is A080, any other level must be prior coordinated.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/procedural/Broome/index.html b/aerodromes/procedural/Broome/index.html new file mode 100644 index 000000000..56af95805 --- /dev/null +++ b/aerodromes/procedural/Broome/index.html @@ -0,0 +1,4824 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Broome (YBRM) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Broome (YBRM)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Broome ADCBroome Tower123.250BRM_TWR
Broome SMCBroome Ground121.800BRM_GND
Broome ATISN/A133.850YBRM_ATIS
+

Airspace

+
+

BRM ADC Airspace +

+
BRM ADC Airspace
+
+

BRM ADC is responsible for the Class D airspace SFC to A055, as well as the Class E airspace 1200ft AGL to A055, within the BRM CTR.

+

Refer to Class D Tower Separation Standards for more information.

+

Surveillance

+

Surveillance coverage can be expected to be available at all levels in the BRM CTR. Although BRM ADC is not permitted to use surveillance for separation, TRT(KIY) may assist by establishing surveillance separation standards via coordination

+

Coordination

+

Departures

+

A 'next' call is made for all aircraft when they are next to depart. BRM ADC must inform TRT(KIY) if the aircraft does not depart within 2 minutes of the next call.

+
+

Example

+

BRM ADC -> KIY: "Next, NWK1653"
+KIY -> BRM ADC: "NWK1653, Unrestricted"
+BRM ADC -> KIY: "NWK1653"

+
+

The Standard Assignable level from BRM ADC to TRT(KIY) is the lower of A050 or the RFL, any other level must be prior coordinated.

+

Arrivals/Overfliers

+

TRT(KIY) will heads-up coordinate all arrivals/overfliers to BRM ADC

+
+

Example

+

KIY -> BRM ADC: "Via CIN, ANO332”
+BRM ADC -> KIY: "ANO332"

+
+

The Standard Assignable level from TRT(KIY) to BRM ADC is A060, any other level must be prior coordinated.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/procedural/Coffs/index.html b/aerodromes/procedural/Coffs/index.html new file mode 100644 index 000000000..d645772b6 --- /dev/null +++ b/aerodromes/procedural/Coffs/index.html @@ -0,0 +1,4818 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Coffs Harbour (YCFS) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Coffs Harbour (YCFS)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Coffs Harbour ADCCoffs Tower118.200CFS_TWR
Coffs Harbour ATISN/A130.300YCFS_ATIS
+

Airspace

+
+

CFS ADC Airspace +

+
CFS ADC Airspace
+
+

CFS ADC is responsible for the Class D airspace in the CFS CTR SFC to A045.

+

Refer to Class D Tower Separation Standards for more information.

+

Surveillance

+

Surveillance coverage can be expected to be not available below A028 in the CFS CTR. Although CFS ADC is not permitted to use surveillance for separation, ARL(MNN) or INL may assist by establishing surveillance separation standards via coordination

+

Coordination

+

Departures

+

A 'next' call is made for all aircraft when they are next to depart. CFS ADC must inform INL/ARL(MNN) if the aircraft does not depart within 2 minutes of the next call.

+
+

Example

+

CFS ADC -> MNN: "Next, QJE1573"
+MNN -> CFS ADC: "QJE1573, Unrestricted"
+CFS ADC -> MNN: "QJE1573"

+
+

The Standard Assignable level from CFS ADC to INL/ARL(MNN) is the lower of A070 or the RFL, any other level must be prior coordinated.

+

Arrivals/Overfliers

+

INL/ARL(MNN) will heads-up coordinate all arrivals/overfliers to CFS ADC.

+
+

Example

+

INL -> CFS ADC: "Via KADSI, RXA6416”
+CFS ADC -> INL: "RXA6416"

+
+

The Standard Assignable level from INL/ARL(MNN) to CFS ADC is A080, any other level must be prior coordinated.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/procedural/Hammo/index.html b/aerodromes/procedural/Hammo/index.html new file mode 100644 index 000000000..73671e862 --- /dev/null +++ b/aerodromes/procedural/Hammo/index.html @@ -0,0 +1,4818 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Hamilton Island (YBHM) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Hamilton Island (YBHM)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Hamilton Island ADCHamilton Tower118.700HM_TWR
Hamilton Island ATISN/A128.350YBHM_ATIS
+

Airspace

+
+

HM ADC Airspace +

+
HM ADC Airspace
+
+

HM ADC is responsible for the Class D airspace in the HM CTR SFC to A045.

+

Refer to Class D Tower Separation Standards for more information.

+

Surveillance

+

Surveillance coverage can be expected to be not available below A031 in the HM CTR. Although HM ADC is not permitted to use surveillance for separation, KEN(SWY) may assist by establishing surveillance separation standards via coordination

+

Coordination

+

Departures

+

A 'next' call is made for all aircraft when they are next to depart. HM ADC must inform KEN(SWY) if the aircraft does not depart within 2 minutes of the next call.

+
+

Example

+

HM ADC -> SWY: "Next, QFA797"
+SWY -> HM ADC: "QFA797, Unrestricted"
+HM ADC -> SWY: "QFA797"

+
+

The Standard Assignable level from HM ADC to KEN(SWY) is the lower of A050 or the RFL, any other level must be prior coordinated.

+

Arrivals/Overfliers

+

KEN(SWY) will heads-up coordinate all arrivals/overfliers to HM ADC

+
+

Example

+

SWY -> HM ADC: "Via OPOSI for the RNP-U RWY 32, JST848”
+HM ADC -> SWY: "JST848"

+
+

The Standard Assignable level from KEN(SWY) to HM ADC is A060, any other level must be prior coordinated.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/procedural/Karratha/index.html b/aerodromes/procedural/Karratha/index.html new file mode 100644 index 000000000..da8366ac5 --- /dev/null +++ b/aerodromes/procedural/Karratha/index.html @@ -0,0 +1,4824 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Karratha (YPKA) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Karratha (YPKA)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Karratha SMCKarratha Ground123.550KA_GND
Karratha ADCKarratha Tower127.350KA_TWR
Karratha ATISN/A134.550YPKA_ATIS
+

Airspace

+
+

KA ADC Airspace +

+
KA ADC Airspace
+
+

KA ADC is responsible for the Class D airspace in the KA CTR SFC to A055.

+

Refer to Class D Tower Separation Standards for more information.

+

Surveillance

+

Surveillance coverage can be expected to be available at all levels in the KA CTR. Although KA ADC is not permitted to use surveillance for separation, OLW may assist by establishing surveillance separation standards via coordination

+

Coordination

+

Departures

+

A 'next' call is made for all aircraft when they are next to depart. KA ADC must inform OLW if the aircraft does not depart within 2 minutes of the next call.

+
+

Example

+

KA ADC -> OLW: "Next, NWK694"
+OLW -> KA ADC: "NWK694, Unrestricted"
+KA ADC -> OLW: "NWK694"

+
+

The Standard Assignable level from KA ADC to OLW is the lower of A050 or the RFL, any other level must be prior coordinated.

+

Arrivals/Overfliers

+

OLW will heads-up coordinate all arrivals/overfliers to KA ADC

+
+

Example

+

OLW -> KA ADC: "Via PD, KPG, Overflier”
+KA ADC -> OLW: "KPG, A040"

+
+

The Standard Assignable level from OLW to KA ADC is A060, any other level must be prior coordinated.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/procedural/Sunshinecoast/index.html b/aerodromes/procedural/Sunshinecoast/index.html new file mode 100644 index 000000000..55f9629c3 --- /dev/null +++ b/aerodromes/procedural/Sunshinecoast/index.html @@ -0,0 +1,4894 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Sunshine Coast (YBSU) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Sunshine Coast (YBSU)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Sunshine Coast ADCSunshine Coast Tower124.400SU_TWR
Sunshine Coast SMCSunshine Coast Ground121.100SU_GND
Sunshine Coast ATISN/A119.800YBSU_ATIS
+

Airspace

+
+

SU ADC Airspace +

+
SU ADC Airspace
+
+

Refer to Class D Tower Separation Standards for more information.

+

Surveillance

+

Surveillance coverage can be expected to be not available below A012 in the SU CTR. Although SU ADC is not permitted to use surveillance for separation, INL(NSA) may assist by establishing surveillance separation standards via coordination

+

Runway Configuration

+

Pilots with old simulators/scenery may not have the newer Runway 13/31 config (replacing the old 18/36 config). If a pilot reports this to be the case, try to facilitate their flight as best as possible, whilst giving them lower priority to other traffic. Coordinate as you deem necessary with adjacent units.

+

SID Selection

+

Jet Aircraft planned via MOOLO or TAPET, shall be assigned the Procedural SID that terminates at the appropriate waypoint, unless the pilot indicates they are unable to accept a Procedural SID.

+

All other aircraft may be assigned a visual departure, or a standard IFR departure.

+

Coordination

+

Departures

+

A 'next' call is made for all aircraft when they are next to depart. SU ADC must inform INL(NSA/BUR) if the aircraft does not depart within 2 minutes of the next call.

+
+

Example

+

SU ADC -> NSA: "Next, BNZ133, runway 31"
+NSA -> SU ADC: "BNZ133, unrestricted"
+SU ADC -> NSA: "BNZ133"

+
+

The Standard Assignable level from SU ADC to INL(NSA/BUR) is the lower of A040 or the RFL, any other level must be prior coordinated.

+

Where operationally possible, INL(NSA/BUR) will assign a higher level to high performance aircraft during next coordination. This level assignment should be communicated to the aircraft during the takeoff clearance or when they provide a departure report after takeoff.

+
+

Example

+

SU ADC: "VOZ924, climb to FL120, runway 31, cleared for takeoff"

+
+

Arrivals/Overfliers

+

NSA will heads-up coordinate arrivals/overfliers from Class C to SU ADC. Aircraft will be cleared for the coordinated approach prior to handoff to SU ADC, unless SU ADC nominates a restriction.

+
+

Example

+

NSA -> SU ADC: "Via ITIDE2W Arrival, QJE1756”
+SU ADC -> NSA: "QJE1756"

+
+

The Standard Assignable level from INL(NSA/BUR) to SU ADC is A060, any other level must be prior coordinated.

+

BN TCU

+

BN TCU Class G shares a tiny border with SU ADC, however there are no SIDs, STARs, or airways through this gap. The only possible way for an aircraft to directly enter BN TCU's airspace from SU ADC's jurisdiction, is in to Class G, and as such, no coordination is required to BN TCU.

+
+

BN TCU / SU ADC Border +

+
BN TCU / SU ADC Border
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/procedural/Tamworth/index.html b/aerodromes/procedural/Tamworth/index.html new file mode 100644 index 000000000..125729998 --- /dev/null +++ b/aerodromes/procedural/Tamworth/index.html @@ -0,0 +1,5013 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Tamworth (YSTW) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Tamworth (YSTW)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Tamworth ADCTamworth Tower119.400TW_TWR
Tamworth SMCTamworth Ground121.900TW_GND
Tamworth ATISN/A123.800YSTW_ATIS
+

Airspace

+
+

TW ADC Airspace +

+
TW ADC Airspace
+
+

TW ADC is responsible for the Class D airspace in the TW CTR, as well as the Class C airspace between A045 and A065.

+

Refer to Class D Tower Separation Standards for more information.

+

Surveillance

+

Surveillance coverage can be expected to be not available below A034 in the TW CTR. Although TW ADC is not permitted to use surveillance for separation, ARL/MDE may assist by establishing surveillance separation standards via coordination

+

Local Lateral Separation Points

+ + + + + + + + + + + + + + + +
South and East of
New England Highway - Manilla Rd
vs040 Radial
LLC South of Moonbi township
LLC East of Tamworth City
LLC South of 11 DME
+ + + + + + + + + + + + + + + +
South and East of
New England Highway - Manilla Rd
vs030 Radial
LLC East of Tamworth City
+ + + + + + + + + + + + + + + +
East of New England Highwayvs168 Radial
LLC North of GGOLLC North of 14 DME
+ + + + + + + + + + + + + + + +
East of New England Highwayvs180 Radial
LLC North of WBHLLC North of 25 DME
+ + + + + + + + + + + + + + + +
East of New England Highwayvs190 Radial
Always laterally separated
+ + + + + + + + + + + + + + + + + + + + +
Visual fixesvsILS 30R
LLC South of
Duri Township, Round Hill,
GGO, and NUN
LLC North of
DGN - NEM - Tamworth City
- MAL via Manilla Rd
+ + + + + + + + + + + + + + + + + + + + +
Visual fixesvsVOR 12L
LLC West of GWT
LLC North of
DGN - NEM - Tamworth City
- MAL via Manilla Rd
+

Runway Operations

+

Runway 12R/30L shall be used for:

+
    +
  • All single-engine VFR arrivals and departures from the 160 Radial through West to the 295 Radial
  • +
  • Arrivals via DUA
  • +
  • Departures via GST or GWT
  • +
  • Single-engine circuit training
  • +
+

Runway 12L/30R shall be used for all other operations.
+ERSA FAC YSTW

+

Circuits

+

Circuits are to be flown in the direction coinciding with the Runway designator (Left/Right) at A024.

+

Coordination

+

Departures

+

A 'next' call is made for all aircraft when they are next to depart. TW ADC must inform ARL/MDE if the aircraft does not depart within 2 minutes of the next call.

+
+

Example

+

TW ADC -> ARL: "Next, QLK5D"
+ARL -> TW ADC: "QLK5D, Unrestricted"
+TW ADC -> ARL: "QLK5D"

+
+

The Standard Assignable level from TW ADC to ARL/MDE is the lower of A070 or the RFL, any other level must be prior coordinated.

+

Arrivals/Overfliers

+

ARL/MDE will heads-up coordinate all arrivals/overfliers to TW ADC

+
+

Example

+

MDE -> TW ADC: "Via MOR DCT for the VOR-A, FD272”
+TW ADC -> MDE: "FD272, VOR-A"

+
+

The Standard Assignable level from ARL/MDE to TW ADC is A080, any other level must be prior coordinated.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/procedural/Woomera/index.html b/aerodromes/procedural/Woomera/index.html new file mode 100644 index 000000000..3824b5522 --- /dev/null +++ b/aerodromes/procedural/Woomera/index.html @@ -0,0 +1,4803 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Woomera (YPWR) - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Woomera (YPWR)

+ +

Positions

+ + + + + + + + + + + + + + + + + + + + + + + +
NameCallsignFrequencyLogin Identifier
Woomera ADCWoomera Tower118.300WR_TWR
Woomera ATIS118.100YPWR_ATIS
+

Airspace

+

By default, WR ADC owns the R222F Restricted Area. This airspace has vertical limits of SFC to F120. When WR ADC is active, this airspace is classified as Class D.

+

Refer to Class D Tower Separation Standards for more information.

+

Surveillance

+

Surveillance coverage can be expected to be available at all levels in the WR CTR. Although WR ADC is not permitted to use surveillance for separation, ASP(WRA) may assist by establishing surveillance separation standards via coordination

+

Coordination

+

ASP(WRA)

+

Coordination is not required between WR ADC and ASP(WRA). Aircraft entering ASP(WRA) airspace shall be handed off, and instructed to contact ASP(WRA) for onwards clearance.

+

Charts

+
+

Note

+

Additional charts to the AIP may be found in the RAAF TERMA document, available towards the bottom of RAAF AIP page

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aerodromes/procedural/img/YBAS_airspace.png b/aerodromes/procedural/img/YBAS_airspace.png new file mode 100644 index 000000000..f65d99bcb Binary files /dev/null and b/aerodromes/procedural/img/YBAS_airspace.png differ diff --git a/aerodromes/procedural/img/YBSU_airspace.png b/aerodromes/procedural/img/YBSU_airspace.png new file mode 100644 index 000000000..f1e760e85 Binary files /dev/null and b/aerodromes/procedural/img/YBSU_airspace.png differ diff --git a/aerodromes/procedural/img/YMAY_airspace.png b/aerodromes/procedural/img/YMAY_airspace.png new file mode 100644 index 000000000..381dec6ee Binary files /dev/null and b/aerodromes/procedural/img/YMAY_airspace.png differ diff --git a/aerodromes/procedural/img/YSTW_airspace.png b/aerodromes/procedural/img/YSTW_airspace.png new file mode 100644 index 000000000..e3cc5ad1f Binary files /dev/null and b/aerodromes/procedural/img/YSTW_airspace.png differ diff --git a/aerodromes/procedural/img/subntcu.png b/aerodromes/procedural/img/subntcu.png new file mode 100644 index 000000000..31aa274c0 Binary files /dev/null and b/aerodromes/procedural/img/subntcu.png differ diff --git a/aerodromes/procedural/img/ybhm_airspace.png b/aerodromes/procedural/img/ybhm_airspace.png new file mode 100644 index 000000000..7adc39b50 Binary files /dev/null and b/aerodromes/procedural/img/ybhm_airspace.png differ diff --git a/aerodromes/procedural/img/ybrm_airspace.png b/aerodromes/procedural/img/ybrm_airspace.png new file mode 100644 index 000000000..f9a39c8ef Binary files /dev/null and b/aerodromes/procedural/img/ybrm_airspace.png differ diff --git a/aerodromes/procedural/img/ycfs_airspace.png b/aerodromes/procedural/img/ycfs_airspace.png new file mode 100644 index 000000000..bf41c0cba Binary files /dev/null and b/aerodromes/procedural/img/ycfs_airspace.png differ diff --git a/aerodromes/procedural/img/ypka_airspace.png b/aerodromes/procedural/img/ypka_airspace.png new file mode 100644 index 000000000..9776e88c4 Binary files /dev/null and b/aerodromes/procedural/img/ypka_airspace.png differ diff --git a/aerodromes/procedural/index.html b/aerodromes/procedural/index.html new file mode 100644 index 000000000..bf4bf533f --- /dev/null +++ b/aerodromes/procedural/index.html @@ -0,0 +1,4606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Overview - VATPAC Standard Operating Procedures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Overview

+ +

Local Instructions for all Procedural Class D towered aerodromes in Australia. A Procedural Tower Endorsement is required to control these aerodromes.

+

For simulation purposes only.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/hero-image.png b/assets/hero-image.png new file mode 100644 index 000000000..e5fe502f9 Binary files /dev/null and b/assets/hero-image.png differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 000000000..1cf13b9f9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/images/mini-logo.png b/assets/images/mini-logo.png new file mode 100644 index 000000000..d505ab51f Binary files /dev/null and b/assets/images/mini-logo.png differ diff --git a/assets/javascripts/bundle.56dfad97.min.js b/assets/javascripts/bundle.56dfad97.min.js new file mode 100644 index 000000000..1df62cd7d --- /dev/null +++ b/assets/javascripts/bundle.56dfad97.min.js @@ -0,0 +1,16 @@ +"use strict";(()=>{var Fi=Object.create;var gr=Object.defineProperty;var Wi=Object.getOwnPropertyDescriptor;var Ui=Object.getOwnPropertyNames,Vt=Object.getOwnPropertySymbols,Di=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,io=Object.prototype.propertyIsEnumerable;var no=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&no(e,r,t[r]);if(Vt)for(var r of Vt(t))io.call(t,r)&&no(e,r,t[r]);return e};var ao=(e,t)=>{var r={};for(var o in e)yr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Vt)for(var o of Vt(e))t.indexOf(o)<0&&io.call(e,o)&&(r[o]=e[o]);return r};var xr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Vi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ui(t))!yr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Wi(t,n))||o.enumerable});return e};var Lt=(e,t,r)=>(r=e!=null?Fi(Di(e)):{},Vi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var so=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var po=xr((Er,co)=>{(function(e,t){typeof Er=="object"&&typeof co!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function p(k){var ft=k.type,qe=k.tagName;return!!(qe==="INPUT"&&a[ft]&&!k.readOnly||qe==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function c(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(k){o=!1}function d(k){s(k.target)&&(o||p(k.target))&&c(k.target)}function y(k){s(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function M(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function te(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,te())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",M,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",y,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var qr=xr((ly,Sn)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var ka=/["'&<>]/;Sn.exports=Ha;function Ha(e){var t=""+e,r=ka.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof It=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof It=="object"?It.ClipboardJS=r():t.ClipboardJS=r()})(It,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return ji}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(A){return!1}}var d=function(A){var L=f()(A);return u("cut"),L},y=d;function M(V){var A=document.documentElement.getAttribute("dir")==="rtl",L=document.createElement("textarea");L.style.fontSize="12pt",L.style.border="0",L.style.padding="0",L.style.margin="0",L.style.position="absolute",L.style[A?"right":"left"]="-9999px";var F=window.pageYOffset||document.documentElement.scrollTop;return L.style.top="".concat(F,"px"),L.setAttribute("readonly",""),L.value=V,L}var X=function(A,L){var F=M(A);L.container.appendChild(F);var D=f()(F);return u("copy"),F.remove(),D},te=function(A){var L=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},F="";return typeof A=="string"?F=X(A,L):A instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(A==null?void 0:A.type)?F=X(A.value,L):(F=f()(A),u("copy")),F},J=te;function k(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?k=function(L){return typeof L}:k=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},k(V)}var ft=function(){var A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},L=A.action,F=L===void 0?"copy":L,D=A.container,Y=A.target,$e=A.text;if(F!=="copy"&&F!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&k(Y)==="object"&&Y.nodeType===1){if(F==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(F==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if($e)return J($e,{container:D});if(Y)return F==="cut"?y(Y):J(Y,{container:D})},qe=ft;function Fe(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Fe=function(L){return typeof L}:Fe=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},Fe(V)}function Ai(V,A){if(!(V instanceof A))throw new TypeError("Cannot call a class as a function")}function oo(V,A){for(var L=0;L0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Fe(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function($e){return Y.onClick($e)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,$e=this.action(Y)||"copy",Dt=qe({action:$e,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Dt?"success":"error",{action:$e,text:Dt,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return y(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,$e=!!document.queryCommandSupported;return Y.forEach(function(Dt){$e=$e&&!!document.queryCommandSupported(Dt)}),$e}}]),L}(s()),ji=Ii},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,d,y){var M=c.apply(this,arguments);return l.addEventListener(u,M,y),{destroy:function(){l.removeEventListener(u,M,y)}}}function p(l,f,u,d,y){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(M){return s(M,f,u,d,y)}))}function c(l,f,u,d){return function(y){y.delegateTarget=a(y.target,f),y.delegateTarget&&d.call(l,y)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,d,y){if(!u&&!d&&!y)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(y))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,d,y);if(a.nodeList(u))return l(u,d,y);if(a.string(u))return f(u,d,y);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,d,y){return u.addEventListener(d,y),{destroy:function(){u.removeEventListener(d,y)}}}function l(u,d,y){return Array.prototype.forEach.call(u,function(M){M.addEventListener(d,y)}),{destroy:function(){Array.prototype.forEach.call(u,function(M){M.removeEventListener(d,y)})}}}function f(u,d,y){return s(document.body,u,d,y)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||p(d,M)})},y&&(n[d]=y(n[d])))}function p(d,y){try{c(o[d](y))}catch(M){u(i[0][3],M)}}function c(d){d.value instanceof nt?Promise.resolve(d.value.v).then(l,f):u(i[0][2],d)}function l(d){p("next",d)}function f(d){p("throw",d)}function u(d,y){d(y),i.shift(),i.length&&p(i[0][0],i[0][1])}}function fo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof he=="function"?he(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function H(e){return typeof e=="function"}function ut(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ut(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var We=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=he(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(M){t={error:M}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(H(l))try{l()}catch(M){i=M instanceof zt?M.errors:[M]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=he(f),d=u.next();!d.done;d=u.next()){var y=d.value;try{uo(y)}catch(M){i=i!=null?i:[],M instanceof zt?i=q(q([],N(i)),N(M.errors)):i.push(M)}}}catch(M){o={error:M}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)uo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=We.EMPTY;function qt(e){return e instanceof We||e&&"closed"in e&&H(e.remove)&&H(e.add)&&H(e.unsubscribe)}function uo(e){H(e)?e():e.unsubscribe()}var Pe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new We(function(){o.currentObservers=null,Qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new j;return r.source=this,r},t.create=function(r,o){return new wo(r,o)},t}(j);var wo=function(e){oe(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){oe(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var At={now:function(){return(At.delegate||Date).now()},delegate:void 0};var Ct=function(e){oe(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=At);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(gt);var Oo=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(yt);var kr=new Oo(So);var Mo=function(e){oe(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(gt);var Lo=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(yt);var me=new Lo(Mo);var S=new j(function(e){return e.complete()});function Yt(e){return e&&H(e.schedule)}function Hr(e){return e[e.length-1]}function Xe(e){return H(Hr(e))?e.pop():void 0}function ke(e){return Yt(Hr(e))?e.pop():void 0}function Bt(e,t){return typeof Hr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return H(e==null?void 0:e.then)}function Jt(e){return H(e[bt])}function Xt(e){return Symbol.asyncIterator&&H(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ji(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Ji();function tr(e){return H(e==null?void 0:e[er])}function rr(e){return mo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return H(e==null?void 0:e.getReader)}function W(e){if(e instanceof j)return e;if(e!=null){if(Jt(e))return Xi(e);if(xt(e))return Zi(e);if(Gt(e))return ea(e);if(Xt(e))return _o(e);if(tr(e))return ta(e);if(or(e))return ra(e)}throw Zt(e)}function Xi(e){return new j(function(t){var r=e[bt]();if(H(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Zi(e){return new j(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?De(t):qo(function(){return new ir}))}}function jr(e){return e<=0?function(){return S}:E(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,d=0,y=!1,M=!1,X=function(){f==null||f.unsubscribe(),f=void 0},te=function(){X(),l=u=void 0,y=M=!1},J=function(){var k=l;te(),k==null||k.unsubscribe()};return E(function(k,ft){d++,!M&&!y&&X();var qe=u=u!=null?u:r();ft.add(function(){d--,d===0&&!M&&!y&&(f=Wr(J,p))}),qe.subscribe(ft),!l&&d>0&&(l=new at({next:function(Fe){return qe.next(Fe)},error:function(Fe){M=!0,X(),f=Wr(te,n,Fe),qe.error(Fe)},complete:function(){y=!0,X(),f=Wr(te,a),qe.complete()}}),W(k).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function P(e,t=document){return Array.from(t.querySelectorAll(e))}function R(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Ie(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var xa=O(h(document.body,"focusin"),h(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Ie()||document.body),G(1));function et(e){return xa.pipe(m(t=>e.contains(t)),K())}function $t(e,t){return C(()=>O(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Go(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Go(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Go(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Tt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),O(h(t,"load"),h(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),_(()=>document.head.removeChild(t)),Te(1))))}var Jo=new g,Ea=C(()=>typeof ResizeObserver=="undefined"?Tt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Jo.next(t)))),v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ea.pipe(w(r=>r.observe(t)),v(r=>Jo.pipe(b(o=>o.target===t),_(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function St(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Xo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ve(e){return{x:e.offsetLeft,y:e.offsetTop}}function Zo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function en(e){return O(h(window,"load"),h(window,"resize")).pipe(Le(0,me),m(()=>Ve(e)),Q(Ve(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ne(e){return O(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var tn=new g,wa=C(()=>I(new IntersectionObserver(e=>{for(let t of e)tn.next(t)},{threshold:0}))).pipe(v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function tt(e){return wa.pipe(w(t=>t.observe(e)),v(t=>tn.pipe(b(({target:r})=>r===e),_(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function rn(e,t=16){return Ne(e).pipe(m(({y:r})=>{let o=ce(e),n=St(e);return r>=n.height-o.height-t}),K())}var lr={drawer:R("[data-md-toggle=drawer]"),search:R("[data-md-toggle=search]")};function on(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function ze(e){let t=lr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function Ta(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Sa(){return O(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function nn(){let e=h(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:on("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Ie();if(typeof o!="undefined")return!Ta(o,r)}return!0}),pe());return Sa().pipe(v(t=>t?S:e))}function ye(){return new URL(location.href)}function lt(e,t=!1){if(B("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function an(){return new g}function sn(){return location.hash.slice(1)}function cn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Oa(e){return O(h(window,"hashchange"),e).pipe(m(sn),Q(sn()),b(t=>t.length>0),G(1))}function pn(e){return Oa(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function Pt(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function ln(){let e=matchMedia("print");return O(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():S))}function zr(e,t){return new j(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function je(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function mn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),G(1))}function fn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),G(1))}function un(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function dn(){return O(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(un),Q(un()))}function hn(){return{width:innerWidth,height:innerHeight}}function bn(){return h(window,"resize",{passive:!0}).pipe(m(hn),Q(hn()))}function vn(){return z([dn(),bn()]).pipe(m(([e,t])=>({offset:e,size:t})),G(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(ee("size")),n=z([o,r]).pipe(m(()=>Ve(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function Ma(e){return h(e,"message",t=>t.data)}function La(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function gn(e,t=new Worker(e)){let r=Ma(t),o=La(t),n=new g;n.subscribe(o);let i=o.pipe(Z(),ie(!0));return n.pipe(Z(),Re(r.pipe(U(i))),pe())}var _a=R("#__config"),Ot=JSON.parse(_a.textContent);Ot.base=`${new URL(Ot.base,ye())}`;function xe(){return Ot}function B(e){return Ot.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?Ot.translations[e].replace("#",t.toString()):Ot.translations[e]}function Se(e,t=document){return R(`[data-md-component=${e}]`,t)}function ae(e,t=document){return P(`[data-md-component=${e}]`,t)}function Aa(e){let t=R(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>R(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function yn(e){if(!B("announce.dismiss")||!e.childElementCount)return S;if(!e.hidden){let t=R(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),Aa(e).pipe(w(r=>t.next(r)),_(()=>t.complete()),m(r=>$({ref:e},r)))})}function Ca(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function xn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ca(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))}function Rt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function En(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function wn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Tn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var On=Lt(qr());function Qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,(0,On.default)(c))," "],[]).slice(0,-1),i=xe(),a=new URL(e.location,i.base);B("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=xe();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)}),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Mn(e){let t=e[0].score,r=[...e],o=xe(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreQr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>Qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function Ln(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Kr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function _n(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function $a(e){var o;let t=xe(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function An(e,t){var o;let r=xe();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map($a)))}var Pa=0;function Ra(e){let t=z([et(e),$t(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Xo(e)).pipe(ne(Ne),pt(1),He(t),m(()=>Zo(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function Ia(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Pa++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(Z(),ie(!1)).subscribe(a);let s=a.pipe(Ht(c=>Me(+!c*250,kr)),K(),v(c=>c?r:S),w(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>$t(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),re(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),d=u.width/2;if(l.role==="tooltip")return{x:d,y:8+u.height};if(u.y>=f.height/2){let{height:y}=ce(l);return{x:d,y:-16-y}}else return{x:d,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),re(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(R(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),ve(me),re(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),Ra(e).pipe(w(c=>i.next(c)),_(()=>i.complete()),m(c=>$({ref:e},c)))})}function mt(e,{viewport$:t},r=document.body){return Ia(e,{content$:new j(o=>{let n=e.title,i=En(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function ja(e,t){let r=C(()=>z([en(e),Ne(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function Cn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(U(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),O(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(U(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),h(n,"mousedown").pipe(U(a),re(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Ie())==null||c.blur()}}),r.pipe(U(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),ja(e,t).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function Fa(e){return e.tagName==="CODE"?P(".c, .c1, .cm",e):[e]}function Wa(e){let t=[];for(let r of Fa(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function kn(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Wa(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,wn(p,i)),s.replaceWith(a.get(p)))}return a.size===0?S:C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=[];for(let[l,f]of a)c.push([R(".md-typeset",f),R(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?kn(f,u):kn(u,f)}),O(...[...a].map(([,l])=>Cn(l,t,{target$:r}))).pipe(_(()=>s.complete()),pe())})}function Hn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Hn(t)}}function $n(e,t){return C(()=>{let r=Hn(e);return typeof r!="undefined"?fr(r,e,t):S})}var Pn=Lt(Br());var Ua=0;function Rn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Rn(t)}}function Da(e){return ge(e).pipe(m(({width:t})=>({scrollable:St(e).width>t})),ee("scrollable"))}function In(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(jr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Pn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Ua++}`;let l=Tn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(mt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=Rn(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||B("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(U(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:S)))}}return P(":scope > span[id]",e).length&&e.classList.add("md-code__content"),Da(e).pipe(w(c=>n.next(c)),_(()=>n.complete()),m(c=>$({ref:e},c)),Re(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function Va(e,{target$:t,print$:r}){let o=!0;return O(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),w(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function jn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Va(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}var Fn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Gr,za=0;function qa(){return typeof mermaid=="undefined"||mermaid instanceof Element?Tt("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):I(void 0)}function Wn(e){return e.classList.remove("mermaid"),Gr||(Gr=qa().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Fn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Gr.subscribe(()=>so(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${za++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Gr.pipe(m(()=>({ref:e})))}var Un=x("table");function Dn(e){return e.replaceWith(Un),Un.replaceWith(_n(e)),I({ref:e})}function Qa(e){let t=e.find(r=>r.checked)||e[0];return O(...e.map(r=>h(r,"change").pipe(m(()=>R(`label[for="${r.id}"]`))))).pipe(Q(R(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Vn(e,{viewport$:t,target$:r}){let o=R(".tabbed-labels",e),n=P(":scope > input",e),i=Kr("prev");e.append(i);let a=Kr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(Z(),ie(!0));z([s,ge(e),tt(e)]).pipe(U(p),Le(1,me)).subscribe({next([{active:c},l]){let f=Ve(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=pr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ne(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=St(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),O(h(i,"click").pipe(m(()=>-1)),h(a,"click").pipe(m(()=>1))).pipe(U(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(U(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=R(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(U(p),b(f=>!(f.metaKey||f.ctrlKey)),w(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return B("content.tabs.link")&&s.pipe(Ce(1),re(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let y of P("[data-tabs]"))for(let M of P(":scope > input",y)){let X=R(`label[for="${M.id}"]`);if(X!==c&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),M.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),s.pipe(U(p)).subscribe(()=>{for(let c of P("audio, video",e))c.pause()}),Qa(n).pipe(w(c=>s.next(c)),_(()=>s.complete()),m(c=>$({ref:e},c)))}).pipe(Ke(se))}function Nn(e,{viewport$:t,target$:r,print$:o}){return O(...P(".annotate:not(.highlight)",e).map(n=>$n(n,{target$:r,print$:o})),...P("pre:not(.mermaid) > code",e).map(n=>In(n,{target$:r,print$:o})),...P("pre.mermaid",e).map(n=>Wn(n)),...P("table:not([class])",e).map(n=>Dn(n)),...P("details",e).map(n=>jn(n,{target$:r,print$:o})),...P("[data-tabs]",e).map(n=>Vn(n,{viewport$:t,target$:r})),...P("[title]",e).filter(()=>B("content.tooltips")).map(n=>mt(n,{viewport$:t})))}function Ka(e,{alert$:t}){return t.pipe(v(r=>O(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function zn(e,t){let r=R(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ka(e,t).pipe(w(n=>o.next(n)),_(()=>o.complete()),m(n=>$({ref:e},n)))})}var Ya=0;function Ba(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?Ne(o):I({x:0,y:0}),i=O(et(t),$t(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ve(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function qn(e){let t=e.title;if(!t.length)return S;let r=`__tooltip_${Ya++}`,o=Rt(r,"inline"),n=R(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),O(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ba(o,e).pipe(w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))}).pipe(Ke(se))}function Ga({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Be(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=ze("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Qn(e,t){return C(()=>z([ge(e),Ga(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function Kn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(Z(),ie(!0));o.pipe(ee("active"),He(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue(P("[title]",e)).pipe(b(()=>B("content.tooltips")),ne(a=>qn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>$({ref:e},a)),Re(i.pipe(U(n))))})}function Ja(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),ee("active"))}function Yn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?S:Ja(o,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))})}function Bn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ee("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Xa(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(ne(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),G(1))}function Gn(e){let t=P("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Pt("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),re(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(ve(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Xa(t).pipe(U(n.pipe(Ce(1))),ct(),w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))})}function Jn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(w(o=>r.next({value:o})),_(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Jr=Lt(Br());function Za(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Xn({alert$:e}){Jr.default.isSupported()&&new j(t=>{new Jr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Za(R(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function Zn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function es(e,t){let r=new Map;for(let o of P("url",e)){let n=R("loc",o),i=[Zn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of P("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Zn(new URL(s),t))}}return r}function ur(e){return fn(new URL("sitemap.xml",e)).pipe(m(t=>es(t,new URL(e))),de(()=>I(new Map)))}function ts(e,t){if(!(e.target instanceof Element))return S;let r=e.target.closest("a");if(r===null)return S;if(r.target||e.metaKey||e.ctrlKey)return S;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):S}function ei(e){let t=new Map;for(let r of P(":scope > *",e.head))t.set(r.outerHTML,r);return t}function ti(e){for(let t of P("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function rs(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...B("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=ei(document);for(let[o,n]of ei(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return Ue(P("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new j(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),S}),Z(),ie(document))}function ri({location$:e,viewport$:t,progress$:r}){let o=xe();if(location.protocol==="file:")return S;let n=ur(o.base);I(document).subscribe(ti);let i=h(document.body,"click").pipe(He(n),v(([p,c])=>ts(p,c)),pe()),a=h(window,"popstate").pipe(m(ye),pe());i.pipe(re(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),O(i,a).subscribe(e);let s=e.pipe(ee("pathname"),v(p=>mn(p,{progress$:r}).pipe(de(()=>(lt(p,!0),S)))),v(ti),v(rs),pe());return O(s.pipe(re(e,(p,c)=>c)),s.pipe(v(()=>e),ee("pathname"),v(()=>e),ee("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),w(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",cn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(ee("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var oi=Lt(qr());function ni(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,oi.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function jt(e){return e.type===1}function dr(e){return e.type===3}function ii(e,t){let r=gn(e);return O(I(location.protocol!=="file:"),ze("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:B("search.suggest")}}})),r}function ai({document$:e}){let t=xe(),r=je(new URL("../versions.json",t.base)).pipe(de(()=>S)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>h(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),re(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?S:(i.preventDefault(),I(p))}}return S}),v(i=>ur(new URL(i)).pipe(m(a=>{let p=ye().href.replace(t.base,i);return a.has(p.split("#")[0])?new URL(p):new URL(i)})))))).subscribe(n=>lt(n,!0)),z([r,o]).subscribe(([n,i])=>{R(".md-header__topic").appendChild(An(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function is(e,{worker$:t}){let{searchParams:r}=ye();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),ze("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=ye();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=O(t.pipe(Ae(jt)),h(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function si(e,{worker$:t}){let r=new g,o=r.pipe(Z(),ie(!0));z([t.pipe(Ae(jt)),r],(i,a)=>a).pipe(ee("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ee("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),h(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=R("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),is(e,{worker$:t}).pipe(w(i=>r.next(i)),_(()=>r.complete()),m(i=>$({ref:e},i)),G(1))}function ci(e,{worker$:t,query$:r}){let o=new g,n=rn(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=R(":scope > :first-child",e),s=R(":scope > :last-child",e);ze("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(re(r),Ur(t.pipe(Ae(jt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(w(()=>s.innerHTML=""),v(({items:l})=>O(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Be(4),Vr(n),v(([f])=>f)))),m(Mn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(ne(l=>{let f=fe("details",l);return typeof f=="undefined"?S:h(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(w(l=>o.next(l)),_(()=>o.complete()),m(l=>$({ref:e},l)))}function as(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ye();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function pi(e,t){let r=new g,o=r.pipe(Z(),ie(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),as(e,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))}function li(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=O(h(n,"keydown"),h(n,"focus")).pipe(ve(se),m(()=>n.value),K());return o.pipe(He(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(w(s=>o.next(s)),_(()=>o.complete()),m(()=>({ref:e})))}function mi(e,{index$:t,keyboard$:r}){let o=xe();try{let n=ii(o.search,t),i=Se("search-query",e),a=Se("search-result",e);h(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Ie();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of P(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...P(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Ie()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=si(i,{worker$:n});return O(s,ci(a,{worker$:n,query$:s})).pipe(Re(...ae("search-share",e).map(p=>pi(p,{query$:s})),...ae("search-suggest",e).map(p=>li(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ye}}function fi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(ye()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ni(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function ss(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Xr(e,o){var n=o,{header$:t}=n,r=ao(n,["header$"]);let i=R(".md-sidebar__scrollwrap",e),{y:a}=Ve(i);return C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=s.pipe(Le(0,me));return c.pipe(re(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of P(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2})}}}),ue(P("label[tabindex]",e)).pipe(ne(l=>h(l,"click").pipe(ve(se),m(()=>l),U(p)))).subscribe(l=>{let f=R(`[id="${l.htmlFor}"]`);R(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),ss(e,r).pipe(w(l=>s.next(l)),_(()=>s.complete()),m(l=>$({ref:e},l)))})}function ui(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return st(je(`${r}/releases/latest`).pipe(de(()=>S),m(o=>({version:o.tag_name})),De({})),je(r).pipe(de(()=>S),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return je(r).pipe(m(o=>({repositories:o.public_repos})),De({}))}}function di(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return st(je(`${r}/releases/permalink/latest`).pipe(de(()=>S),m(({tag_name:o})=>({version:o})),De({})),je(r).pipe(de(()=>S),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}function hi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return ui(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return di(r,o)}return S}var cs;function ps(e){return cs||(cs=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return S}return hi(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>S),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function bi(e){let t=R(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Ln(o)),t.classList.add("md-source__repository--active")}),ps(e).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ee("hidden"))}function vi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(B("navigation.tabs.sticky")?I({hidden:!1}):ls(e,t)).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function ms(e,{viewport$:t,header$:r}){let o=new Map,n=P(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(ee("height"),m(({height:s})=>{let p=Se("main"),c=R(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(ee("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),He(i),v(([p,c])=>t.pipe(Fr(([l,f],{offset:{y:u},size:d})=>{let y=u+d.height>=Math.floor(s.height);for(;f.length;){let[,M]=f[0];if(M-c=u&&!y)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Be(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(Z(),ie(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),B("toc.follow")){let s=O(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),He(o.pipe(ve(se))),re(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2,behavior:c})}}})}return B("navigation.tracking")&&t.pipe(U(a),ee("offset"),_e(250),Ce(1),U(n.pipe(Ce(1))),ct({delay:250}),re(i)).subscribe(([,{prev:s}])=>{let p=ye(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),ms(e,{viewport$:t,header$:r}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function fs(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Be(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),U(o.pipe(Ce(1))),ie(!0),ct({delay:250}),m(a=>({hidden:a})))}function yi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(a),ee("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),h(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),fs(e,{viewport$:t,main$:o,target$:n}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))}function xi({document$:e,viewport$:t}){e.pipe(v(()=>P(".md-ellipsis")),ne(r=>tt(r).pipe(U(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,B("content.tooltips")?mt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),_(()=>n.removeAttribute("title"))):S})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>P(".md-status")),ne(r=>mt(r,{viewport$:t}))).subscribe()}function Ei({document$:e,tablet$:t}){e.pipe(v(()=>P(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),ne(r=>h(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),re(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function us(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function wi({document$:e}){e.pipe(v(()=>P("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),b(us),ne(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Ti({viewport$:e,tablet$:t}){z([ze("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),re(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ds(){return location.protocol==="file:"?Tt(`${new URL("search/search_index.js",Zr.base)}`).pipe(m(()=>__index),G(1)):je(new URL("search/search_index.json",Zr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Bo(),Wt=an(),Mt=pn(Wt),eo=nn(),Oe=vn(),hr=Pt("(min-width: 960px)"),Oi=Pt("(min-width: 1220px)"),Mi=ln(),Zr=xe(),Li=document.forms.namedItem("search")?ds():Ye,to=new g;Xn({alert$:to});var ro=new g;B("navigation.instant")&&ri({location$:Wt,viewport$:Oe,progress$:ro}).subscribe(ot);var Si;((Si=Zr.version)==null?void 0:Si.provider)==="mike"&&ai({document$:ot});O(Wt,Mt).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});eo.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&<(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&<(r);break;case"Enter":let o=Ie();o instanceof HTMLLabelElement&&o.click()}});xi({viewport$:Oe,document$:ot});Ei({document$:ot,tablet$:hr});wi({document$:ot});Ti({viewport$:Oe,tablet$:hr});var rt=Qn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Bn(e,{viewport$:Oe,header$:rt})),G(1)),hs=O(...ae("consent").map(e=>xn(e,{target$:Mt})),...ae("dialog").map(e=>zn(e,{alert$:to})),...ae("header").map(e=>Kn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("palette").map(e=>Gn(e)),...ae("progress").map(e=>Jn(e,{progress$:ro})),...ae("search").map(e=>mi(e,{index$:Li,keyboard$:eo})),...ae("source").map(e=>bi(e))),bs=C(()=>O(...ae("announce").map(e=>yn(e)),...ae("content").map(e=>Nn(e,{viewport$:Oe,target$:Mt,print$:Mi})),...ae("content").map(e=>B("search.highlight")?fi(e,{index$:Li,location$:Wt}):S),...ae("header-title").map(e=>Yn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Oi,()=>Xr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Xr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>vi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>gi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Mt})),...ae("top").map(e=>yi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Mt})))),_i=ot.pipe(v(()=>bs),Re(hs),G(1));_i.subscribe();window.document$=ot;window.location$=Wt;window.target$=Mt;window.keyboard$=eo;window.viewport$=Oe;window.tablet$=hr;window.screen$=Oi;window.print$=Mi;window.alert$=to;window.progress$=ro;window.component$=_i;})(); +//# sourceMappingURL=bundle.56dfad97.min.js.map + diff --git a/assets/javascripts/bundle.56dfad97.min.js.map b/assets/javascripts/bundle.56dfad97.min.js.map new file mode 100644 index 000000000..eb83bdb3d --- /dev/null +++ b/assets/javascripts/bundle.56dfad97.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an