\input{header}
\begin{tikzpicture}

\begin{component}{20cm}{1}{0}{CachedGreeterComponent with replacement}

\begin{component}{4cm}{7.5}{0}{GreeterComponent}
\end{component}

\begin{component}{4cm}{7.5}{2.5}{FakeKeyValueStorageComponent}
\end{component}

\newcomponent{0}{1.3}{CachedGreeterImpl}

\umlassemblyconnector[interface=Greeter]{GreeterComponent}{CachedGreeterImpl}
\umlassemblyconnector[interface=KeyValueStorage]{FakeKeyValueStorageComponent}{CachedGreeterImpl}

\umlprovidedinterface[interface={Annotated<Cached,Greeter>}, distance=4.3, with port, padding=2.1cm]{CachedGreeterImpl}

\end{component}
\umlprovidedinterface[interface={Annotated<Cached,Greeter>}, distance=11.2, with port, padding=0.2cm]{CachedGreeterComponent with replacement}

\umldep{CachedGreeterImpl-west-interface}{CachedGreeterComponent with replacement-west-port}

\end{tikzpicture}
\input{footer}