function ExpirationDate( Year, Month : integer ) : integer;
begin
var G_Date, G_Month, G_Year, G_Day : integer;
var n, y, m, d, w : integer;
function _jnbr( y, m, d : integer ) : integer;
begin
var a, s, j1, jd : float;
jd := -1 * Int( 7 * ( Int( ( m + 9 ) / 12 ) + y ) / 4 );
s := integer( ( ( m - 9 ) < 0 ) or 1 );
a := Abs( m - 9 );
j1 := Int( y + s * Int( a / 7 ) );
j1 := -1 * Int( ( Int( j1 / 100 ) + 1 ) * 3 / 4 );
jd := jd + Int( 275 * m / 9 ) + d + j1;
jd := jd + 1721029 + 367 * y;
Result := Int( jd );
end;
procedure _jdate( n : Integer );
begin
var d, t, w, x, y, z : float;
G_Date := 0;
G_Month := 0;
G_Year := 0;
G_Day := -1;
if ( n > 0 ) then
begin
x := n + 68569;
y := Trunc( 4 * x/146097 );
x := x-Trunc( ( 146097 * y + 3 )/4 );
z := Trunc( 4000 * ( x + 1 )/1461001 );
x := x-Trunc( 1461 * z/4 ) + 31;
w := Trunc( 80 * x/2447 );
t := x-Trunc( 2447 * w/80 );
x := Trunc( w/11 );
w := w + 2 - 12 * x;
z := 100 * ( y - 49 )+ z + x;
d := n + 0.5;
G_Date := Int( t );
G_Month := Int( w );
G_Year := Int( z );
G_Day := 1 + Trunc( ( d/7 - Trunc( d/7 ) )* 7 + 0.000000000317 );
end;
end;
function GoodFri( y : integer ) : integer;
begin
var r, n, p : integer;
var y1, a, b1, b, m1, m, q1, q, w1, w : float;
n := y - 1900;
y1 := n/19;
a := Trunc( ( y1 - Trunc( y1 ) ) * 19+0.001 );
b1 := ( 7*a+1 )/19;
b := Trunc( b1 );
m1 := ( 11 * a + 4 - b )/29;
m := Trunc( ( m1 - Trunc( m1 ) ) * 29 + 0.001 );
q1 := n/4;
q := Trunc( q1 );
w1 := ( n + q + 31 - m )/7;
w := Trunc( ( w1 - trunc( w1 ) ) * 7 + 0.001 );
r := Int( 25 - m - w );
p := Int( r );
if ( r <= 0 ) then p := 31 + r;
n := 4;
if ( r <= 0 ) then n := 3;
n := n - 1;
result := _jnbr( y, n + 1, p - 2 );
end;
for d := 15 to 21 do
begin
n := _jnbr( Year, Month, d );
_jdate( n );
d := G_Date;
w := G_Day;
if ( d >= 15 ) and ( d <= 21 ) and ( w = 5 ) then
begin
if n = GoodFri( Year ) then d := d - 1;
Result := Year*10000 + Month*100 + d;
Exit;
end;
end;
end;