Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
DateTimeOffset.cs
Go to the documentation of this file.
7
8namespace System;
9
12[TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
13public readonly struct DateTimeOffset : IComparable, ISpanFormattable, IFormattable, IComparable<DateTimeOffset>, IEquatable<DateTimeOffset>, ISerializable, IDeserializationCallback, IAdditionOperators<DateTimeOffset, TimeSpan, DateTimeOffset>, IAdditiveIdentity<DateTimeOffset, TimeSpan>, IComparisonOperators<DateTimeOffset, DateTimeOffset>, IEqualityOperators<DateTimeOffset, DateTimeOffset>, IMinMaxValue<DateTimeOffset>, ISpanParseable<DateTimeOffset>, IParseable<DateTimeOffset>, ISubtractionOperators<DateTimeOffset, TimeSpan, DateTimeOffset>, ISubtractionOperators<DateTimeOffset, DateTimeOffset, TimeSpan>
14{
15 public static readonly DateTimeOffset MinValue = new DateTimeOffset(0L, TimeSpan.Zero);
16
17 public static readonly DateTimeOffset MaxValue = new DateTimeOffset(3155378975999999999L, TimeSpan.Zero);
18
19 public static readonly DateTimeOffset UnixEpoch = new DateTimeOffset(621355968000000000L, TimeSpan.Zero);
20
21 private readonly DateTime _dateTime;
22
23 private readonly short _offsetMinutes;
24
26
27 public static DateTimeOffset UtcNow
28 {
29 get
30 {
32 return new DateTimeOffset(0, utcNow);
33 }
34 }
35
37
39
41
43
45
46 public int Day => ClockDateTime.Day;
47
49
51
52 public int Hour => ClockDateTime.Hour;
53
55
57
58 public int Month => ClockDateTime.Month;
59
60 public TimeSpan Offset => new TimeSpan(0, _offsetMinutes, 0);
61
63
64 public long Ticks => ClockDateTime.Ticks;
65
66 public long UtcTicks => UtcDateTime.Ticks;
67
69
70 public int Year => ClockDateTime.Year;
71
72 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
74
75 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
77
78 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
80
86
87 public DateTimeOffset(long ticks, TimeSpan offset)
89 {
90 }
91
98
100 {
101 if (dateTime.Kind == DateTimeKind.Local)
102 {
104 {
106 }
107 }
108 else if (dateTime.Kind == DateTimeKind.Utc && offset != TimeSpan.Zero)
109 {
111 }
114 }
115
116 public DateTimeOffset(int year, int month, int day, int hour, int minute, int second, TimeSpan offset)
117 {
119 int num = second;
120 if (second == 60 && DateTime.s_systemSupportsLeapSeconds)
121 {
122 second = 59;
123 }
124 _dateTime = ValidateDate(new DateTime(year, month, day, hour, minute, second), offset);
126 {
128 }
129 }
130
131 public DateTimeOffset(int year, int month, int day, int hour, int minute, int second, int millisecond, TimeSpan offset)
132 {
134 int num = second;
135 if (second == 60 && DateTime.s_systemSupportsLeapSeconds)
136 {
137 second = 59;
138 }
139 _dateTime = ValidateDate(new DateTime(year, month, day, hour, minute, second, millisecond), offset);
141 {
143 }
144 }
145
146 public DateTimeOffset(int year, int month, int day, int hour, int minute, int second, int millisecond, Calendar calendar, TimeSpan offset)
147 {
149 int num = second;
150 if (second == 60 && DateTime.s_systemSupportsLeapSeconds)
151 {
152 second = 59;
153 }
154 _dateTime = ValidateDate(new DateTime(year, month, day, hour, minute, second, millisecond, calendar), offset);
156 {
158 }
159 }
160
165
170
172 {
174 }
175
177 {
179 }
180
185
190
195
200
201 public DateTimeOffset AddTicks(long ticks)
202 {
203 return new DateTimeOffset(ClockDateTime.AddTicks(ticks), Offset);
204 }
205
207 {
209 }
210
211 public static int Compare(DateTimeOffset first, DateTimeOffset second)
212 {
213 return DateTime.Compare(first.UtcDateTime, second.UtcDateTime);
214 }
215
217 {
218 if (obj == null)
219 {
220 return 1;
221 }
223 {
225 }
228 {
229 return 1;
230 }
232 {
233 return -1;
234 }
235 return 0;
236 }
237
239 {
240 DateTime utcDateTime = other.UtcDateTime;
243 {
244 return 1;
245 }
247 {
248 return -1;
249 }
250 return 0;
251 }
252
253 public override bool Equals([NotNullWhen(true)] object? obj)
254 {
256 {
258 }
259 return false;
260 }
261
263 {
264 return UtcDateTime.Equals(other.UtcDateTime);
265 }
266
268 {
269 if (ClockDateTime == other.ClockDateTime && Offset == other.Offset)
270 {
271 return ClockDateTime.Kind == other.ClockDateTime.Kind;
272 }
273 return false;
274 }
275
276 public static bool Equals(DateTimeOffset first, DateTimeOffset second)
277 {
278 return DateTime.Equals(first.UtcDateTime, second.UtcDateTime);
279 }
280
285
287 {
289 {
290 throw new ArgumentOutOfRangeException("seconds", SR.Format(SR.ArgumentOutOfRange_Range, -62135596800L, 253402300799L));
291 }
292 long ticks = seconds * 10000000 + 621355968000000000L;
293 return new DateTimeOffset(ticks, TimeSpan.Zero);
294 }
295
297 {
299 {
300 throw new ArgumentOutOfRangeException("milliseconds", SR.Format(SR.ArgumentOutOfRange_Range, -62135596800000L, 253402300799999L));
301 }
302 long ticks = milliseconds * 10000 + 621355968000000000L;
303 return new DateTimeOffset(ticks, TimeSpan.Zero);
304 }
305
318
320 {
321 if (info == null)
322 {
323 throw new ArgumentNullException("info");
324 }
325 info.AddValue("DateTime", _dateTime);
326 info.AddValue("OffsetMinutes", _offsetMinutes);
327 }
328
330 {
331 if (info == null)
332 {
333 throw new ArgumentNullException("info");
334 }
335 _dateTime = (DateTime)info.GetValue("DateTime", typeof(DateTime));
336 _offsetMinutes = (short)info.GetValue("OffsetMinutes", typeof(short));
337 }
338
339 public override int GetHashCode()
340 {
341 return UtcDateTime.GetHashCode();
342 }
343
344 public static DateTimeOffset Parse(string input)
345 {
346 if (input == null)
347 {
349 }
352 }
353
355 {
356 if (input == null)
357 {
359 }
361 }
362
373
380
382 {
383 if (input == null)
384 {
386 }
387 if (format == null)
388 {
390 }
392 }
393
408
415
426
433
435 {
436 return UtcDateTime.Subtract(value.UtcDateTime);
437 }
438
443
444 public long ToFileTime()
445 {
446 return UtcDateTime.ToFileTime();
447 }
448
449 public long ToUnixTimeSeconds()
450 {
451 long num = UtcDateTime.Ticks / 10000000;
452 return num - 62135596800L;
453 }
454
456 {
457 long num = UtcDateTime.Ticks / 10000;
458 return num - 62135596800000L;
459 }
460
462 {
463 return ToLocalTime(throwOnOverflow: false);
464 }
465
470
472 {
474 long num = utcDateTime.Ticks + localUtcOffset.Ticks;
475 if (num < 0 || num > 3155378975999999999L)
476 {
477 if (throwOnOverflow)
478 {
480 }
481 num = ((num < 0) ? 0 : 3155378975999999999L);
482 }
483 return new DateTimeOffset(num, localUtcOffset);
484 }
485
486 public override string ToString()
487 {
488 return DateTimeFormat.Format(ClockDateTime, null, null, Offset);
489 }
490
491 public string ToString(string? format)
492 {
494 }
495
500
505
510
512 {
513 return new DateTimeOffset(UtcDateTime);
514 }
515
516 public static bool TryParse([NotNullWhen(true)] string? input, out DateTimeOffset result)
517 {
521 result = new DateTimeOffset(result2.Ticks, offset);
522 return result3;
523 }
524
533
535 {
536 styles = ValidateStyles(styles, "styles");
537 if (input == null)
538 {
539 result = default(DateTimeOffset);
540 return false;
541 }
545 result = new DateTimeOffset(result2.Ticks, offset);
546 return result3;
547 }
548
558
560 {
561 styles = ValidateStyles(styles, "styles");
562 if (input == null || format == null)
563 {
564 result = default(DateTimeOffset);
565 return false;
566 }
570 result = new DateTimeOffset(result2.Ticks, offset);
571 return result3;
572 }
573
583
584 public static bool TryParseExact([NotNullWhen(true)] string? input, [NotNullWhen(true)] string?[]? formats, IFormatProvider? formatProvider, DateTimeStyles styles, out DateTimeOffset result)
585 {
586 styles = ValidateStyles(styles, "styles");
587 if (input == null)
588 {
589 result = default(DateTimeOffset);
590 return false;
591 }
595 result = new DateTimeOffset(result2.Ticks, offset);
596 return result3;
597 }
598
608
609 private static short ValidateOffset(TimeSpan offset)
610 {
611 long ticks = offset.Ticks;
612 if (ticks % 600000000 != 0L)
613 {
614 throw new ArgumentException(SR.Argument_OffsetPrecision, "offset");
615 }
616 if (ticks < -504000000000L || ticks > 504000000000L)
617 {
619 }
620 return (short)(offset.Ticks / 600000000);
621 }
622
624 {
625 long num = dateTime.Ticks - offset.Ticks;
626 if (num < 0 || num > 3155378975999999999L)
627 {
629 }
630 return new DateTime(num, DateTimeKind.Unspecified);
631 }
632
634 {
635 if (((uint)style & 0xFFFFFF00u) != 0)
636 {
638 }
639 if ((style & DateTimeStyles.AssumeLocal) != 0 && (style & DateTimeStyles.AssumeUniversal) != 0)
640 {
642 }
643 if ((style & DateTimeStyles.NoCurrentDateDefault) != 0)
644 {
646 }
647 style &= ~DateTimeStyles.RoundtripKind;
648 style &= ~DateTimeStyles.AssumeLocal;
649 return style;
650 }
651
652 public static implicit operator DateTimeOffset(DateTime dateTime)
653 {
654 return new DateTimeOffset(dateTime);
655 }
656
661
666
668 {
669 return left.UtcDateTime - right.UtcDateTime;
670 }
671
672 public static bool operator ==(DateTimeOffset left, DateTimeOffset right)
673 {
674 return left.UtcDateTime == right.UtcDateTime;
675 }
676
677 public static bool operator !=(DateTimeOffset left, DateTimeOffset right)
678 {
679 return left.UtcDateTime != right.UtcDateTime;
680 }
681
682 public static bool operator <(DateTimeOffset left, DateTimeOffset right)
683 {
684 return left.UtcDateTime < right.UtcDateTime;
685 }
686
687 public static bool operator <=(DateTimeOffset left, DateTimeOffset right)
688 {
689 return left.UtcDateTime <= right.UtcDateTime;
690 }
691
692 public static bool operator >(DateTimeOffset left, DateTimeOffset right)
693 {
694 return left.UtcDateTime > right.UtcDateTime;
695 }
696
697 public static bool operator >=(DateTimeOffset left, DateTimeOffset right)
698 {
699 return left.UtcDateTime >= right.UtcDateTime;
700 }
701
702 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
704 {
705 return left + right;
706 }
707
708 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
710 {
711 return left < right;
712 }
713
714 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
716 {
717 return left <= right;
718 }
719
720 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
722 {
723 return left > right;
724 }
725
726 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
728 {
729 return left >= right;
730 }
731
732 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
734 {
735 return left == right;
736 }
737
738 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
740 {
741 return left != right;
742 }
743
744 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
749
750 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
752 {
753 return TryParse(s, provider, DateTimeStyles.None, out result);
754 }
755
756 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
761
762 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
767
768 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
770 {
771 return left - right;
772 }
773
774 [RequiresPreviewFeatures("Generic Math is in preview.", Url = "https://aka.ms/dotnet-warnings/generic-math-preview")]
776 {
777 return left - right;
778 }
779}
static bool TryFormat(DateTime dateTime, Span< char > destination, out int charsWritten, ReadOnlySpan< char > format, IFormatProvider provider)
static string Format(DateTime dateTime, string format, IFormatProvider provider)
static bool TryParseExactMultiple(ReadOnlySpan< char > s, string[] formats, DateTimeFormatInfo dtfi, DateTimeStyles style, out DateTime result, out TimeSpan offset)
static DateTime ParseExact(ReadOnlySpan< char > s, ReadOnlySpan< char > format, DateTimeFormatInfo dtfi, DateTimeStyles style)
static bool TryParse(ReadOnlySpan< char > s, DateTimeFormatInfo dtfi, DateTimeStyles styles, out DateTime result)
static DateTime Parse(ReadOnlySpan< char > s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
static DateTime ParseExactMultiple(ReadOnlySpan< char > s, string[] formats, DateTimeFormatInfo dtfi, DateTimeStyles style)
static bool TryParseExact(ReadOnlySpan< char > s, ReadOnlySpan< char > format, DateTimeFormatInfo dtfi, DateTimeStyles style, out DateTime result)
static string Serialization_InvalidData
Definition SR.cs:1880
static string ArgumentOutOfRange_Range
Definition SR.cs:1096
static string Argument_InvalidDateTimeStyles
Definition SR.cs:666
static string Argument_OffsetLocalMismatch
Definition SR.cs:824
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string Argument_ConflictingDateTimeStyles
Definition SR.cs:528
static string Argument_OffsetUtcMismatch
Definition SR.cs:832
static string Argument_OffsetPrecision
Definition SR.cs:830
static string Argument_DateTimeOffsetInvalidDateTimeStyles
Definition SR.cs:570
static string Argument_UTCOutOfRange
Definition SR.cs:912
static string Arg_MustBeDateTimeOffset
Definition SR.cs:264
static string ArgumentOutOfRange_BadHourMinuteSecond
Definition SR.cs:972
static string Arg_ArgumentOutOfRangeException
Definition SR.cs:68
static string Argument_OffsetOutOfRange
Definition SR.cs:828
Definition SR.cs:7
static void ThrowArgumentNullException(string name)
static TimeSpan GetLocalUtcOffset(DateTime dateTime, TimeZoneInfoOptions flags)
static TResult AdditiveIdentity
int CompareTo(object? obj)
static TSelf MinValue
static TSelf MaxValue
static bool TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, out TSelf result)
static TSelf Parse(string s, IFormatProvider? provider)
static bool TryParse(ReadOnlySpan< char > s, IFormatProvider? provider, out TSelf result)
static TSelf Parse(ReadOnlySpan< char > s, IFormatProvider? provider)
void GetObjectData(SerializationInfo info, StreamingContext context)
DayOfWeek
Definition DayOfWeek.cs:4
static DateTimeOffset IMinMaxValue< DateTimeOffset >. MaxValue
DateTimeOffset AddYears(int years)
DateTimeOffset AddTicks(long ticks)
DateTimeOffset AddMilliseconds(double milliseconds)
static DateTimeOffset FromFileTime(long fileTime)
TimeSpan Subtract(DateTimeOffset value)
DateTimeOffset(SerializationInfo info, StreamingContext context)
string ToString(string? format)
DateTimeOffset AddDays(double days)
bool Equals(DateTimeOffset other)
DateTimeOffset ToOffset(TimeSpan offset)
override bool Equals([NotNullWhen(true)] object? obj)
static bool operator<=(DateTimeOffset left, DateTimeOffset right)
DateTimeOffset AddSeconds(double seconds)
DateTimeOffset ToUniversalTime()
static bool Equals(DateTimeOffset first, DateTimeOffset second)
string ToString(string? format, IFormatProvider? formatProvider)
bool TryFormat(Span< char > destination, out int charsWritten, ReadOnlySpan< char > format=default(ReadOnlySpan< char >), IFormatProvider? formatProvider=null)
static DateTime ValidateDate(DateTime dateTime, TimeSpan offset)
static DateTimeOffset operator-(DateTimeOffset dateTimeOffset, TimeSpan timeSpan)
static readonly DateTimeOffset MaxValue
static DateTimeOffset FromUnixTimeSeconds(long seconds)
DateTimeOffset(int year, int month, int day, int hour, int minute, int second, int millisecond, Calendar calendar, TimeSpan offset)
static bool operator==(DateTimeOffset left, DateTimeOffset right)
DateTimeOffset(short validOffsetMinutes, DateTime validDateTime)
DateTimeOffset ToLocalTime()
static bool TryParseExact(ReadOnlySpan< char > input, [NotNullWhen(true)] string?[]? formats, IFormatProvider? formatProvider, DateTimeStyles styles, out DateTimeOffset result)
static DateTimeOffset Parse(string input, IFormatProvider? formatProvider, DateTimeStyles styles)
static bool TryParse([NotNullWhen(true)] string? input, IFormatProvider? formatProvider, DateTimeStyles styles, out DateTimeOffset result)
static DateTimeOffset IMinMaxValue< DateTimeOffset >. MinValue
static bool TryParse([NotNullWhen(true)] string? input, out DateTimeOffset result)
static short ValidateOffset(TimeSpan offset)
readonly short _offsetMinutes
DateTimeOffset(int year, int month, int day, int hour, int minute, int second, TimeSpan offset)
static DateTimeOffset ParseExact(string input, string[] formats, IFormatProvider? formatProvider, DateTimeStyles styles)
bool EqualsExact(DateTimeOffset other)
static DateTimeOffset Parse(string input)
static bool TryParseExact(ReadOnlySpan< char > input, ReadOnlySpan< char > format, IFormatProvider? formatProvider, DateTimeStyles styles, out DateTimeOffset result)
static DateTimeOffset ToLocalTime(DateTime utcDateTime, bool throwOnOverflow)
DateTimeOffset Subtract(TimeSpan value)
static bool operator!=(DateTimeOffset left, DateTimeOffset right)
DateTimeOffset AddMinutes(double minutes)
int CompareTo(DateTimeOffset other)
static DateTimeOffset ParseExact(ReadOnlySpan< char > input, ReadOnlySpan< char > format, IFormatProvider? formatProvider, DateTimeStyles styles=DateTimeStyles.None)
static DateTimeOffset Parse(ReadOnlySpan< char > input, IFormatProvider? formatProvider=null, DateTimeStyles styles=DateTimeStyles.None)
DateTimeOffset(DateTime dateTime, TimeSpan offset)
static DateTimeStyles ValidateStyles(DateTimeStyles style, string parameterName)
static bool operator<(DateTimeOffset left, DateTimeOffset right)
override int GetHashCode()
static DateTimeOffset Parse(string input, IFormatProvider? formatProvider)
DateTimeOffset(int year, int month, int day, int hour, int minute, int second, int millisecond, TimeSpan offset)
DateTimeOffset(long ticks, TimeSpan offset)
static DateTimeOffset FromUnixTimeMilliseconds(long milliseconds)
static int Compare(DateTimeOffset first, DateTimeOffset second)
static DateTimeOffset operator+(DateTimeOffset dateTimeOffset, TimeSpan timeSpan)
static bool operator>=(DateTimeOffset left, DateTimeOffset right)
static readonly DateTimeOffset UnixEpoch
DateTimeOffset AddMonths(int months)
readonly DateTime _dateTime
static bool TryParseExact([NotNullWhen(true)] string? input, [NotNullWhen(true)] string? format, IFormatProvider? formatProvider, DateTimeStyles styles, out DateTimeOffset result)
DateTimeOffset Add(TimeSpan timeSpan)
string ToString(IFormatProvider? formatProvider)
DateTimeOffset(DateTime dateTime)
static DateTimeOffset Now
static DateTimeOffset ParseExact(string input, string format, IFormatProvider? formatProvider)
DateTimeOffset ToLocalTime(bool throwOnOverflow)
static DateTimeOffset ParseExact(ReadOnlySpan< char > input, string[] formats, IFormatProvider? formatProvider, DateTimeStyles styles=DateTimeStyles.None)
static DateTimeOffset UtcNow
static readonly DateTimeOffset MinValue
static bool TryParse(ReadOnlySpan< char > input, IFormatProvider? formatProvider, DateTimeStyles styles, out DateTimeOffset result)
DateTimeOffset AddHours(double hours)
static bool operator>(DateTimeOffset left, DateTimeOffset right)
override string ToString()
static bool TryParse(ReadOnlySpan< char > input, out DateTimeOffset result)
static bool TryParseExact([NotNullWhen(true)] string? input, [NotNullWhen(true)] string?[]? formats, IFormatProvider? formatProvider, DateTimeStyles styles, out DateTimeOffset result)
static DateTimeOffset ParseExact(string input, string format, IFormatProvider? formatProvider, DateTimeStyles styles)
override int GetHashCode()
Definition DateTime.cs:886
TimeSpan Subtract(DateTime value)
Definition DateTime.cs:1002
static unsafe bool IsValidTimeWithLeapSeconds(int year, int month, int day, int hour, int minute, DateTimeKind kind)
Definition DateTime.cs:1487
long ToFileTime()
Definition DateTime.cs:1048
TimeSpan TimeOfDay
Definition DateTime.cs:126
static int Compare(DateTime t1, DateTime t2)
Definition DateTime.cs:546
DateTime ToLocalTime()
Definition DateTime.cs:1068
DateTime AddSeconds(double value)
Definition DateTime.cs:488
static unsafe DateTime UtcNow
Definition DateTime.cs:142
DateTime Date
Definition DateTime.cs:66
DateTime AddMinutes(double value)
Definition DateTime.cs:447
DateTime AddHours(double value)
Definition DateTime.cs:437
DateTime AddYears(int value)
Definition DateTime.cs:515
DayOfWeek DayOfWeek
Definition DateTime.cs:76
static DateTime SpecifyKind(DateTime value, DateTimeKind kind)
Definition DateTime.cs:756
DateTime AddMonths(int months)
Definition DateTime.cs:452
DateTime AddMilliseconds(double value)
Definition DateTime.cs:442
static DateTime FromFileTimeUtc(long fileTime)
Definition DateTime.cs:718
override bool Equals([NotNullWhen(true)] object? value)
Definition DateTime.cs:652
DateTime AddTicks(long value)
Definition DateTime.cs:493
DateTime AddDays(double value)
Definition DateTime.cs:432
static readonly bool s_systemSupportsLeapSeconds
Definition DateTime.cs:43
DateTime Add(TimeSpan value)
Definition DateTime.cs:413
static readonly TimeSpan Zero
Definition TimeSpan.cs:21