\ProvidesFile{luatex.def}[2017/01/12 v0.01h Graphics/Color for luaTeX]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% LaTeX Colour and Graphics support for luatex
%%
%% License
%% =======
%%
%% Copyright (C) 2000-2017 LaTeX3 Project
%%
%% based on pdftex.def by the following authors
%% David Carlisle, Sebastian Rahtz, Hans Hagen,
%% Heiko Oberdiek and Martin Schr\"oder
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `maintained'.
%%
%% The Current Maintainer of this work is the LaTeX3 Project.
%%
%% https://github.com/latex3/graphics-def/issues
%%
%% This work consists of the file luatex.def.
%%
%% Usage
%% =====
%%
%% It may be used by specifying the luatex option to any of the
%% supported packages, for example:
%%
%% \usepackage[luatex]{graphicx}
%%
%% * luatex determines the bounding box of the images itself
%%   Therefore the bounding box options should not be used.
%%   In this cases a warning is issued and viewport is used instead.
%% * Option "page" (graphicx) for selecting a page of a multipage
%%   PDF document.
%% * \pagecolor is supported. \nopagecolor disables the page color.
%% * Option "quiet" (graphicx/experimental): log messages are suppressed.
%% * Option "resolution" (graphicx/experimental): this sets
%%   \pdfvariable imageresolution, see luaTeX documentation.
%% * Option "print" (graphicx/experimental): specifies an alternate
%%   print image (bitmaps only), see PDF specification.
%% * luatex.def can be used under plain-TeX with miniltx support.
%%
%% "Experimental" means that these features can change or vanish
%% in later versions.
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% History
%
% 2015/12/30 Version 0.01a derived from pdftex.def
% 2016/01/23 Version 0.01b Moved to latex3 github, documentation changes
% 2016/05/21 Version 0.01c fix for graphics/4472
% 2016/06/24 Version 0.01d support the (no)setpagesize option.
% 2016/06/17 Version 0.01e guards for contributed packages and plain TeX
% 2016/07/11 Version 0.01f test for \mag added to all drivers, missing \fi in pagebox 
% 2016/08/17 Version 0.01g Guard for non-LaTeX use
% 2017/01/12 Version 0.01h graphics options as viewport for graphics/4499
%
% Prefix of internal commands for this file `luatex.def':
% \GPT@ (Graphics bundle PdfTex driver, even though this is for luatex)


% if not luatex, complain,
% on old luatex, use pdftex.def
\ifx\luatexversion\@undefined
  \PackageError{graphics}{Unexpected luatex driver}{}
\else
  \ifnum\luatexversion<87\relax
    \input pdftex.def
    \expandafter\expandafter\expandafter\endinput
  \fi
\fi


\protected\edef\GPT@compresslevel       {\pdfvariable compresslevel}

\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname RequirePackage\endcsname\relax
  \input infwarerr.sty\relax
  \input ltxcmds.sty\relax
\else
  \RequirePackage{infwarerr}[2007/09/09]%
  \RequirePackage{ltxcmds}[2010/12/07]%
\fi

\def\GPT@error{\@PackageError{luatex.def}}%
\def\GPT@warn{\@PackageWarning{luatex.def}}%
\ifx\Gin@log\@undefined
  \def\Gin@log{\message}%
\fi
\def\GPT@info{\@PackageInfoNoLine{luatex.def}}%



% Ensure PDF mode
\ifnum\outputmode<1 %
  \GPT@error{%
    PDF mode expected, but DVI mode detected!\MessageBreak
    If you are using `dvilualatex', then call `lualatex'.\MessageBreak
    Otherwise check and  correct the driver options.\MessageBreak
    Error recovery by switching to PDF mode%
  }\@ehc
  \outputmode=1 %
\fi
\@ifundefined{ifGin@setpagesize}
  {\expandafter\let\csname ifGin@setpagesize\expandafter\endcsname
                    \csname iftrue\endcsname}
  {}
\ifGin@setpagesize
\ifx\paperwidth\@undefined\else
\AtBeginDocument{%
% If a package has changed \mag, assume it knows what it is doing
% and leave page size alone
\ifnum\mag=\@m
\ltx@IfUndefined{stockwidth}{%
  \ltx@IfUndefined{paperwidth}{%
  }{%
    \ifdim\paperwidth>0pt\relax
      \ifdim\paperheight>0pt\relax
        \pagewidth=\paperwidth
        \pageheight=\paperheight
      \fi
    \fi
  }%
}{%
  \ifdim\stockwidth>0pt\relax
    \ifdim\stockheight>0pt\relax
      \pagewidth=\stockwidth
      \pageheight=\stockheight
    \fi
  \fi
}%
\fi
}
\fi
\fi

% Colour Support. The following models may be used.
%   * cmyk   supported directly.
%   * rgb    supported directly.
%   * RGB    converted to rgb by this file.
%   * gray   supported directly.
%   * named  converted to cmyk by this file.
%
\def\c@lor@arg#1{%
  \dimen@#1\p@
  \ifdim\dimen@<\z@\dimen@\maxdimen\fi
  \ifdim\dimen@>\p@
    \PackageError{color}{Argument `#1' not in range [0,1]}\@ehd
  \fi
}
\def\color@cmyk#1#2{\c@lor@@cmyk#2\@@#1}
\def\c@lor@@cmyk#1,#2,#3,#4\@@#5{%
  \c@lor@arg{#4}%
  \c@lor@arg{#1}%
  \c@lor@arg{#2}%
  \c@lor@arg{#3}%
  \edef#5{#1 #2 #3 #4 k #1 #2 #3 #4 K}%
}
\def\color@gray#1#2{%
  \c@lor@arg{#2}%
  \edef#1{#2 g #2 G}%
}
\def\color@rgb#1#2{\c@lor@@rgb#2\@@#1}
\def\c@lor@@rgb#1,#2,#3\@@#4{%
  \c@lor@arg{#1}%
  \c@lor@arg{#2}%
  \c@lor@arg{#3}%
  \edef#4{#1 #2 #3 rg #1 #2 #3 RG}%
}
\def\color@RGB#1#2{\c@lor@@RGB#2\@@#1}
\def\c@lor@@RGB#1,#2,#3\@@#4{%
  \c@lor@RGB@rgb{#1}\@tempa
  \c@lor@RGB@rgb{#2}\@tempb
  \c@lor@RGB@rgb{#3}\@tempc
  \c@lor@@rgb\@tempa,\@tempb,\@tempc\@@#4%
}
\def\c@lor@RGB@rgb#1#2{%
  \dimen@#1\p@
  \divide\dimen@\@cclv
  \edef#2{\strip@pt\dimen@}%
}

\def\color@named#1#2{\c@lor@@named#2,,\@@#1}
\def\c@lor@@named#1,#2,#3\@@#4{%
  \ltx@IfUndefined{col@#1}{%
    \PackageError{color}{Undefined color `#1'}\@ehd
  }{%
    \edef#4{\csname col@#1\endcsname}%
  }%
}


  \chardef\main@pdfcolorstack=0 %
  \ltx@ifundefined{@pdfcolorstack}{%
    \def\@pdfcolorstack{\main@pdfcolorstack}%
  }{}%
  \def\set@color{%
    \pdfextension colorstack\@pdfcolorstack push{\current@color}%
    \aftergroup\reset@color
  }%
  \def\reset@color{%
    \pdfextension colorstack\@pdfcolorstack pop\relax
  }%

\def\define@color@named#1#2{%
  \expandafter\edef\csname col@#1\endcsname{#2}%
}
\def\current@color{0 g 0 G}

% v0.02t: support for \pagecolor
% fixed in v0.02p by using a box register, see
% http://tug.org/pipermail/pdftex/2005-August/005916.html
%
% v0.03r: \nopagecolor/\no@page@color added.
\ltx@newglobalif\ifGPT@pagecolor
\ltx@ifundefined{nopagecolor}{%
  \def\nopagecolor{\no@page@color}%
}{}
\def\no@page@color{%
  \GPT@pagecolorfalse
}
\def\set@page@color{%
  \GPT@pagecolortrue
  \global\let\current@page@color\current@color
  \ltx@ifundefined{GPT@outputbox}{%
    % \newbox is outer in plain
    \csname newbox\endcsname\GPT@outputbox
  }{}%
  \ltx@ifundefined{GPTorg@shipout}{%
    \global\let\GPTorg@shipout\shipout
    \gdef\shipout{%
      \edef\GPT@saved@grouplevel{\number\currentgrouplevel}%
      \afterassignment\GPT@shipout
      \global\setbox\GPT@outputbox=%
    }%
    \gdef\GPT@shipout{%
      \ifnum\GPT@saved@grouplevel=\currentgrouplevel
      \else
        \expandafter\aftergroup
      \fi
      \GPT@@shipout
    }%
    \gdef\GPT@@shipout{%
      \ifvoid\GPT@outputbox\relax
        \GPT@warn{Ignoring void output box}%
      \else
        \setbox\GPT@outputbox=\vbox{%
          \GPT@pageliteral
          \box\GPT@outputbox
        }%
        \GPTorg@shipout\box\GPT@outputbox\relax
      \fi
    }%
    \gdef\GPT@pageliteral{%
      \ifGPT@pagecolor
        \pdfextension literal page{%
          q % gsave
          \current@page@color\ltx@space
          n % newpath
          0 0 \strip@pt\pagewidth\ltx@space
          \strip@pt\pageheight\ltx@space re % rectangle
          % there is no need to convert to bp
          f % fill
          Q% grestore
        }%
      \fi
    }%
  }{}%
}




%
% Graphic inclusion. Currently supports .png, .jpg, .mps and .pdf inclusion;
% .mps is MetaPost output.
%
%
% support for
% * multipage pdf images 
% * alternate print image (bitmaps only)
%   * printed image can be resused, but not the base image,
%     because it's dictionary contains the additional key /Alternates.
%   * not supported by Ghostscript or xpdf.
% * option quiet
% * option resetcolor
% * option xmpfile
%
% \GPT@page: page number of pdf image or \ltx@empty otherwise.
\let\GPT@page\ltx@empty
% \GPT@print: file name for alternate image or \ltx@empty otherwise.
\let\GPT@print\ltx@empty
\let\GPT@xmpfile\ltx@empty
\let\GPT@pagebox\ltx@empty
\let\GPT@pagebox@\ltx@empty
\let\GPT@interpolate\ltx@empty
\let\GPT@decodearray\ltx@empty
\let\GPT@mask\ltx@empty
\let\GPT@intent\ltx@empty
\let\GPT@ocobjnum\ltx@empty
\ltx@newif\ifGPT@ResetColor
\let\GPT@ResetColorEnd\relax
\def\GPT@ResetColorBegin{%
  \ifGPT@ResetColor
    \ifGPT@IsBitmap
    \else
      \begingroup
      \normalcolor
      \let\GPT@ResetColorEnd\endgroup
    \fi
  \fi
}

% \pdfmatch may be emulated in lua
% (may be better to use lua patterns than bring in full
% regex, do nothing for now
  \def\GPT@match#1#2#3#4{}%
  \def\GPT@pat@real/{}%


\begingroup
  \toks@{%
    \define@key{Gin}{resetcolor}[true]{%
      \csname GPT@ResetColor%
        \expandafter\ifx\csname iftrue\expandafter\endcsname
                        \csname if#1\endcsname
          true%
        \else
          false%
        \fi
      \endcsname
    }%
%
      \define@key{Gin}{page}{%
        \def\GPT@page{#1}%
        \ifx\GPT@page\ltx@empty
        \else
          \edef\GPT@page{\number\GPT@page}%
        \fi
      }%
      \define@key{Gin}{print}{%
        \def\GPT@print{#1}%
      }%
%
      % option pagebox
      \define@key{Gin}{pagebox}{%
        \expandafter\let\expandafter\GPT@pagebox
            \csname GPT@pagebox@#1\endcsname
        \ifx\GPT@pagebox\relax
          \let\GPT@pagebox\ltx@empty
          \GPT@warn{%
            Unknown value `#1' for `pagebox'.\MessageBreak
            Supported values:\MessageBreak
            mediabox, cropbox, bleedbox, trimbox, artbox%
          }%
	\fi
      }%
      \def\GPT@pagebox@mediabox{mediabox}%
      \let\GPT@pagebox@cropbox\ltx@empty
      \def\GPT@pagebox@bleedbox{bleedbox}%
      \def\GPT@pagebox@trimbox{trimbox}%
      \def\GPT@pagebox@artbox{artbox}%
      % option interpolate
      \define@key{Gin}{interpolate}[true]{%
        \expandafter\let\expandafter\GPT@interpolate
            \csname GPT@interpolate@#1\endcsname
        \ifx\GPT@interpolate\relax
          \let\GPT@interpolate\ltx@empty
          \GPT@warn{%
            Unknown value `#1' for `interpolate'.\MessageBreak
            Supported values: true, false%
          }%
        \fi
      }%
      \let\GPT@interpolate@false\ltx@empty
      \def\GPT@interpolate@true{1}% non-empty, value does not matter
      % option decodearray
      \define@key{Gin}{decodearray}{%
        \def\GPT@decodearray{#1}%
        \ifx\GPT@decodearray\ltx@empty
        \else
          \GPT@match\GPT@decodearray{%
            ((^| )\GPT@pat@real/ \GPT@pat@real/)+$%
          }{}{%
            \GPT@warn{%
              Invalid value (\GPT@decodearray)\MessageBreak
              for `decodearray' is ignored%
            }%
            \let\GPT@decodearray\ltx@empty
          }%
        \fi
      }%
      % option maskarray
      \define@key{Gin}{maskarray}{%
        \def\GPT@mask{#1}%
        \ifx\GPT@mask\ltx@empty
        \else
          \GPT@match\GPT@mask{%
            ((^| )[0-9]+ [0-9]+)+$%
          }{}{%
            \GPT@warn{%
              Invalid value (\GPT@mask)\MessageBreak
              for `maskarray' is ignored%
            }%
            \let\GPT@mask\ltx@empty
          }%
          \ifx\GPT@mask\ltx@empty
          \else
            \edef\GPT@mask{[\GPT@mask]}%
          \fi
        \fi
      }%
      % option intent
      \define@key{Gin}{intent}{%
        \def\GPT@intent{#1}%
        \ifx\GPT@intent\ltx@empty
        \else
          \GPT@match\GPT@intent{%
            ^((Absolute|Relative)Colorimetric|Saturation|Perceptual)$%
          }{}{%
            \GPT@match\GPT@intent{%
              ^[A-Za-z0-9_]+$%
            }{%
              \GPT@warn{%
                Rendering intent `\GPT@intent'\MessageBreak
                is not a standard name of the PDF specification%
              }%
            }{%
              \GPT@warn{%
                Ignoring intent `\GPT@intent'\MessageBreak
                with unusual characters%
              }%
              \let\GPT@intent\ltx@empty
            }%
          }%
        \fi
      }%
      % option ocobjnum
      \define@key{Gin}{ocobjnum}{%
        \edef\GPT@ocobjnum{#1}%
        \ifx\GPT@ocobjnum\ltx@empty
        \else
          \edef\GPT@ocobjnum{\number\GPT@ocobjnum}%
          \GPT@match\GPT@ocobjnum{^[1-9]+[0-9]*$}{%
          }{%
            \GPT@warn{%
              Invalid value (\GPT@ocobjnum)\MessageBreak
              for `ocobjnum' is ignored%
            }%
            \let\GPT@ocobjnum\ltx@empty
          }%
          \ifx\GPT@ocobjnum\ltx@empty
          \else
            \edef\GPT@ocobjnum{\number\GPT@ocobjnum}%
          \fi
        \fi
      }%
      % option ocobjref
      \define@key{Gin}{ocobjref}{%
        \edef\GPT@ocobjnum{#1}%
        \ifx\GPT@ocobjnum\ltx@empty
        \else
          \edef\GPT@ocobjnum{%
            \expandafter\strip@prefix\meaning\GPT@ocobjnum
          }%
          \GPT@match\GPT@ocobjnum{^[1-9]+[0-9]* 0 R$}{%
          }{%
            \GPT@warn{%
              Invalid value (\GPT@ocobjnum)\MessageBreak
              for `ocobjref' is ignored%
            }%
            \let\GPT@ocobjnum\ltx@empty
          }%
          \ifx\GPT@ocobjnum\ltx@empty
          \else
            \begingroup
              \def\GPT@temp##1 ##2\@nil{\endgroup
                \def\GPT@ocobjnum{##1}%
              }%
            \expandafter\GPT@temp\GPT@ocobjnum\@nil
            \edef\GPT@ocobjnum{\number\GPT@ocobjnum}%
          \fi
        \fi
      }%
    \define@key{Gin}{quiet}[]{%
      \let\Gin@log\ltx@gobble
    }%
    \define@key{Gin}{resolution}{%
      \pdfvariable imageresolution#1\relax
    }%
    \define@key{Gin}{xmpfile}[\Gin@base.xmp]{%
      \def\GPT@xmpfile{#1}%
    }%
  }%
  \ltx@IfUndefined{define@key}{%
    \edef\x{\endgroup
      \noexpand\AtBeginDocument{%
        \noexpand\ltx@IfUndefined{define@key}{}{\the\toks@}%
      }%
    }\x
  }{%
    \expandafter\endgroup\the\toks@
  }%

% redefinitions of some graphicx options:
\def\GPT@disable#1{%
  \GPT@warn{%
    Option `#1' is not supported, use\MessageBreak
    option `viewport' instead%
  }%
}
\def\GPT@fix{%
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname define@key\endcsname\relax
  \else
    \def\KV@Gin@bb{%
      \GPT@warn{%
        Option `bb' does not make sense,\MessageBreak
        using `viewport' instead%
      }%
      \KV@Gin@viewport
    }%
    \define@key{Gin}{bbllx}{\GPT@disable{bbllx}}%
    \define@key{Gin}{bblly}{\GPT@disable{bblly}}%
    \define@key{Gin}{bburx}{\GPT@disable{bburx}}%
    \define@key{Gin}{bbury}{\GPT@disable{bbury}}%
  \fi
}
\AtBeginDocument{\GPT@fix}

%
% Check for image file existence
%
    \def\GPT@IfFileExists#1{%
      \IfFileExists{#1}%
    }%

%
% Wrapper for \Gread@... that checks image existence first.
%
\def\GPT@read#1#2{%
  \GPT@IfFileExists{#2}%
  {%
    #1{#2}%
  }{%
    \def\Gin@llx{0}%
    \let\Gin@lly\Gin@llx
    \def\Gin@urx{72}%
    \let\Gin@ury\Gin@urx
    \ifGin@draft
    \else
      \GPT@error{File `#2' not found}{%
        Using draft setting for this image.\MessageBreak
        \@ehc
      }%
      \Gin@drafttrue
    \fi
  }%
}

%
% mechanism for re-use of objects also
% allows us to get the size by deriving it from the initial storage;
% this works for all graphics types.
%
\ltx@ifundefined{Gread@gobject}{%
  \csname newcount\endcsname\Gread@gobject
}{}
\def\GPT@ReusedName#1{%
  \ifx\GPT@print\ltx@empty
    #1%
  \else
    \GPT@print
  \fi
}
\def\GPT@objref{ 0 R}
\def\Gread@pdftex{%
  \GPT@read\Gread@@pdftex
}
\def\Gread@@pdftex#1{%
  % Ensure that option `print' works only on bitmap images.
  \let\GPT@Attr\ltx@empty
  \let\GPT@AttrShort\ltx@empty
    \ifx\GPT@ocobjnum\ltx@empty
    \else
      \edef\GPT@AttrShort{\GPT@AttrShort
        :OC\GPT@ocobjnum
      }%
      \edef\GPT@Attr{\GPT@Attr
        /OC \GPT@ocobjnum\GPT@objref
      }%
    \fi
  \ifGPT@IsBitmap
    \let\GPT@page\ltx@empty
    \let\GPT@pagebox\ltx@empty
      \ifx\GPT@xmpfile\ltx@empty
      \else
        \ltx@IfUndefined{GPT@XMP@\GPT@xmpfile}{%
          \GPT@IMfFileExists{\GPT@xmpfile}{%
            \begingroup
              \GPT@compresslevel=0 %
              \immediate\pdfextension obj stream attr{%
                /Type/Metadata%
                /Subtype/XML%
              }file{\GPT@xmpfile}%
              \expandafter\xdef\csname GPT@XMP@\GPT@xmpfile\endcsname{%
                \the\numexpr\pdffeedback lastobj\relax
              }%
            \endgroup
          }{%
            \GPT@warn{Missing XMP file (\GPT@xmpfile)}%
          }%
        }{}%
        \ltx@IfUndefined{GPT@XMP@\GPT@xmpfile}{}{%
          \edef\GPT@Attr{\GPT@Attr
            /Metadata \@nameuse{GPT@XMP@\GPT@xmpfile}\GPT@objref
          }%
          \edef\GPT@AttrShort{\GPT@AttrShort
            :MD\@nameuse{GPT@XMP@\GPT@xmpfile}%
          }%
        }%
      \fi
      \ifx\GPT@interpolate\ltx@empty
      \else
        \edef\GPT@Attr{\GPT@Attr
          /Interpolate true%
        }%
        \edef\GPT@AttrShort{\GPT@AttrShort
          :I%
        }%
      \fi
      \ifx\GPT@decodearray\ltx@empty
      \else
        \edef\GPT@Attr{\GPT@Attr
          /Decode[\GPT@decodearray]%
        }%
        \edef\GPT@AttrShort{\GPT@AttrShort
          :D[\GPT@decodearray]%
        }%
      \fi
      \ifx\GPT@mask\ltx@empty
      \else
        \edef\GPT@Attr{\GPT@Attr
          /Mask\GPT@mask
        }%
        \edef\GPT@AttrShort{\GPT@AttrShort
          :M\GPT@mask
        }%
      \fi
      \ifx\GPT@intent\ltx@empty
      \else
        \edef\GPT@AttrShort{\GPT@AttrShort
          :RI\GPT@intent
        }%
          \edef\GPT@intent{\TODOescapename{\GPT@intent}}%
        \edef\GPT@Attr{\GPT@Attr
          /Intent/\GPT@intent
        }%
      \fi
  \else
    \let\GPT@interpolate\ltx@empty
    \let\GPT@decodearray\ltx@empty
    \let\GPT@mask\ltx@empty
    \let\GPT@intent\ltx@empty
    \ifx\GPT@page\ltx@empty
    \else
      \edef\GPT@AttrShort{\GPT@AttrShort
        :P\GPT@page
      }%
    \fi
    \ifx\GPT@pagebox\ltx@empty
    \else
      \edef\GPT@AttrShort{%
        \GPT@AttrShort
        :\expandafter\ltx@car\GPT@pagebox{}\@nil b%
      }%
    \fi
    \ifx\GPT@print\ltx@empty
    \else
      \GPT@warn{%
        Option `print' can only be used\MessageBreak
        for bitmap images%
      }%
      \let\GPT@print\ltx@empty
    \fi
  \fi
  % Check if print image exists.
  \ifx\GPT@print\ltx@empty
  \else
    \GPT@IfFileExists{\GPT@print}{%
    }{%
      \GPT@error{Print image `\GPT@print' not found}{%
        The print version of the image is ignored.\MessageBreak
        \@ehc
      }%
      \let\GPT@print\ltx@empty
    }%
  \fi
  % If option `print' is set, the screen image object
  % will contain an additional /Alternate entry
  % and will not be reused.
  \ifx\GPT@print\ltx@empty
  \else
    \expandafter\expandafter\expandafter\ltx@firstoftwo\expandafter\ltx@gobbletwo
  \fi
  \ltx@ifundefined{#1 image\GPT@AttrShort}{%
        \ifx\GPT@print\ltx@empty
          \ifx\GPT@Attr\ltx@empty
            \let\GPT@RuleAttr\ltx@empty
          \else
            \edef\GPT@RuleAttr{attr{\GPT@Attr}}%
          \fi
        \else
          \ltx@ifundefined{\GPT@print\ltx@space image\GPT@AttrShort}{%
            \immediate\saveimageresource{\GPT@print}%
            \setbox\@tempboxa=\hbox{\useimageresource\lastsavedimageresourceindex}%
            \edef\GPT@PrintObj{\the\lastsavedimageresourceindex}%
            \expandafter\xdef\csname\GPT@print\ltx@space
                image\GPT@AttrShort\endcsname{%
              \useimageresource\GPT@PrintObj\relax
            }%
            \immediate\pdfextension obj{%
              [<<%
                /Image \GPT@PrintObj\GPT@objref
                /DefaultForPrinting true%
              >>]%
            }%
            \def\GPT@RuleAttr{%
              width\wd\@tempboxa height\ht\@tempboxa
              attr{%
                \GPT@Attr
                /Alternates \the\numexpr\pdffeedback lastobj\relax\GPT@objref
              }%
            }%
          }{%
            \edef\GPT@PrintObj{%
              \expandafter\expandafter\expandafter\ltx@gobble
              \csname\GPT@print\ltx@space image\GPT@AttrShort\endcsname
            }%
            \immediate\pdfextension obj{%
              [<<%
                /Image \GPT@PrintObj\GPT@objref
                /DefaultForPrinting true%
              >>]%
            }%
            \def\GPT@RuleAttr{%
              width \csname\GPT@print\ltx@space width\GPT@AttrShort\endcsname
              height \csname\GPT@print\ltx@space height\GPT@AttrShort\endcsname
              attr{%
                \GPT@Attr
                /Alternates \the\numexpr\pdffeedback lastobj\relax\GPT@objref
              }%
            }%
          }%
        \fi
        \saveimageresource\GPT@RuleAttr
        \ifx\GPT@page\ltx@empty
        \else
          page \GPT@page
        \fi
        \GPT@pagebox
        {#1}%
        \setbox\@tempboxa=\hbox{\useimageresource\lastsavedimageresourceindex}%
    \def\Gin@llx{0}\let\Gin@lly\Gin@llx
    \Gin@defaultbp\Gin@urx{\wd\@tempboxa}%
    \Gin@defaultbp\Gin@ury{\ht\@tempboxa}%
    \expandafter\xdef\csname\GPT@ReusedName{#1} width\GPT@AttrShort\endcsname{%
      \the\wd\@tempboxa
    }%
    \expandafter\xdef\csname\GPT@ReusedName{#1} height\GPT@AttrShort\endcsname{%
      \the\ht\@tempboxa
    }%
      \expandafter\xdef\csname #1 image\GPT@AttrShort
        \ifx\GPT@print\ltx@empty\else!\fi\endcsname{%
        \useimageresource\the\lastsavedimageresourceindex
      }%
    \Gin@log{%
       <#1, id=%
         \the\lastsavedimageresourceindex
         \ifx\GPT@page\ltx@empty\else , page=\GPT@page\fi
         \ifx\GPT@pagebox\ltx@empty\else, pagebox=\GPT@pagebox\fi
         \ifx\GPT@interpolate\ltx@empty\else, interpolate=true\fi
         \ifx\GPT@print\ltx@empty
         \else
            , print=\GPT@print, id=\GPT@PrintObj
         \fi
       , \the\wd\@tempboxa\ltx@space x \the\ht\@tempboxa
       >%
     }%
  }{%
    \def\Gin@llx{0}\let\Gin@lly\Gin@llx
    \Gin@defaultbp\Gin@urx{\csname#1 width\GPT@AttrShort\endcsname}%
    \Gin@defaultbp\Gin@ury{\csname#1 height\GPT@AttrShort\endcsname}%
  }%
}
\def\Ginclude@pdftex#1{%
  % basic faking of viewport settings so graphic-s- interface
  % does something sensible
  \ifx\GPT@AttrShort\@undefined
    \GPT@info{Interpreting graphics options as viewport}%
    \let\GPT@AttrShort\@empty
    \let\Gin@vllx\Gin@llx
    \let\Gin@vlly\Gin@lly
    \let\Gin@vurx\Gin@urx
    \let\Gin@vury\Gin@ury
  \fi
  \def\@tempa{!}%
  \ifx\Gin@scaley\@tempa
    \let\Gin@scaley\Gin@scalex
  \else
    \ifx\Gin@scalex\@tempa\let\Gin@scalex\Gin@scaley\fi
  \fi
  \Gin@log{%
    <use #1%
    \ifx\GPT@page\ltx@empty\else, page \GPT@page\fi
    >%
  }%
  \GPT@info{%
    #1\ifx\GPT@page\ltx@empty\else, page\GPT@page\fi
    \ltx@space used\on@line.\MessageBreak
    Requested size: %
    \the\Gin@req@width\ltx@space x \the\Gin@req@height
  }%
  \hbox{%
    \GPT@ResetColorBegin
    \Gscale@box{\Gin@scalex}[\Gin@scaley]{%
      \ltx@IfUndefined{Gin@vllx}{%
        \GPT@viewportfalse
        % without viewport/trim clipping does not make sense
        % for pdfTeX
        \Gin@clipfalse
      }{}%
      \ifGin@clip
          \if!\Gin@vllx\Gin@vlly\Gin@vurx\Gin@vury!%
          \else
            \let\GPT@clipend\GPT@DoClipEnd
            \setbox\@tempboxa\hbox\bgroup
          \fi
        \fi
      \ifGPT@viewport
        \ifdim\Gin@vlly\p@=\z@
        \else
          \lower\Gin@vlly bp\hbox\bgroup
        \fi
        \ifdim\Gin@vllx\p@=\z@
        \else
          \hskip-\Gin@vllx bp\relax
        \fi
      \fi
      \csname#1 image\GPT@AttrShort
        \ifx\GPT@print\ltx@empty\else!\fi
      \endcsname
      \ifGPT@viewport
        \ifdim\Gin@vlly\p@=\z@
        \else
          \egroup
        \fi
        \GPT@clipend
      \fi
    }%
    \GPT@ResetColorEnd
  }%
}
\ltx@newif\ifGPT@viewport
\GPT@viewporttrue
\let\GPT@clipend\relax
\def\GPT@DoClipEnd{%
  \egroup
  \dp\@tempboxa\z@
  % \Gin@urx and \Gin@ury already contain the correct values,
  % so both cases viewport and trim can be handled together:
  \dimen@\Gin@urx\p@
  % v0.03k \Gin@vllx replaced by \Gin@llx
  \advance\dimen@ -\Gin@llx\p@
  \wd\@tempboxa\strip@pt\dimen@ bp\relax
  \dimen@\Gin@ury\p@
  % v0.03k \Gin@vlly replaced by \Gin@lly
  \advance\dimen@ -\Gin@lly\p@
  \ht\@tempboxa\strip@pt\dimen@ bp\relax
  \let\GPT@temp\ltx@empty
    \ifx\GPT@ocobjnum\ltx@empty
  \fi
  \expandafter\saveboxresource\GPT@temp\@tempboxa
  \useboxresource\lastsavedboxresourceindex
}
\ltx@newif\ifGPT@IsBitmap
\def\Gread@pdfbitmap#1{%
  \GPT@IsBitmaptrue
  \Gread@pdftex{#1}%
  \GPT@IsBitmapfalse
}

\edef\Gread@MBox{/MediaBox}
\def\Gread@pdf{%
  \GPT@read\Gread@@pdf
}
\def\Gread@@pdf#1{%
  \begingroup
    \@tempcnta\z@
    \loop
    \ifnum\@tempcnta<\@xxxii
      \catcode\@tempcnta14 %
      \advance\@tempcnta\@ne
    \repeat
    \catcode127=14 %
    \let\do\@makeother\dospecials\catcode`\ 10 %
    \catcode\endlinechar5 %
    \immediate\openin\@inputcheck#1 %
    \ifeof\@inputcheck
      \@latex@error{File `#1' not found}\@ehc
    \else
      \Gread@true
      \let\@tempb\Gread@false
      \loop
% v0.02e: use \. not \@tempa so the space is preserved before [
        \read\@inputcheck to\.%
        \ifeof\@inputcheck
          \Gread@false
        \else
          \expandafter\Gread@find@mbox\. []\\%
        \fi
      \ifGread@
      \repeat
      \immediate\closein\@inputcheck
    \fi
    \ifGin@bbox
    \else
      \@latex@error
      {Cannot determine size of graphic in #1 (no BoundingBox)}%
      \@ehc
      \gdef\@gtempa{0 0 72 72 }%
    \fi
  \endgroup
  \expandafter\Gread@parse@bb\@gtempa\\%
}
\long\def\Gread@find@mbox#1 [#2]#3\\{% hash-ok
  \def\@tempa{#1}%
  \ifx\@tempa\Gread@MBox
    \gdef\@gtempa{#2 }%
    \@tempb
    \Gin@bboxtrue
  \fi
}

\def\Ginclude@mps#1{%
  \def\@tempa{!}%
  \ifx\Gin@scaley\@tempa
    \let\Gin@scaley\Gin@scalex
  \else
    \ifx\Gin@scalex\@tempa\let\Gin@scalex\Gin@scaley\fi
  \fi
  \hbox{%
    \GPT@ResetColorBegin
    \Gscale@box{\Gin@scalex}[\Gin@scaley]{%
      \ltx@IfUndefined{Gin@vllx}{%
        \GPT@viewportfalse
        % without viewport/trim clipping does not make sense
        % for pdfTeX
        \Gin@clipfalse
      }{}%
      \ifGin@clip
          \if!\Gin@vllx\Gin@vlly\Gin@vurx\Gin@vury!%
          \else
            \let\GPT@clipend\GPT@DoClipEnd
            \setbox\@tempboxa\hbox\bgroup
          \fi
        \fi
      \ifGPT@viewport
        \ifdim\Gin@vlly\p@=\z@
        \else
          \lower\Gin@vlly bp\hbox\bgroup
        \fi
        \ifdim\Gin@vllx\p@=\z@
        \else
          \hskip-\Gin@vllx bp\relax
        \fi
      \fi
%%%%%      \GPT@catcodes{mps}%
      \convertMPtoPDF{#1}{1}{1}%
%%%%%      \GPT@restore@mps
      \ifGPT@viewport
        \ifdim\Gin@vlly\p@=\z@
        \else
          \egroup
        \fi
        \GPT@clipend
      \fi
    }%
    \GPT@ResetColorEnd
  }%
}
\def\Gread@mps{%
  \GPT@read\Gread@eps
}
  \let\Ginclude@png\Ginclude@pdftex
  \let\Ginclude@jpg\Ginclude@pdftex
  \let\Ginclude@pdf\Ginclude@pdftex
  \let\Gread@pdf\Gread@pdftex
  \let\Gread@png\Gread@pdfbitmap
  \let\Gread@jpg\Gread@pdfbitmap
        \expandafter\let\csname Gread@jbig2\endcsname\Gread@pdfbitmap
        \expandafter\let\csname Ginclude@jbig2\endcsname\Ginclude@pdftex

  \@namedef{Gin@rule@.jpg}#1{{jpg}{.jpg}{#1}}%
  \@namedef{Gin@rule@.jpeg}#1{{jpg}{.jpeg}{#1}}%
  \@namedef{Gin@rule@.JPG}#1{{jpg}{.JPG}{#1}}%
  \@namedef{Gin@rule@.JPEG}#1{{jpg}{.JPEG}{#1}}%
       \def\Gin@extensions{%
          .png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,%
          .PNG,.PDF,.JPG,.JPEG,.JBIG2,.JB2}%
        \@namedef{Gin@rule@.jb2}#1{{jbig2}{.jb2}{#1}}%
        \@namedef{Gin@rule@.jbig2}#1{{jbig2}{.jbig2}{#1}}%

\@namedef{Gin@rule@.png}#1{{png}{.png}{#1}}
\@namedef{Gin@rule@.PNG}#1{{png}{.PNG}{#1}}
\@namedef{Gin@rule@.mps}#1{{mps}{.mps}{#1}}
\@namedef{Gin@rule@.pdf}#1{{pdf}{.pdf}{#1}}
\@namedef{Gin@rule@.PDF}#1{{pdf}{.PDF}{#1}}
\@namedef{Gin@rule@.eps}#1{{eps}{.eps}{#1}}


% Rotation
% slightly hacky, but set width of box 0 to 0pt otherwise
% the CTM gets restored in the wrong place.

\def\GPT@MatrixIdentity{1 0 0 1}
\def\GPT@Zero{0}
\def\GPT@Minus{-}
\def\GPT@NormalizeNumber#1{%
  \edef#1{#1}%
  \edef#1{\expandafter\ltx@zapspace\expandafter{#1}}%
  \edef#1{\expandafter\GPT@ZapPlus#1+\@nil}%
  \edef#1{\expandafter\GPT@ZapMinusMinus#1--\@nil}%
  \expandafter\GPT@Split#1..\@nil
  \ifx\GPT@frac\ltx@empty
  \else
    \edef\GPT@frac{%
      \expandafter\GPT@Reverse\expandafter{\expandafter}\GPT@frac\@nil
    }%
    \edef\GPT@frac{%
      \expandafter\GPT@ZapLeadingZeros\GPT@frac\ltx@empty
    }%
    \ifx\GPT@frac\ltx@empty
    \else
      \edef\GPT@frac{%
        \expandafter\GPT@Reverse\expandafter{\expandafter}\GPT@frac\@nil
      }%
    \fi
  \fi
  \edef\GPT@sign{\expandafter\ltx@car\GPT@int\ltx@empty\@nil}%
  \ifx\GPT@sign\GPT@Minus
    \edef\GPT@int{\expandafter\ltx@cdr\GPT@int\@nil}%
  \else
    \def\GPT@sign{}%
  \fi
  \edef\GPT@int{%
    \expandafter\GPT@ZapLeadingZeros\GPT@int\ltx@empty
  }%
  \edef\GPT@temp{\GPT@int\GPT@frac}%
  \ifx\GPT@temp\ltx@empty
    \def#1{0}%
  \else
    \edef#1{%
      \GPT@sign
      \GPT@int
      \ifx\GPT@frac\ltx@empty
      \else
        .\GPT@frac
      \fi
    }%
  \fi
}
\def\GPT@ZapPlus#1+#2\@nil{%
  #1%
  \ifx\ltx@empty#2\ltx@empty
    \expandafter\ltx@gobble
  \else
    \expandafter\@firstofone
  \fi
  {%
    \GPT@ZapPlus#2\@nil
  }%
}
\def\GPT@ZapMinusMinus#1--#2\@nil{%
  #1%
  \ifx\ltx@empty#2\ltx@empty
    \expandafter\ltx@gobble
  \else
    \expandafter\@firstofone
  \fi
  {%
    \GPT@ZapMinusMinus#2\@nil
  }%
}
\def\GPT@Split#1.#2.#3\@nil{%
  \def\GPT@int{#1}%
  \ifx\ltx@empty#2\ltx@empty
    \let\GPT@frac\ltx@empty
  \else
    \def\GPT@frac{#2}%
  \fi
}
\def\GPT@Reverse#1#2#3\@nil{%
  \ifx\ltx@empty#3\ltx@empty
    #2#1%
    \expandafter\ltx@gobble
  \else
    \expandafter\ltx@firstofone
  \fi
  {%
    \GPT@Reverse{#2#1}#3\@nil
  }%
}
\def\GPT@ZapLeadingZeros#1{%
  \ifx0#1%
    \expandafter\GPT@ZapLeadingZeros
  \else
    #1%
  \fi
}
  \def\Grot@start{%
    \GPT@NormalizeNumber\Grot@sin
    \GPT@NormalizeNumber\Grot@cos
    \edef\GPT@temp{%
      \Grot@cos\ltx@space\Grot@sin\ltx@space
      \if-\Grot@sin
      \else
        \ifx\Grot@sin\GPT@Zero
          \GPT@Zero
        \else
          -\Grot@sin
        \fi
      \fi
      \ltx@space\Grot@cos
    }%
    \ifx\GPT@temp\GPT@MatrixIdentity
      \def\Grot@end{}%
    \else
      \pdfextension save\relax
      \pdfextension setmatrix{\GPT@temp}%
      \wd\z@\z@
    \fi
  }%
  \def\Grot@end{\pdfextension restore\relax}%
  \def\Gscale@start{%
    \GPT@NormalizeNumber\Gscale@x
    \GPT@NormalizeNumber\Gscale@y
    \edef\GPT@temp{%
      \Gscale@x\ltx@space0 0 \Gscale@y
    }%
    \ifx\GPT@temp\GPT@MatrixIdentity
      \def\Gscale@end{}%
    \else
      \pdfextension save\relax
      \pdfextension setmatrix{\GPT@temp}%
    \fi
  }%

\let\Gscale@end\Grot@end

% Trig patching no longer needed (trig.sty updated)


% MPS conversion
\def\GPT@LoadSuppPdf{%
  \ltx@IfUndefined{convertMPtoPDF}{%
%%%%%    \GPT@catcodes{supp}%
    \InputIfFileExists{supp-pdf.mkii}{}{%
      \InputIfFileExists{supp-pdf}{}{}%
    }%
%%%%%%    \GPT@restore@supp
  }{%
    % supp-pdf is probably already loaded.
  }%
  % If supp-pdf is not available, \convertMPtoPDF generates
  % an error message. \providecommand inside the third argument
  % of \InputIfFileExists will not work:
  % * \InputIfFileExists has problems with parameters (#1).
  % * Implementation of \providecommand is insufficient in miniltx.tex
  \ltx@ifundefined{convertMPtoPDF}{%
% 2016/05/21 v0.01c use \newcommand here not \newcommand*  graphics/4472
\newcommand{\convertMPtoPDF}[3]{%
      \GPT@error{%
        Cannot convert ##1 from MPS to PDF.\MessageBreak
        The support file `supp-pdf.mkii' (supp-pdf.tex) is missing%
      }{%
        The graphics driver for pdfTeX needs `supp-pdf.mkii'\MessageBreak
        (or `supp-pdf.tex' and/or `supp-mis.tex')\MessageBreak
        to convert MetaPost output files to PDF.\MessageBreak
        These files are part of ConTeXt and can also be found here:%
        \MessageBreak
        \ltx@space\ltx@space CTAN:macros/pdftex/graphics/\MessageBreak
        You'll get more errors if you'll continue now.%
      }%
    }%
  }{}%
  \let\GPT@LoadSuppPdf\relax
}
\AtBeginDocument{%
  \GPT@LoadSuppPdf
}

% Adds support for extended MetaPost features (transparency)
%  \GPT@catcodes removed
% should replace with luatex catcodetable support, TODO
\def\LoadMetaPostSpecialExtensions{%
  \AtBeginDocument{%
    \ltx@IfUndefined{assignMPStransparency}{%
%%%%      \GPT@catcodes{mpe}%
      \let\GPT@found=N%
      \IfFileExists{supp-pdf.mkii}{\let\GPT@found=Y}{%
        \IfFileExists{supp-pdf}{\let\GPT@found=Y}{}%
      }%
      \ifx Y\GPT@found
        \InputIfFileExists{supp-mis.mkii}{}{%
          \InputIfFileExists{supp-mis}{}{\let\GPT@found=N}%
        }%
        \ifx Y\GPT@found
          \InputIfFileExists{supp-mpe.mkii}{}{%
            \InputIfFileExists{supp-mpe}{}{\let\GPT@found=N}%
          }%
          \ifx Y\GPT@found
            \MPcmykcolorstrue
            \MPspotcolorstrue
            \chardef\makeMPintoPDFobject=1 %
          \else
            \GPT@warn{%
              Cannot enable MetaPost Special Extensions,\MessageBreak
              because `supp-mpe.mkii' (or `supp-mpe.tex')\MessageBreak
              is missing%
            }%
          \fi
        \else
          \GPT@warn{%
            Cannot enable MetaPost Special Extensions,\MessageBreak
            because `supp-mis.mkii' (or `supp-mis.tex')\MessageBreak
            is missing%
          }%
        \fi
      \else
        \GPT@warn{%
          Cannot enable support for MetaPost images,\MessageBreak
          because `supp-pdf.mkii' (or `supp-pdf.tex')\MessageBreak
          is missing%
        }%
      \fi
%%%      \GPT@restore@mpe
    }{}%
  }%
  \let\LoadMetaPostSpecialExtensions\relax
}
\ltx@IfUndefined{@onlypreamble}{%
}{%
  \@onlypreamble\LoadMetaPostSpecialExtensions
}


% Bail out here if it's not latex or a better emulation than miniltx
\ifx\@ifpackageloaded\@undefined\expandafter\endinput\fi

\ifx\DoNotLoadEpstopdf\@undefined
% EPS to PDF conversion
% delay to begin document to check graphics is loaded (shared
% config with color) if \DoNotLoadEpstopdf is defined (to anything)
% skip this.
 \AtBeginDocument{%
   \ifx\includegraphics\@undefined\else
        \@ifpackageloaded{pst-pdf}{}{%
          \@ifpackageloaded{pdftricks}{}{%
	   % only add .eps to file extension list if epstopdf is loaded
	    \edef\Gin@extensions{\Gin@extensions,.eps}%
            \RequirePackage{epstopdf-base}%
	    }%
	    }%
   \fi
  }
\fi