#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T1> void sortA_L( int N, T1 a[ ] , void * mem = wmem) {
sort( a, a+ N) ;
}
template < class T1, class T2> void sortA_L( int N, T1 a[ ] , T2 b[ ] , void * mem = wmem) {
int i;
pair< T1, T2> * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first = a[ i] ;
arr[ i] .second = b[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first ;
b[ i] = arr[ i] .second ;
}
}
template < class T1> void rsortA_L( int N, T1 a[ ] , void * mem = wmem) {
sortA_L( N, a, mem) ;
reverse( a, a+ N) ;
}
template < class T1, class T2> void rsortA_L( int N, T1 a[ ] , T2 b[ ] , void * mem = wmem) {
sortA_L( N, a, b, mem) ;
reverse( a, a+ N) ;
reverse( b, b+ N) ;
}
template < class T> struct Arr1d{
int n;
int mem;
T* d;
T& operator[ ] ( int a) {
return d[ a] ;
}
void sort( ) {
reset( ) ;
std:: sort ( d, d+ n) ;
}
int set_cumulative_sum;
int cumulative_sum_mem;
T* cumulative_sum;
void setSum( void ) {
int i;
set_cumulative_sum = 1 ;
if ( cumulative_sum_mem < n+ 1 ) {
delete [ ] cumulative_sum;
cumulative_sum = new T[ n+ 1 ] ;
cumulative_sum_mem = n+ 1 ;
}
cumulative_sum[ 0 ] = 0 ;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
cumulative_sum[ i+ 1 ] = cumulative_sum[ i] + d[ i] ;
}
}
T getSum( int i, int j) {
if ( set_cumulative_sum== 0 ) {
setSum( ) ;
}
return cumulative_sum[ j+ 1 ] - cumulative_sum[ i] ;
}
int set_const_len_left;
int const_len_left_mem;
int * const_len_left;
void setConstLenLeft( void ) {
int i;
set_const_len_left = 1 ;
if ( const_len_left_mem < n) {
delete [ ] const_len_left;
const_len_left = new int [ n] ;
const_len_left_mem = n;
}
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
const_len_left[ i] = 1 ;
}
for ( i= ( 1 ) ; i< ( n) ; i++ ) {
if ( d[ i] == d[ i- 1 ] ) {
const_len_left[ i] = const_len_left[ i- 1 ] + 1 ;
}
}
}
int ConstLenLeft( int st, T val) {
if ( ! set_const_len_left) {
setConstLenLeft( ) ;
}
if ( val ! = d[ st] ) {
return 0 ;
}
return const_len_left[ st] ;
}
int ConstLenLeft( int st) {
if ( ! set_const_len_left) {
setConstLenLeft( ) ;
}
return const_len_left[ st] ;
}
int ConstLenLeftCyclic( int st, T val) {
if ( ! set_const_len_left) {
setConstLenLeft( ) ;
}
st % = n;
if ( st < 0 ) {
st + = n;
}
if ( val ! = d[ st] ) {
return 0 ;
}
if ( const_len_left[ st] ! = st+ 1 || d[ st] ! = d[ n- 1 ] ) {
return const_len_left[ st] ;
}
if ( const_len_left[ n- 1 ] == n) {
return 1073709056 ;
}
return const_len_left[ st] + const_len_left[ n- 1 ] ;
}
int ConstLenLeftCyclic( int st) {
if ( ! set_const_len_left) {
setConstLenLeft( ) ;
}
st % = n;
if ( st < 0 ) {
st + = n;
}
if ( const_len_left[ st] ! = st+ 1 || d[ st] ! = d[ n- 1 ] ) {
return const_len_left[ st] ;
}
if ( const_len_left[ n- 1 ] == n) {
return 1073709056 ;
}
return const_len_left[ st] + const_len_left[ n- 1 ] ;
}
int set_const_len_right;
int const_len_right_mem;
int * const_len_right;
void setConstLenRight( void ) {
int i;
set_const_len_right = 1 ;
if ( const_len_right_mem < n) {
delete [ ] const_len_right;
const_len_right = new int [ n] ;
const_len_right_mem = n;
}
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
const_len_right[ i] = 1 ;
}
for ( i= ( n- 1 ) - 1 ; i>= ( 0 ) ; i-- ) {
if ( d[ i] == d[ i+ 1 ] ) {
const_len_right[ i] = const_len_right[ i+ 1 ] + 1 ;
}
}
}
int ConstLenRight( int st, T val) {
if ( ! set_const_len_right) {
setConstLenRight( ) ;
}
if ( val ! = d[ st] ) {
return 0 ;
}
return const_len_right[ st] ;
}
int ConstLenRight( int st) {
if ( ! set_const_len_right) {
setConstLenRight( ) ;
}
return const_len_right[ st] ;
}
int ConstLenRightCyclic( int st, T val) {
if ( ! set_const_len_right) {
setConstLenRight( ) ;
}
if ( val ! = d[ st] ) {
return 0 ;
}
st % = n;
if ( st < 0 ) {
st + = n;
}
if ( const_len_right[ st] ! = n- st || d[ st] ! = d[ 0 ] ) {
return const_len_right[ st] ;
}
if ( const_len_right[ 0 ] == n) {
return 1073709056 ;
}
return const_len_right[ st] + const_len_right[ 0 ] ;
}
int ConstLenRightCyclic( int st) {
if ( ! set_const_len_right) {
setConstLenRight( ) ;
}
st % = n;
if ( st < 0 ) {
st + = n;
}
if ( const_len_right[ st] ! = n- st || d[ st] ! = d[ 0 ] ) {
return const_len_right[ st] ;
}
if ( const_len_right[ 0 ] == n) {
return 1073709056 ;
}
return const_len_right[ st] + const_len_right[ 0 ] ;
}
int set_dhist;
int dhist_mem;
int * dhist;
T dhist_mn;
T dhist_mx;
void setDHist( void ) {
int i;
int len;
set_dhist = 1 ;
if ( n== 0 ) {
return ;
}
dhist_mn = dhist_mx = d[ 0 ] ;
for ( i= ( 1 ) ; i< ( n) ; i++ ) {
if ( dhist_mn > d[ i] ) {
dhist_mn = d[ i] ;
}
if ( dhist_mx < d[ i] ) {
dhist_mx = d[ i] ;
}
}
len = dhist_mx - dhist_mn + 1 ;
if ( dhist_mem < len) {
delete [ ] dhist;
dhist = new int [ len] ;
dhist_mem = len;
}
for ( i= ( 0 ) ; i< ( len) ; i++ ) {
dhist[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
dhist[ d[ i] - dhist_mn] ++ ;
}
}
int dHist( T x) {
if ( set_dhist== 0 ) {
setDHist( ) ;
}
if ( n == 0 || x < dhist_mn || x > dhist_mx) {
return 0 ;
}
return dhist[ x - dhist_mn] ;
}
void reset( ) {
set_cumulative_sum = 0 ;
set_const_len_left = 0 ;
set_const_len_right = 0 ;
set_dhist = 0 ;
}
void memory_expand( int nn) {
if ( mem < nn) {
delete [ ] d;
d = new T[ nn] ;
mem = nn;
}
}
void malloc ( int nn) {
reset( ) ;
memory_expand( nn) ;
n = nn;
}
void setN( int nn) {
reset( ) ;
memory_expand( nn) ;
n = nn;
}
void set( vector< T> & a) {
int i;
int nn = a.size ( ) ;
setN( nn) ;
for ( i= ( 0 ) ; i< ( nn) ; i++ ) {
d[ i] = a[ i] ;
}
}
void set( int nn, T a[ ] ) {
int i;
setN( nn) ;
for ( i= ( 0 ) ; i< ( nn) ; i++ ) {
d[ i] = a[ i] ;
}
}
void free ( ) {
destructor( ) ;
}
void constructor( ) {
n = mem = 0 ;
d = NULL ;
set_cumulative_sum = 0 ;
cumulative_sum_mem = 0 ;
cumulative_sum = NULL ;
set_const_len_left = 0 ;
const_len_left_mem = 0 ;
const_len_left = NULL ;
set_const_len_right = 0 ;
const_len_right_mem = 0 ;
const_len_right = NULL ;
set_dhist = 0 ;
dhist_mem = 0 ;
dhist = NULL ;
}
void constructor( int nn) {
constructor( ) ;
malloc ( nn) ;
}
void destructor( ) {
delete [ ] d;
d = NULL ;
mem = n = 0 ;
set_cumulative_sum = 0 ;
cumulative_sum_mem = 0 ;
delete [ ] cumulative_sum;
cumulative_sum = NULL ;
set_const_len_left = 0 ;
const_len_left_mem = 0 ;
delete [ ] const_len_left;
const_len_left = NULL ;
set_const_len_right = 0 ;
const_len_right_mem = 0 ;
delete [ ] const_len_right;
const_len_right = NULL ;
set_dhist = 0 ;
dhist_mem = 0 ;
delete [ ] dhist;
dhist = NULL ;
}
Arr1d( ) {
constructor( ) ;
}
Arr1d( int nn) {
constructor( nn) ;
}
~Arr1d( ) {
destructor( ) ;
}
}
;
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
Arr1d< int > arr;
int v[ 100 ] ;
int f[ 100 ] ;
class Solution{
public :
vector< int > frequencySort( vector< int > & A) {
int i;
dummy_main( ) ;
int N = A.size ( ) ;
vector< int > res;
arr.set ( A) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
{
auto Q5VJL1cS = ( A[ i] ) ;
auto e98WHCEY = ( - arr.dHist ( A[ i] ) ) ;
v[ i] = Q5VJL1cS;
f[ i] = e98WHCEY;
}
}
rsortA_L( N, f, v) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
res.push_back ( v[ i] ) ;
}
return res;
}
}
;
// cLay varsion 20201031-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// Arr1d<int> arr;
// int v[100], f[100];
//
// class Solution {
// public:
// vector<int> frequencySort(vector<int>& A) {
// dummy_main();
// int N = A.size();
// vector<int> res;
//
// arr.set(A);
// rep(i,N) (v[i], f[i]) = (A[i], -arr.dHist(A[i]));
//
// rsortA(N, f, v);
// rep(i,N) res.push_back(v[i]);
//
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQqd21lbTsKY2hhciBtZW1hcnJbOTYwMDAwMDBdOwp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MxZChUICoqYXJyLCBpbnQgeCwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICBzdGF0aWMgaW50IHNraXBbMTZdID0gezAsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDF9OwogICgqbWVtKSA9ICh2b2lkKikoICgoY2hhciopKCptZW0pKSArIHNraXBbKCh1bnNpZ25lZCBsb25nIGxvbmcpKCptZW0pKSAmIDE1XSApOwogICgqYXJyKT0oVCopKCptZW0pOwogICgqbWVtKT0oKCphcnIpK3gpOwp9CnRlbXBsYXRlPGNsYXNzIFQxPiB2b2lkIHNvcnRBX0woaW50IE4sIFQxIGFbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgc29ydChhLCBhK04pOwp9CnRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4gdm9pZCBzb3J0QV9MKGludCBOLCBUMSBhW10sIFQyIGJbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgaW50IGk7CiAgcGFpcjxUMSwgVDI+KmFycjsKICB3YWxsb2MxZCgmYXJyLCBOLCAmbWVtKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFycltpXS5maXJzdCA9IGFbaV07CiAgICBhcnJbaV0uc2Vjb25kID0gYltpXTsKICB9CiAgc29ydChhcnIsIGFycitOKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFbaV0gPSBhcnJbaV0uZmlyc3Q7CiAgICBiW2ldID0gYXJyW2ldLnNlY29uZDsKICB9Cn0KdGVtcGxhdGU8Y2xhc3MgVDE+IHZvaWQgcnNvcnRBX0woaW50IE4sIFQxIGFbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgc29ydEFfTChOLCBhLCBtZW0pOwogIHJldmVyc2UoYSwgYStOKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+IHZvaWQgcnNvcnRBX0woaW50IE4sIFQxIGFbXSwgVDIgYltdLCB2b2lkICptZW0gPSB3bWVtKXsKICBzb3J0QV9MKE4sIGEsIGIsIG1lbSk7CiAgcmV2ZXJzZShhLCBhK04pOwogIHJldmVyc2UoYiwgYitOKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgQXJyMWR7CiAgaW50IG47CiAgaW50IG1lbTsKICBUKmQ7CiAgVCYgb3BlcmF0b3JbXShpbnQgYSl7CiAgICByZXR1cm4gZFthXTsKICB9CiAgdm9pZCBzb3J0KCl7CiAgICByZXNldCgpOwogICAgc3RkOjpzb3J0KGQsIGQrbik7CiAgfQogIGludCBzZXRfY3VtdWxhdGl2ZV9zdW07CiAgaW50IGN1bXVsYXRpdmVfc3VtX21lbTsKICBUKmN1bXVsYXRpdmVfc3VtOwogIHZvaWQgc2V0U3VtKHZvaWQpewogICAgaW50IGk7CiAgICBzZXRfY3VtdWxhdGl2ZV9zdW0gPSAxOwogICAgaWYoY3VtdWxhdGl2ZV9zdW1fbWVtIDwgbisxKXsKICAgICAgZGVsZXRlW10gY3VtdWxhdGl2ZV9zdW07CiAgICAgIGN1bXVsYXRpdmVfc3VtID0gbmV3IFRbbisxXTsKICAgICAgY3VtdWxhdGl2ZV9zdW1fbWVtID0gbisxOwogICAgfQogICAgY3VtdWxhdGl2ZV9zdW1bMF0gPSAwOwogICAgZm9yKGk9KDApO2k8KG4pO2krKyl7CiAgICAgIGN1bXVsYXRpdmVfc3VtW2krMV0gPSBjdW11bGF0aXZlX3N1bVtpXSArIGRbaV07CiAgICB9CiAgfQogIFQgZ2V0U3VtKGludCBpLCBpbnQgail7CiAgICBpZihzZXRfY3VtdWxhdGl2ZV9zdW09PTApewogICAgICBzZXRTdW0oKTsKICAgIH0KICAgIHJldHVybiBjdW11bGF0aXZlX3N1bVtqKzFdIC0gY3VtdWxhdGl2ZV9zdW1baV07CiAgfQogIGludCBzZXRfY29uc3RfbGVuX2xlZnQ7CiAgaW50IGNvbnN0X2xlbl9sZWZ0X21lbTsKICBpbnQqY29uc3RfbGVuX2xlZnQ7CiAgdm9pZCBzZXRDb25zdExlbkxlZnQodm9pZCl7CiAgICBpbnQgaTsKICAgIHNldF9jb25zdF9sZW5fbGVmdCA9IDE7CiAgICBpZihjb25zdF9sZW5fbGVmdF9tZW0gPCBuKXsKICAgICAgZGVsZXRlW10gY29uc3RfbGVuX2xlZnQ7CiAgICAgIGNvbnN0X2xlbl9sZWZ0ID0gbmV3IGludFtuXTsKICAgICAgY29uc3RfbGVuX2xlZnRfbWVtID0gbjsKICAgIH0KICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICBjb25zdF9sZW5fbGVmdFtpXSA9IDE7CiAgICB9CiAgICBmb3IoaT0oMSk7aTwobik7aSsrKXsKICAgICAgaWYoZFtpXT09ZFtpLTFdKXsKICAgICAgICBjb25zdF9sZW5fbGVmdFtpXSA9IGNvbnN0X2xlbl9sZWZ0W2ktMV0gKyAxOwogICAgICB9CiAgICB9CiAgfQogIGludCBDb25zdExlbkxlZnQoaW50IHN0LCBUIHZhbCl7CiAgICBpZighc2V0X2NvbnN0X2xlbl9sZWZ0KXsKICAgICAgc2V0Q29uc3RMZW5MZWZ0KCk7CiAgICB9CiAgICBpZih2YWwgIT0gZFtzdF0pewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiBjb25zdF9sZW5fbGVmdFtzdF07CiAgfQogIGludCBDb25zdExlbkxlZnQoaW50IHN0KXsKICAgIGlmKCFzZXRfY29uc3RfbGVuX2xlZnQpewogICAgICBzZXRDb25zdExlbkxlZnQoKTsKICAgIH0KICAgIHJldHVybiBjb25zdF9sZW5fbGVmdFtzdF07CiAgfQogIGludCBDb25zdExlbkxlZnRDeWNsaWMoaW50IHN0LCBUIHZhbCl7CiAgICBpZighc2V0X2NvbnN0X2xlbl9sZWZ0KXsKICAgICAgc2V0Q29uc3RMZW5MZWZ0KCk7CiAgICB9CiAgICBzdCAlPSBuOwogICAgaWYoc3QgPCAwKXsKICAgICAgc3QgKz0gbjsKICAgIH0KICAgIGlmKHZhbCAhPSBkW3N0XSl7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYoY29uc3RfbGVuX2xlZnRbc3RdICE9IHN0KzEgfHwgZFtzdF0gIT0gZFtuLTFdKXsKICAgICAgcmV0dXJuIGNvbnN0X2xlbl9sZWZ0W3N0XTsKICAgIH0KICAgIGlmKGNvbnN0X2xlbl9sZWZ0W24tMV0gPT0gbil7CiAgICAgIHJldHVybiAxMDczNzA5MDU2OwogICAgfQogICAgcmV0dXJuIGNvbnN0X2xlbl9sZWZ0W3N0XSArIGNvbnN0X2xlbl9sZWZ0W24tMV07CiAgfQogIGludCBDb25zdExlbkxlZnRDeWNsaWMoaW50IHN0KXsKICAgIGlmKCFzZXRfY29uc3RfbGVuX2xlZnQpewogICAgICBzZXRDb25zdExlbkxlZnQoKTsKICAgIH0KICAgIHN0ICU9IG47CiAgICBpZihzdCA8IDApewogICAgICBzdCArPSBuOwogICAgfQogICAgaWYoY29uc3RfbGVuX2xlZnRbc3RdICE9IHN0KzEgfHwgZFtzdF0gIT0gZFtuLTFdKXsKICAgICAgcmV0dXJuIGNvbnN0X2xlbl9sZWZ0W3N0XTsKICAgIH0KICAgIGlmKGNvbnN0X2xlbl9sZWZ0W24tMV0gPT0gbil7CiAgICAgIHJldHVybiAxMDczNzA5MDU2OwogICAgfQogICAgcmV0dXJuIGNvbnN0X2xlbl9sZWZ0W3N0XSArIGNvbnN0X2xlbl9sZWZ0W24tMV07CiAgfQogIGludCBzZXRfY29uc3RfbGVuX3JpZ2h0OwogIGludCBjb25zdF9sZW5fcmlnaHRfbWVtOwogIGludCpjb25zdF9sZW5fcmlnaHQ7CiAgdm9pZCBzZXRDb25zdExlblJpZ2h0KHZvaWQpewogICAgaW50IGk7CiAgICBzZXRfY29uc3RfbGVuX3JpZ2h0ID0gMTsKICAgIGlmKGNvbnN0X2xlbl9yaWdodF9tZW0gPCBuKXsKICAgICAgZGVsZXRlW10gY29uc3RfbGVuX3JpZ2h0OwogICAgICBjb25zdF9sZW5fcmlnaHQgPSBuZXcgaW50W25dOwogICAgICBjb25zdF9sZW5fcmlnaHRfbWVtID0gbjsKICAgIH0KICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICBjb25zdF9sZW5fcmlnaHRbaV0gPSAxOwogICAgfQogICAgZm9yKGk9KG4tMSktMTtpPj0oMCk7aS0tKXsKICAgICAgaWYoZFtpXT09ZFtpKzFdKXsKICAgICAgICBjb25zdF9sZW5fcmlnaHRbaV0gPSBjb25zdF9sZW5fcmlnaHRbaSsxXSArIDE7CiAgICAgIH0KICAgIH0KICB9CiAgaW50IENvbnN0TGVuUmlnaHQoaW50IHN0LCBUIHZhbCl7CiAgICBpZighc2V0X2NvbnN0X2xlbl9yaWdodCl7CiAgICAgIHNldENvbnN0TGVuUmlnaHQoKTsKICAgIH0KICAgIGlmKHZhbCAhPSBkW3N0XSl7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIGNvbnN0X2xlbl9yaWdodFtzdF07CiAgfQogIGludCBDb25zdExlblJpZ2h0KGludCBzdCl7CiAgICBpZighc2V0X2NvbnN0X2xlbl9yaWdodCl7CiAgICAgIHNldENvbnN0TGVuUmlnaHQoKTsKICAgIH0KICAgIHJldHVybiBjb25zdF9sZW5fcmlnaHRbc3RdOwogIH0KICBpbnQgQ29uc3RMZW5SaWdodEN5Y2xpYyhpbnQgc3QsIFQgdmFsKXsKICAgIGlmKCFzZXRfY29uc3RfbGVuX3JpZ2h0KXsKICAgICAgc2V0Q29uc3RMZW5SaWdodCgpOwogICAgfQogICAgaWYodmFsICE9IGRbc3RdKXsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBzdCAlPSBuOwogICAgaWYoc3QgPCAwKXsKICAgICAgc3QgKz0gbjsKICAgIH0KICAgIGlmKGNvbnN0X2xlbl9yaWdodFtzdF0gIT0gbi1zdCB8fCBkW3N0XSAhPSBkWzBdKXsKICAgICAgcmV0dXJuIGNvbnN0X2xlbl9yaWdodFtzdF07CiAgICB9CiAgICBpZihjb25zdF9sZW5fcmlnaHRbMF0gPT0gbil7CiAgICAgIHJldHVybiAxMDczNzA5MDU2OwogICAgfQogICAgcmV0dXJuIGNvbnN0X2xlbl9yaWdodFtzdF0gKyBjb25zdF9sZW5fcmlnaHRbMF07CiAgfQogIGludCBDb25zdExlblJpZ2h0Q3ljbGljKGludCBzdCl7CiAgICBpZighc2V0X2NvbnN0X2xlbl9yaWdodCl7CiAgICAgIHNldENvbnN0TGVuUmlnaHQoKTsKICAgIH0KICAgIHN0ICU9IG47CiAgICBpZihzdCA8IDApewogICAgICBzdCArPSBuOwogICAgfQogICAgaWYoY29uc3RfbGVuX3JpZ2h0W3N0XSAhPSBuLXN0IHx8IGRbc3RdICE9IGRbMF0pewogICAgICByZXR1cm4gY29uc3RfbGVuX3JpZ2h0W3N0XTsKICAgIH0KICAgIGlmKGNvbnN0X2xlbl9yaWdodFswXSA9PSBuKXsKICAgICAgcmV0dXJuIDEwNzM3MDkwNTY7CiAgICB9CiAgICByZXR1cm4gY29uc3RfbGVuX3JpZ2h0W3N0XSArIGNvbnN0X2xlbl9yaWdodFswXTsKICB9CiAgaW50IHNldF9kaGlzdDsKICBpbnQgZGhpc3RfbWVtOwogIGludCpkaGlzdDsKICBUIGRoaXN0X21uOwogIFQgZGhpc3RfbXg7CiAgdm9pZCBzZXRESGlzdCh2b2lkKXsKICAgIGludCBpOwogICAgaW50IGxlbjsKICAgIHNldF9kaGlzdCA9IDE7CiAgICBpZihuPT0wKXsKICAgICAgcmV0dXJuOwogICAgfQogICAgZGhpc3RfbW4gPSBkaGlzdF9teCA9IGRbMF07CiAgICBmb3IoaT0oMSk7aTwobik7aSsrKXsKICAgICAgaWYoZGhpc3RfbW4gPiBkW2ldKXsKICAgICAgICBkaGlzdF9tbiA9IGRbaV07CiAgICAgIH0KICAgICAgaWYoZGhpc3RfbXggPCBkW2ldKXsKICAgICAgICBkaGlzdF9teCA9IGRbaV07CiAgICAgIH0KICAgIH0KICAgIGxlbiA9IGRoaXN0X214IC0gZGhpc3RfbW4gKyAxOwogICAgaWYoZGhpc3RfbWVtIDwgbGVuKXsKICAgICAgZGVsZXRlW10gZGhpc3Q7CiAgICAgIGRoaXN0ID0gbmV3IGludFtsZW5dOwogICAgICBkaGlzdF9tZW0gPSBsZW47CiAgICB9CiAgICBmb3IoaT0oMCk7aTwobGVuKTtpKyspewogICAgICBkaGlzdFtpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwobik7aSsrKXsKICAgICAgZGhpc3RbZFtpXSAtIGRoaXN0X21uXSsrOwogICAgfQogIH0KICBpbnQgZEhpc3QoVCB4KXsKICAgIGlmKHNldF9kaGlzdD09MCl7CiAgICAgIHNldERIaXN0KCk7CiAgICB9CiAgICBpZihuID09IDAgfHwgeCA8IGRoaXN0X21uIHx8IHggPiBkaGlzdF9teCl7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIGRoaXN0W3ggLSBkaGlzdF9tbl07CiAgfQogIHZvaWQgcmVzZXQoKXsKICAgIHNldF9jdW11bGF0aXZlX3N1bSA9IDA7CiAgICBzZXRfY29uc3RfbGVuX2xlZnQgPSAwOwogICAgc2V0X2NvbnN0X2xlbl9yaWdodCA9IDA7CiAgICBzZXRfZGhpc3QgPSAwOwogIH0KICB2b2lkIG1lbW9yeV9leHBhbmQoaW50IG5uKXsKICAgIGlmKG1lbSA8IG5uKXsKICAgICAgZGVsZXRlW10gZDsKICAgICAgZCA9IG5ldyBUW25uXTsKICAgICAgbWVtID0gbm47CiAgICB9CiAgfQogIHZvaWQgbWFsbG9jKGludCBubil7CiAgICByZXNldCgpOwogICAgbWVtb3J5X2V4cGFuZChubik7CiAgICBuID0gbm47CiAgfQogIHZvaWQgc2V0TihpbnQgbm4pewogICAgcmVzZXQoKTsKICAgIG1lbW9yeV9leHBhbmQobm4pOwogICAgbiA9IG5uOwogIH0KICB2b2lkIHNldCh2ZWN0b3I8VD4gJmEpewogICAgaW50IGk7CiAgICBpbnQgbm4gPSBhLnNpemUoKTsKICAgIHNldE4obm4pOwogICAgZm9yKGk9KDApO2k8KG5uKTtpKyspewogICAgICBkW2ldID0gYVtpXTsKICAgIH0KICB9CiAgdm9pZCBzZXQoaW50IG5uLCBUIGFbXSl7CiAgICBpbnQgaTsKICAgIHNldE4obm4pOwogICAgZm9yKGk9KDApO2k8KG5uKTtpKyspewogICAgICBkW2ldID0gYVtpXTsKICAgIH0KICB9CiAgdm9pZCBmcmVlKCl7CiAgICBkZXN0cnVjdG9yKCk7CiAgfQogIHZvaWQgY29uc3RydWN0b3IoKXsKICAgIG4gPSBtZW0gPSAwOwogICAgZCA9IE5VTEw7CiAgICBzZXRfY3VtdWxhdGl2ZV9zdW0gPSAwOwogICAgY3VtdWxhdGl2ZV9zdW1fbWVtID0gMDsKICAgIGN1bXVsYXRpdmVfc3VtID0gTlVMTDsKICAgIHNldF9jb25zdF9sZW5fbGVmdCA9IDA7CiAgICBjb25zdF9sZW5fbGVmdF9tZW0gPSAwOwogICAgY29uc3RfbGVuX2xlZnQgPSBOVUxMOwogICAgc2V0X2NvbnN0X2xlbl9yaWdodCA9IDA7CiAgICBjb25zdF9sZW5fcmlnaHRfbWVtID0gMDsKICAgIGNvbnN0X2xlbl9yaWdodCA9IE5VTEw7CiAgICBzZXRfZGhpc3QgPSAwOwogICAgZGhpc3RfbWVtID0gMDsKICAgIGRoaXN0ID0gTlVMTDsKICB9CiAgdm9pZCBjb25zdHJ1Y3RvcihpbnQgbm4pewogICAgY29uc3RydWN0b3IoKTsKICAgIG1hbGxvYyhubik7CiAgfQogIHZvaWQgZGVzdHJ1Y3RvcigpewogICAgZGVsZXRlW10gZDsKICAgIGQgPSBOVUxMOwogICAgbWVtID0gbiA9IDA7CiAgICBzZXRfY3VtdWxhdGl2ZV9zdW0gPSAwOwogICAgY3VtdWxhdGl2ZV9zdW1fbWVtID0gMDsKICAgIGRlbGV0ZVtdIGN1bXVsYXRpdmVfc3VtOwogICAgY3VtdWxhdGl2ZV9zdW0gPSBOVUxMOwogICAgc2V0X2NvbnN0X2xlbl9sZWZ0ID0gMDsKICAgIGNvbnN0X2xlbl9sZWZ0X21lbSA9IDA7CiAgICBkZWxldGVbXSBjb25zdF9sZW5fbGVmdDsKICAgIGNvbnN0X2xlbl9sZWZ0ID0gTlVMTDsKICAgIHNldF9jb25zdF9sZW5fcmlnaHQgPSAwOwogICAgY29uc3RfbGVuX3JpZ2h0X21lbSA9IDA7CiAgICBkZWxldGVbXSBjb25zdF9sZW5fcmlnaHQ7CiAgICBjb25zdF9sZW5fcmlnaHQgPSBOVUxMOwogICAgc2V0X2RoaXN0ID0gMDsKICAgIGRoaXN0X21lbSA9IDA7CiAgICBkZWxldGVbXSBkaGlzdDsKICAgIGRoaXN0ID0gTlVMTDsKICB9CiAgQXJyMWQoKXsKICAgIGNvbnN0cnVjdG9yKCk7CiAgfQogIEFycjFkKGludCBubil7CiAgICBjb25zdHJ1Y3Rvcihubik7CiAgfQogIH5BcnIxZCgpewogICAgZGVzdHJ1Y3RvcigpOwogIH0KfQo7CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgd21lbSA9IG1lbWFycjsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpBcnIxZDxpbnQ+IGFycjsKaW50IHZbMTAwXTsKaW50IGZbMTAwXTsKY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIHZlY3RvcjxpbnQ+IGZyZXF1ZW5jeVNvcnQodmVjdG9yPGludD4mIEEpewogICAgaW50IGk7CiAgICBkdW1teV9tYWluKCk7CiAgICBpbnQgTiA9IEEuc2l6ZSgpOwogICAgdmVjdG9yPGludD4gcmVzOwogICAgYXJyLnNldChBKTsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICB7CiAgICAgICAgYXV0byBRNVZKTDFjUyA9IChBW2ldKTsKICAgICAgICBhdXRvIGU5OFdIQ0VZID0gKCAtYXJyLmRIaXN0KEFbaV0pKTsKICAgICAgICB2W2ldID0gUTVWSkwxY1M7CiAgICAgICAgZltpXSA9IGU5OFdIQ0VZOwogICAgICB9CiAgICB9CiAgICByc29ydEFfTChOLCBmLCB2KTsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICByZXMucHVzaF9iYWNrKHZbaV0pOwogICAgfQogICAgcmV0dXJuIHJlczsKICB9Cn0KOwovLyBjTGF5IHZhcnNpb24gMjAyMDEwMzEtMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBBcnIxZDxpbnQ+IGFycjsKLy8gaW50IHZbMTAwXSwgZlsxMDBdOwovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgdmVjdG9yPGludD4gZnJlcXVlbmN5U29ydCh2ZWN0b3I8aW50PiYgQSkgewovLyAgICAgZHVtbXlfbWFpbigpOwovLyAgICAgaW50IE4gPSBBLnNpemUoKTsKLy8gICAgIHZlY3RvcjxpbnQ+IHJlczsKLy8gCi8vICAgICBhcnIuc2V0KEEpOwovLyAgICAgcmVwKGksTikgKHZbaV0sIGZbaV0pID0gKEFbaV0sIC1hcnIuZEhpc3QoQVtpXSkpOwovLyAKLy8gICAgIHJzb3J0QShOLCBmLCB2KTsKLy8gICAgIHJlcChpLE4pIHJlcy5wdXNoX2JhY2sodltpXSk7Ci8vIAovLyAgICAgcmV0dXJuIHJlczsKLy8gICB9Ci8vIH07Cg==