@internationalized/date 3.0.0-alpha.0 → 3.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -3
- package/src/CalendarDate.ts +302 -0
- package/src/DateFormatter.ts +190 -0
- package/src/calendars/BuddhistCalendar.ts +45 -0
- package/src/calendars/EthiopicCalendar.ts +169 -0
- package/src/calendars/GregorianCalendar.ts +114 -0
- package/src/calendars/HebrewCalendar.ts +196 -0
- package/src/calendars/IndianCalendar.ts +120 -0
- package/src/calendars/IslamicCalendar.ts +203 -0
- package/src/calendars/JapaneseCalendar.ts +160 -0
- package/src/calendars/PersianCalendar.ts +92 -0
- package/src/calendars/TaiwanCalendar.ts +70 -0
- package/src/conversion.ts +274 -0
- package/src/createCalendar.ts +54 -0
- package/src/index.ts +28 -0
- package/src/manipulation.ts +445 -0
- package/src/queries.ts +217 -0
- package/src/string.ts +180 -0
- package/src/types.ts +97 -0
- package/src/utils.ts +37 -0
- package/src/weekStartData.ts +108 -0
package/src/string.ts
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2020 Adobe. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {AnyDateTime, Disambiguation} from './types';
|
|
14
|
+
import {CalendarDate, CalendarDateTime, Time, ZonedDateTime} from './CalendarDate';
|
|
15
|
+
import {epochFromDate, fromAbsolute, possibleAbsolutes, toAbsolute, toCalendar, toCalendarDateTime, toTimeZone} from './conversion';
|
|
16
|
+
import {getLocalTimeZone} from './queries';
|
|
17
|
+
import {GregorianCalendar} from './calendars/GregorianCalendar';
|
|
18
|
+
import {Mutable} from './utils';
|
|
19
|
+
|
|
20
|
+
const TIME_RE = /^(\d{2})(?::(\d{2}))?(?::(\d{2}))?(\.\d+)?$/;
|
|
21
|
+
const DATE_RE = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
22
|
+
const DATE_TIME_RE = /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}))?(?::(\d{2}))?(?::(\d{2}))?(\.\d+)?$/;
|
|
23
|
+
const ZONED_DATE_TIME_RE = /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}))?(?::(\d{2}))?(?::(\d{2}))?(\.\d+)?(?:([+-]\d{2})(?::(\d{2}))?)?\[(.*?)\]$/;
|
|
24
|
+
const ABSOLUTE_RE = /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}))?(?::(\d{2}))?(?::(\d{2}))?(\.\d+)?(?:(?:([+-]\d{2})(?::(\d{2}))?)|Z)$/;
|
|
25
|
+
|
|
26
|
+
export function parseTime(value: string): Time {
|
|
27
|
+
let m = value.match(TIME_RE);
|
|
28
|
+
if (!m) {
|
|
29
|
+
throw new Error('Invalid ISO 8601 time string: ' + value);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return new Time(
|
|
33
|
+
parseNumber(m[1], 0, 23),
|
|
34
|
+
m[2] ? parseNumber(m[2], 0, 59) : 0,
|
|
35
|
+
m[3] ? parseNumber(m[3], 0, 59) : 0,
|
|
36
|
+
m[4] ? parseNumber(m[4], 0, Infinity) * 1000 : 0
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function parseDate(value: string): CalendarDate {
|
|
41
|
+
let m = value.match(DATE_RE);
|
|
42
|
+
if (!m) {
|
|
43
|
+
throw new Error('Invalid ISO 8601 date string: ' + value);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let date: Mutable<CalendarDate> = new CalendarDate(
|
|
47
|
+
parseNumber(m[1], 0, 9999),
|
|
48
|
+
parseNumber(m[2], 1, 12),
|
|
49
|
+
1
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
date.day = parseNumber(m[3], 0, date.calendar.getDaysInMonth(date));
|
|
53
|
+
return date as CalendarDate;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function parseDateTime(value: string): CalendarDateTime {
|
|
57
|
+
let m = value.match(DATE_TIME_RE);
|
|
58
|
+
if (!m) {
|
|
59
|
+
throw new Error('Invalid ISO 8601 date time string: ' + value);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let date: Mutable<CalendarDateTime> = new CalendarDateTime(
|
|
63
|
+
parseNumber(m[1], 1, 9999),
|
|
64
|
+
parseNumber(m[2], 1, 12),
|
|
65
|
+
1,
|
|
66
|
+
m[4] ? parseNumber(m[4], 0, 23) : 0,
|
|
67
|
+
m[5] ? parseNumber(m[5], 0, 59) : 0,
|
|
68
|
+
m[6] ? parseNumber(m[6], 0, 59) : 0,
|
|
69
|
+
m[7] ? parseNumber(m[7], 0, Infinity) * 1000 : 0
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
date.day = parseNumber(m[3], 0, date.calendar.getDaysInMonth(date));
|
|
73
|
+
return date as CalendarDateTime;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function parseZonedDateTime(value: string, disambiguation?: Disambiguation): ZonedDateTime {
|
|
77
|
+
let m = value.match(ZONED_DATE_TIME_RE);
|
|
78
|
+
if (!m) {
|
|
79
|
+
throw new Error('Invalid ISO 8601 date time string: ' + value);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
let date: Mutable<ZonedDateTime> = new ZonedDateTime(
|
|
83
|
+
parseNumber(m[1], 1, 9999),
|
|
84
|
+
parseNumber(m[2], 1, 12),
|
|
85
|
+
1,
|
|
86
|
+
m[10],
|
|
87
|
+
0,
|
|
88
|
+
m[4] ? parseNumber(m[4], 0, 23) : 0,
|
|
89
|
+
m[5] ? parseNumber(m[5], 0, 59) : 0,
|
|
90
|
+
m[6] ? parseNumber(m[6], 0, 59) : 0,
|
|
91
|
+
m[7] ? parseNumber(m[7], 0, Infinity) * 1000 : 0
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
date.day = parseNumber(m[3], 0, date.calendar.getDaysInMonth(date));
|
|
95
|
+
|
|
96
|
+
let plainDateTime = toCalendarDateTime(date as ZonedDateTime);
|
|
97
|
+
|
|
98
|
+
let ms: number;
|
|
99
|
+
if (m[8]) {
|
|
100
|
+
date.offset = parseNumber(m[8], -23, 23) * 60 * 60 * 1000 + parseNumber(m[9] ?? '0', 0, 59) * 60 * 1000;
|
|
101
|
+
ms = epochFromDate(date as ZonedDateTime) - date.offset;
|
|
102
|
+
|
|
103
|
+
// Validate offset against parsed date.
|
|
104
|
+
let absolutes = possibleAbsolutes(plainDateTime, date.timeZone);
|
|
105
|
+
if (!absolutes.includes(ms)) {
|
|
106
|
+
throw new Error(`Offset ${offsetToString(date.offset)} is invalid for ${dateTimeToString(date)} in ${date.timeZone}`);
|
|
107
|
+
}
|
|
108
|
+
} else {
|
|
109
|
+
// Convert to absolute and back to fix invalid times due to DST.
|
|
110
|
+
ms = toAbsolute(toCalendarDateTime(plainDateTime), date.timeZone, disambiguation);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return fromAbsolute(ms, date.timeZone);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function parseAbsolute(value: string, timeZone: string): ZonedDateTime {
|
|
117
|
+
let m = value.match(ABSOLUTE_RE);
|
|
118
|
+
if (!m) {
|
|
119
|
+
throw new Error('Invalid ISO 8601 date time string: ' + value);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
let date: Mutable<ZonedDateTime> = new ZonedDateTime(
|
|
123
|
+
parseNumber(m[1], 1, 9999),
|
|
124
|
+
parseNumber(m[2], 1, 12),
|
|
125
|
+
1,
|
|
126
|
+
timeZone,
|
|
127
|
+
0,
|
|
128
|
+
m[4] ? parseNumber(m[4], 0, 23) : 0,
|
|
129
|
+
m[5] ? parseNumber(m[5], 0, 59) : 0,
|
|
130
|
+
m[6] ? parseNumber(m[6], 0, 59) : 0,
|
|
131
|
+
m[7] ? parseNumber(m[7], 0, Infinity) * 1000 : 0
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
date.day = parseNumber(m[3], 0, date.calendar.getDaysInMonth(date));
|
|
135
|
+
|
|
136
|
+
if (m[8]) {
|
|
137
|
+
date.offset = parseNumber(m[8], -23, 23) * 60 * 60 * 1000 + parseNumber(m[9] ?? '0', 0, 59) * 60 * 1000;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return toTimeZone(date as ZonedDateTime, timeZone);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function parseAbsoluteToLocal(value: string): ZonedDateTime {
|
|
144
|
+
return parseAbsolute(value, getLocalTimeZone());
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function parseNumber(value: string, min: number, max: number) {
|
|
148
|
+
let val = Number(value);
|
|
149
|
+
if (val < min || val > max) {
|
|
150
|
+
throw new RangeError(`Value out of range: ${min} <= ${val} <= ${max}`);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return val;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function timeToString(time: Time): string {
|
|
157
|
+
return `${String(time.hour).padStart(2, '0')}:${String(time.minute).padStart(2, '0')}:${String(time.second).padStart(2, '0')}${time.millisecond ? String(time.millisecond / 1000).slice(1) : ''}`;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function dateToString(date: CalendarDate): string {
|
|
161
|
+
let gregorianDate = toCalendar(date, new GregorianCalendar());
|
|
162
|
+
return `${String(gregorianDate.year).padStart(4, '0')}-${String(gregorianDate.month).padStart(2, '0')}-${String(gregorianDate.day).padStart(2, '0')}`;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function dateTimeToString(date: AnyDateTime): string {
|
|
166
|
+
// @ts-ignore
|
|
167
|
+
return `${dateToString(date)}T${timeToString(date)}`;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function offsetToString(offset: number) {
|
|
171
|
+
let sign = Math.sign(offset) < 0 ? '-' : '+';
|
|
172
|
+
offset = Math.abs(offset);
|
|
173
|
+
let offsetHours = Math.floor(offset / (60 * 60 * 1000));
|
|
174
|
+
let offsetMinutes = (offset % (60 * 60 * 1000)) / (60 * 1000);
|
|
175
|
+
return `${sign}${String(offsetHours).padStart(2, '0')}:${String(offsetMinutes).padStart(2, '0')}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function zonedDateTimeToString(date: ZonedDateTime): string {
|
|
179
|
+
return `${dateTimeToString(date)}${offsetToString(date.offset)}[${date.timeZone}]`;
|
|
180
|
+
}
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2020 Adobe. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {CalendarDate} from './CalendarDate';
|
|
14
|
+
|
|
15
|
+
export interface AnyCalendarDate {
|
|
16
|
+
readonly calendar: Calendar,
|
|
17
|
+
readonly era: string,
|
|
18
|
+
readonly year: number,
|
|
19
|
+
readonly month: number,
|
|
20
|
+
readonly day: number,
|
|
21
|
+
copy(): this
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface AnyTime {
|
|
25
|
+
readonly hour: number,
|
|
26
|
+
readonly minute: number,
|
|
27
|
+
readonly second: number,
|
|
28
|
+
readonly millisecond: number,
|
|
29
|
+
copy(): this
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface AnyDateTime extends AnyCalendarDate, AnyTime {}
|
|
33
|
+
|
|
34
|
+
export interface Calendar {
|
|
35
|
+
identifier: string,
|
|
36
|
+
|
|
37
|
+
fromJulianDay(jd: number): CalendarDate,
|
|
38
|
+
toJulianDay(date: AnyCalendarDate): number,
|
|
39
|
+
|
|
40
|
+
getDaysInMonth(date: AnyCalendarDate): number,
|
|
41
|
+
getMonthsInYear(date: AnyCalendarDate): number,
|
|
42
|
+
getYearsInEra(date: AnyCalendarDate): number,
|
|
43
|
+
getEras(): string[],
|
|
44
|
+
|
|
45
|
+
getMinimumMonthInYear?(date: AnyCalendarDate): number,
|
|
46
|
+
getMinimumDayInMonth?(date: AnyCalendarDate): number,
|
|
47
|
+
|
|
48
|
+
balanceDate?(date: AnyCalendarDate): void,
|
|
49
|
+
balanceYearMonth?(date: AnyCalendarDate, previousDate: AnyCalendarDate): void,
|
|
50
|
+
getYearsToAdd?(date: AnyCalendarDate, years: number): number,
|
|
51
|
+
constrainDate?(date: AnyCalendarDate): void
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface Duration {
|
|
55
|
+
years?: number,
|
|
56
|
+
months?: number,
|
|
57
|
+
weeks?: number,
|
|
58
|
+
days?: number,
|
|
59
|
+
hours?: number,
|
|
60
|
+
minutes?: number,
|
|
61
|
+
seconds?: number,
|
|
62
|
+
milliseconds?: number
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface DateFields {
|
|
66
|
+
era?: string,
|
|
67
|
+
year?: number,
|
|
68
|
+
month?: number,
|
|
69
|
+
day?: number
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface TimeFields {
|
|
73
|
+
hour?: number,
|
|
74
|
+
minute?: number,
|
|
75
|
+
second?: number,
|
|
76
|
+
millisecond?: number
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type DateField = keyof DateFields;
|
|
80
|
+
export type TimeField = keyof TimeFields;
|
|
81
|
+
|
|
82
|
+
export type Disambiguation = 'compatible' | 'earlier' | 'later' | 'reject';
|
|
83
|
+
|
|
84
|
+
export interface CycleOptions {
|
|
85
|
+
/** Whether to round the field value to the nearest interval of the amount. */
|
|
86
|
+
round?: boolean
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface CycleTimeOptions extends CycleOptions {
|
|
90
|
+
/**
|
|
91
|
+
* Whether to use 12 or 24 hour time. If 12 hour time is chosen, the resulting value
|
|
92
|
+
* will remain in the same day period as the original value (e.g. if the value is AM,
|
|
93
|
+
* the resulting value also be AM).
|
|
94
|
+
* @default 24
|
|
95
|
+
*/
|
|
96
|
+
hourCycle?: 12 | 24
|
|
97
|
+
}
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2020 Adobe. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {CalendarDate, CalendarDateTime} from './CalendarDate';
|
|
14
|
+
|
|
15
|
+
export type Mutable<T> = {
|
|
16
|
+
-readonly[P in keyof T]: T[P]
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export function mod(amount: number, numerator: number): number {
|
|
20
|
+
return amount - numerator * Math.floor(amount / numerator);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function copy(date: CalendarDate): Mutable<CalendarDate> {
|
|
24
|
+
if (date.era) {
|
|
25
|
+
return new CalendarDate(date.calendar, date.era, date.year, date.month, date.day);
|
|
26
|
+
} else {
|
|
27
|
+
return new CalendarDate(date.calendar, date.year, date.month, date.day);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function copyDateTime(date: CalendarDateTime): Mutable<CalendarDateTime> {
|
|
32
|
+
if (date.era) {
|
|
33
|
+
return new CalendarDateTime(date.calendar, date.era, date.year, date.month, date.day, date.hour, date.minute, date.second, date.millisecond);
|
|
34
|
+
} else {
|
|
35
|
+
return new CalendarDateTime(date.calendar, date.year, date.month, date.day, date.hour, date.minute, date.second);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2020 Adobe. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// Data from https://github.com/unicode-cldr/cldr-core/blob/master/supplemental/weekData.json
|
|
14
|
+
// Locales starting on Sunday have been removed for compression.
|
|
15
|
+
export const weekStartData = {
|
|
16
|
+
'001': 1,
|
|
17
|
+
AD: 1,
|
|
18
|
+
AE: 6,
|
|
19
|
+
AF: 6,
|
|
20
|
+
AI: 1,
|
|
21
|
+
AL: 1,
|
|
22
|
+
AM: 1,
|
|
23
|
+
AN: 1,
|
|
24
|
+
AT: 1,
|
|
25
|
+
AX: 1,
|
|
26
|
+
AZ: 1,
|
|
27
|
+
BA: 1,
|
|
28
|
+
BE: 1,
|
|
29
|
+
BG: 1,
|
|
30
|
+
BH: 6,
|
|
31
|
+
BM: 1,
|
|
32
|
+
BN: 1,
|
|
33
|
+
BY: 1,
|
|
34
|
+
CH: 1,
|
|
35
|
+
CL: 1,
|
|
36
|
+
CM: 1,
|
|
37
|
+
CR: 1,
|
|
38
|
+
CY: 1,
|
|
39
|
+
CZ: 1,
|
|
40
|
+
DE: 1,
|
|
41
|
+
DJ: 6,
|
|
42
|
+
DK: 1,
|
|
43
|
+
DZ: 6,
|
|
44
|
+
EC: 1,
|
|
45
|
+
EE: 1,
|
|
46
|
+
EG: 6,
|
|
47
|
+
ES: 1,
|
|
48
|
+
FI: 1,
|
|
49
|
+
FJ: 1,
|
|
50
|
+
FO: 1,
|
|
51
|
+
FR: 1,
|
|
52
|
+
GB: 1,
|
|
53
|
+
GE: 1,
|
|
54
|
+
GF: 1,
|
|
55
|
+
GP: 1,
|
|
56
|
+
GR: 1,
|
|
57
|
+
HR: 1,
|
|
58
|
+
HU: 1,
|
|
59
|
+
IE: 1,
|
|
60
|
+
IQ: 6,
|
|
61
|
+
IR: 6,
|
|
62
|
+
IS: 1,
|
|
63
|
+
IT: 1,
|
|
64
|
+
JO: 6,
|
|
65
|
+
KG: 1,
|
|
66
|
+
KW: 6,
|
|
67
|
+
KZ: 1,
|
|
68
|
+
LB: 1,
|
|
69
|
+
LI: 1,
|
|
70
|
+
LK: 1,
|
|
71
|
+
LT: 1,
|
|
72
|
+
LU: 1,
|
|
73
|
+
LV: 1,
|
|
74
|
+
LY: 6,
|
|
75
|
+
MC: 1,
|
|
76
|
+
MD: 1,
|
|
77
|
+
ME: 1,
|
|
78
|
+
MK: 1,
|
|
79
|
+
MN: 1,
|
|
80
|
+
MQ: 1,
|
|
81
|
+
MV: 5,
|
|
82
|
+
MY: 1,
|
|
83
|
+
NL: 1,
|
|
84
|
+
NO: 1,
|
|
85
|
+
NZ: 1,
|
|
86
|
+
OM: 6,
|
|
87
|
+
PL: 1,
|
|
88
|
+
QA: 6,
|
|
89
|
+
RE: 1,
|
|
90
|
+
RO: 1,
|
|
91
|
+
RS: 1,
|
|
92
|
+
RU: 1,
|
|
93
|
+
SD: 6,
|
|
94
|
+
SE: 1,
|
|
95
|
+
SI: 1,
|
|
96
|
+
SK: 1,
|
|
97
|
+
SM: 1,
|
|
98
|
+
SY: 6,
|
|
99
|
+
TJ: 1,
|
|
100
|
+
TM: 1,
|
|
101
|
+
TR: 1,
|
|
102
|
+
UA: 1,
|
|
103
|
+
UY: 1,
|
|
104
|
+
UZ: 1,
|
|
105
|
+
VA: 1,
|
|
106
|
+
VN: 1,
|
|
107
|
+
XK: 1
|
|
108
|
+
};
|