#include <tuple>
#include <type_traits>
#include <vector>
template<typename T>
struct innermost_impl
{
using type = T;
};
template<template<typename...> class E, typename Head, typename... Tail>
struct innermost_impl<E<Head, Tail...>>
{
using type = typename innermost_impl<Head>::type;
};
template<typename T>
using innermost = typename innermost_impl<T>::type;
template<class>
struct X;
static_assert(std::is_same<innermost<X<X<X<int>>>>, int>::value, "");
static_assert(std::is_same<innermost<std::vector<X<std::vector<int>>>>, int>::value, "");
int main()
{
}
ICAgICNpbmNsdWRlIDx0dXBsZT4KICAgICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KICAgICNpbmNsdWRlIDx2ZWN0b3I+CiAgICAKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBzdHJ1Y3QgaW5uZXJtb3N0X2ltcGwKICAgIHsKICAgICAgICB1c2luZyB0eXBlID0gVDsKICAgIH07CiAgICAKICAgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBjbGFzcyBFLCB0eXBlbmFtZSBIZWFkLCB0eXBlbmFtZS4uLiBUYWlsPgogICAgc3RydWN0IGlubmVybW9zdF9pbXBsPEU8SGVhZCwgVGFpbC4uLj4+CiAgICB7CiAgICAgICAgdXNpbmcgdHlwZSA9IHR5cGVuYW1lIGlubmVybW9zdF9pbXBsPEhlYWQ+Ojp0eXBlOwogICAgfTsKICAgIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHVzaW5nIGlubmVybW9zdCA9IHR5cGVuYW1lIGlubmVybW9zdF9pbXBsPFQ+Ojp0eXBlOwogICAgCiAgICB0ZW1wbGF0ZTxjbGFzcz4KICAgIHN0cnVjdCBYOwogICAgCiAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxpbm5lcm1vc3Q8WDxYPFg8aW50Pj4+PiwgaW50Pjo6dmFsdWUsICIiKTsKICAgIAogICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8aW5uZXJtb3N0PHN0ZDo6dmVjdG9yPFg8c3RkOjp2ZWN0b3I8aW50Pj4+PiwgaW50Pjo6dmFsdWUsICIiKTsKICAgIAogICAgaW50IG1haW4oKQogICAgewogICAgfQ==