/*
--------------------------------DO NOT COPY I REQUEST YOU PLEASE--------------------------
AUTHOR : Chandan Agrawal
College : Poornima College of Engg. jaipur, Raj
Mail : chandanagrawal23@gmail.com
*/
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define MAX 100050
#define ll long long
#define ld long double
#define lli long int
#define pb emplace_back
#define INF 100000000000
#define mod 1000000007
#define MOD 1000000007
// trignometric function always give value in Radians only
#define PI acos(-1) //3.1415926535897932384626433832795028
#define dsin(degree) sin(degree*(PI/180.0))
#define dcos(degree) cos(degree*(PI/180.0))
#define dtan(degree) tan(degree*(PI/180.0))
#define rsin(radian) sin(radian)
#define rcos(radian) cos(radian)
#define rtan(radian) tan(radian)
#define loop(i,n) for (lli i = 0; i < n; i++)
#define loopitr(xt,vec) for (auto xt : vec)
#define FOR(i,a,b) for (lli i = a; i < b; i+=1)
#define loop_rev(i,n) for (lli i = n-1; i >= 0; i--)
#define FOR_REV(i,a,b) for (lli i = a; i >= b; i--)
#define itr :: iterator it
#define WL(t) while(t --)
#define all(v) v.begin(),v.end()
#define sz(x) int(x.size())
#define F first
#define S second
#define mii map<lli,lli>
#define vi vector<lli>
#define seti set<lli>
#define pii pair<lli,lli>
#define gcd(a,b) __gcd((a),(b))
#define lcm(a,b) (a/gcd(a,b))*b
#define abs(x) ((x < 0)?-(x):x)
template <typename T>
void print(T x){cout<<x<<endl;}
template <typename T1, typename T2>
void print2(T1 x,T2 y){cout<<x<<" "<<y<<endl;}
template <typename T1, typename T2,typename T3>
void print3(T1 x, T2 y,T3 z){cout<<x<<" "<<y<<" "<<z<<endl;}
#define scanarr(a,n) for(lli i=0;i<n;i++) cin>>a[i];
#define scanvector(a,n) for(lli i=0;i<n;i++){ lli x ; cin>>x; a.push_back(x);}
#define printarr(a,n) for(lli i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl;
#define printvector(vec) for(auto xt : vec) cout<<xt<<" "; cout<<"\n";
#define printset(st) for(auto xt : st) cout<<xt<<" "; cout<<"\n";
#define FD(N) fixed<<setprecision(N)
#define endl '\n'
#define deb(x) cout<<#x<<" "<<x<<endl;
/*
ifstream cinn("i3.txt");
ofstream coutt("o3.txt");
*/
bool isvowel(char v) { return (0x208222>>(v&0x1f))&1; }
lli mceil(lli a,lli b){
if(a%b==0) return(a/b);
else return(a/b +1);
}
lli mfloor(lli a,lli b){
return(a/b);
}
ll modmul(ll a, ll b) {
return ((a%mod) * (b%mod)) % mod;
}
ll modadd(ll a , ll b){
return((a%mod)+(b%mod)+mod)%mod;
}
ll modsub(ll a , ll b){
return((a%mod) - (b%mod) + mod)%mod;
}
lli fastexpo(lli a,lli b){
a = a%mod;
lli ans=1;
while(b){
if(b&1)
ans=(ans*1ll*a)%mod;
a=(a*1ll*a)%mod;
b=b/2;
}
return ans;
}
/* -----------------------------------------------------HASHING-------------------------------------------------------------------*/
/*
some key points -
1. Use (long int) to remove TLE or Memory Limit issue
2. If still Wrong answer then may be collision occur , use p as bigger prime no. p : [31,53,107,209,4793]
3. use mod either 1e9+7
4 .If it still shows WA then surely collision occurs use Double Hashing
Double Hashing -
Make Prehash Array using two different p and mod so chances of collision is less
5. use pass by reference always
*/
#define maxlen 100005 //maximum length of string
lli pow_p[maxlen]; // p^i %m
lli p_inv[maxlen]; // this is inverse_Mod(p^i) basically p^(-n) = [p^(-1) ]^n so calculate just p^(-1) and caluclate power
// like inversemod(p^(-2)) = p^(-1) * p^(-1)
void init(lli p)
{
pow_p[0]=1;
p_inv[0]=1;
lli pinv = fastexpo(p,mod-2);
for(lli i=1;i<maxlen;i++)
{
pow_p[i] = modmul(pow_p[i-1],p);
p_inv[i] = modmul(p_inv[i-1],pinv);
}
}
struct Hash{
// 0 based indexing
lli prehash[maxlen];
// hash(s) = sigma(i=0 to n-1) s[i]*p^(i)
// a->1 , b->2 , c->3 and so on
void precomputehash(string &s,lli p){ //p can be any prime 19 , 31, 53,107 ...
prehash[0]=(s[0]-'a')+1;
for (lli i=1;i<s.size();i++) {
prehash[i]= modadd(prehash[i-1] , modmul((s[i]-'a'+1),pow_p[i]));
}
}
// hash[l..r] = ((hash[upto r] - hash[upto (l-1)] ) / P^l) % mod = ((hash[upto r] - hash[upto (l-1)] ) * modinv(P^l) )%mod
lli gethash(lli l, lli r){
if(l==0)
return(prehash[r]%mod);
else{
lli ans = modsub(prehash[r],prehash[l-1]);
ans = modmul(ans, p_inv[l]);
return ans;
}
}
// hash value of all string means hash[0..(n-1)] // 0 based indexing
lli totalhash(string &s){
return(prehash[sz(s)-1]%mod);
}
};
/* -----------------------------------------------------HASHING-------------------------------------------------------------------*/
lli cnt_overlap(string &aage , string &piche , Hash &obj_aage , Hash &obj_piche)
{
lli cnt=0, f=0;
lli i=sz(aage)-1; //for aage
lli j=0; // for piche
lli len_aage = sz(aage);
lli len_piche = sz(piche);
while(i>=0 and j<len_piche)
{
if(obj_aage.gethash(i,len_aage-1) == obj_piche.gethash(0,j) ){
cnt=j;
f=1;
}
i--;
j++;
// cnt++;
}
if(f)
return cnt+1;
return 0;
}
int main(){
fastio
lli t=1;
init(53);
//cin>>t;
while(t--) {
string a,b,c;
cin>>a>>b>>c;
lli sza = sz(a);
lli szb = sz(b);
lli szc = sz(c);
Hash obj_a , obj_b , obj_c;
obj_a.precomputehash(a,53);
obj_b.precomputehash(b,53);
obj_c.precomputehash(c,53);
lli diff;
lli total = 0 , ans = INF;
// - -- - - - -- - - - - - - - --- - - - - - - - - - - -
//a+b+c
total=0;
diff = sza+szb-cnt_overlap(a,b,obj_a,obj_b);
//print(diff);
total+=diff;
diff = szc - cnt_overlap(b,c,obj_b,obj_c);
//print(diff);
total+=diff;
ans = min(ans ,total);
//a+c+b
total=0;
diff = sza+szc - cnt_overlap(a,c,obj_a,obj_c);
// print(diff);
total+=diff;
diff = szb - cnt_overlap(c,b,obj_c,obj_b);
//print(diff);
total+=diff;
ans = min(ans ,total);
//b+a+c
total=0;
diff = szb+sza - cnt_overlap(b,a,obj_b,obj_a);
total+=diff;
diff = szc - cnt_overlap(a,c,obj_a,obj_c);
total+=diff;
ans = min(ans ,total);
//b+c+a
total=0;
diff = szb+szc - cnt_overlap(b,c,obj_b,obj_c);
total+=diff;
diff = sza - cnt_overlap(c,a,obj_c,obj_a);
total+=diff;
ans = min(ans ,total);
//c+a+b
total=0;
diff = szc+sza - cnt_overlap(c,a,obj_c,obj_a);
total+=diff;
diff = szb - cnt_overlap(a,b,obj_a,obj_b);
total+=diff;
ans = min(ans ,total);
//c+b+a
total=0;
diff = szc+szb - cnt_overlap(c,b,obj_c,obj_b);
total+=diff;
diff = sza - cnt_overlap(b,a,obj_b,obj_a);
total+=diff;
ans = min(ans ,total);
// --- -- -- - -- - - - ---- -- - - - - - -- - - -
print(ans);
}
return 0;
}
LyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ETyBOT1QgQ09QWSBJIFJFUVVFU1QgWU9VIFBMRUFTRS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBVVRIT1IgOiBDaGFuZGFuIEFncmF3YWwKQ29sbGVnZSA6IFBvb3JuaW1hIENvbGxlZ2Ugb2YgRW5nZy4gamFpcHVyLCBSYWoKTWFpbCA6IGNoYW5kYW5hZ3Jhd2FsMjNAZ21haWwuY29tCgoqLwoKI2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGU8c3RkaW8uaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZmFzdGlvIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpO2Npbi50aWUoMCk7Y291dC50aWUoMCk7CiNkZWZpbmUgTUFYIDEwMDA1MAoKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIGxsaSBsb25nIGludAoKI2RlZmluZSBwYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBJTkYgMTAwMDAwMDAwMDAwCiNkZWZpbmUgbW9kIDEwMDAwMDAwMDcKI2RlZmluZSBNT0QgMTAwMDAwMDAwNwoKLy8gdHJpZ25vbWV0cmljIGZ1bmN0aW9uIGFsd2F5cyBnaXZlIHZhbHVlIGluIFJhZGlhbnMgb25seQojZGVmaW5lIFBJIGFjb3MoLTEpIC8vMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4CiNkZWZpbmUgZHNpbihkZWdyZWUpIHNpbihkZWdyZWUqKFBJLzE4MC4wKSkKI2RlZmluZSBkY29zKGRlZ3JlZSkgY29zKGRlZ3JlZSooUEkvMTgwLjApKQojZGVmaW5lIGR0YW4oZGVncmVlKSB0YW4oZGVncmVlKihQSS8xODAuMCkpCgojZGVmaW5lIHJzaW4ocmFkaWFuKSBzaW4ocmFkaWFuKQojZGVmaW5lIHJjb3MocmFkaWFuKSBjb3MocmFkaWFuKQojZGVmaW5lIHJ0YW4ocmFkaWFuKSB0YW4ocmFkaWFuKQoKI2RlZmluZSBsb29wKGksbikgZm9yIChsbGkgaSA9IDA7IGkgPCBuOyBpKyspCiNkZWZpbmUgbG9vcGl0cih4dCx2ZWMpIGZvciAoYXV0byB4dCA6IHZlYykKI2RlZmluZSBGT1IoaSxhLGIpIGZvciAobGxpIGkgPSBhOyBpIDwgYjsgaSs9MSkKI2RlZmluZSBsb29wX3JldihpLG4pIGZvciAobGxpIGkgPSBuLTE7IGkgPj0gMDsgaS0tKQojZGVmaW5lIEZPUl9SRVYoaSxhLGIpIGZvciAobGxpIGkgPSBhOyBpID49IGI7IGktLSkKI2RlZmluZSBpdHIgOjogaXRlcmF0b3IgaXQKI2RlZmluZSBXTCh0KSB3aGlsZSh0IC0tKQoKI2RlZmluZSBhbGwodikgdi5iZWdpbigpLHYuZW5kKCkKI2RlZmluZSBzeih4KSBpbnQoeC5zaXplKCkpCiNkZWZpbmUgRiBmaXJzdAojZGVmaW5lIFMgc2Vjb25kCgojZGVmaW5lIG1paSBtYXA8bGxpLGxsaT4KI2RlZmluZSB2aSB2ZWN0b3I8bGxpPgojZGVmaW5lIHNldGkgc2V0PGxsaT4KI2RlZmluZSBwaWkgcGFpcjxsbGksbGxpPgoKI2RlZmluZSBnY2QoYSxiKSBfX2djZCgoYSksKGIpKQojZGVmaW5lIGxjbShhLGIpIChhL2djZChhLGIpKSpiCiNkZWZpbmUgYWJzKHgpICgoeCA8IDApPy0oeCk6eCkKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIHByaW50KFQgeCl7Y291dDw8eDw8ZW5kbDt9CnRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CnZvaWQgcHJpbnQyKFQxIHgsVDIgeSl7Y291dDw8eDw8IiAiPDx5PDxlbmRsO30KdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMix0eXBlbmFtZSBUMz4Kdm9pZCBwcmludDMoVDEgeCwgVDIgeSxUMyB6KXtjb3V0PDx4PDwiICI8PHk8PCIgIjw8ejw8ZW5kbDt9CgojZGVmaW5lIHNjYW5hcnIoYSxuKSBmb3IobGxpIGk9MDtpPG47aSsrKSAgICBjaW4+PmFbaV07CiNkZWZpbmUgc2NhbnZlY3RvcihhLG4pIGZvcihsbGkgaT0wO2k8bjtpKyspeyBsbGkgeCA7IGNpbj4+eDsgYS5wdXNoX2JhY2soeCk7fQoKI2RlZmluZSBwcmludGFycihhLG4pIGZvcihsbGkgaT0wO2k8bjtpKyspICAgY291dDw8YVtpXTw8IiAiOyBjb3V0PDxlbmRsOwojZGVmaW5lIHByaW50dmVjdG9yKHZlYykgZm9yKGF1dG8geHQgOiB2ZWMpIGNvdXQ8PHh0PDwiICI7ICAgIGNvdXQ8PCJcbiI7CiNkZWZpbmUgcHJpbnRzZXQoc3QpIGZvcihhdXRvIHh0IDogc3QpIGNvdXQ8PHh0PDwiICI7ICAgIGNvdXQ8PCJcbiI7CgojZGVmaW5lIEZEKE4pIGZpeGVkPDxzZXRwcmVjaXNpb24oTikKCiNkZWZpbmUgZW5kbCAnXG4nCgojZGVmaW5lIGRlYih4KSBjb3V0PDwjeDw8IiAiPDx4PDxlbmRsOwoKLyoKaWZzdHJlYW0gY2lubigiaTMudHh0Iik7Cm9mc3RyZWFtIGNvdXR0KCJvMy50eHQiKTsKKi8KCgpib29sIGlzdm93ZWwoY2hhciB2KSB7IHJldHVybiAoMHgyMDgyMjI+Pih2JjB4MWYpKSYxOyB9CgpsbGkgbWNlaWwobGxpIGEsbGxpIGIpewogICAgaWYoYSViPT0wKSByZXR1cm4oYS9iKTsKICAgIGVsc2UgcmV0dXJuKGEvYiAgKzEpOwp9CmxsaSBtZmxvb3IobGxpIGEsbGxpIGIpewogICAgcmV0dXJuKGEvYik7Cn0KCmxsIG1vZG11bChsbCBhLCBsbCBiKSB7CiAgICByZXR1cm4gKChhJW1vZCkgKiAoYiVtb2QpKSAlIG1vZDsKfQoKbGwgbW9kYWRkKGxsIGEgLCBsbCBiKXsKICAgIHJldHVybigoYSVtb2QpKyhiJW1vZCkrbW9kKSVtb2Q7Cn0KCmxsIG1vZHN1YihsbCBhICwgbGwgYil7CiAgICByZXR1cm4oKGElbW9kKSAtIChiJW1vZCkgKyBtb2QpJW1vZDsKfQoKbGxpIGZhc3RleHBvKGxsaSBhLGxsaSBiKXsKICAgIGEgPSBhJW1vZDsKICAgIGxsaSBhbnM9MTsKICAgIHdoaWxlKGIpewogICAgICAgIGlmKGImMSkKICAgICAgICAgICAgYW5zPShhbnMqMWxsKmEpJW1vZDsKICAgICAgICBhPShhKjFsbCphKSVtb2Q7CiAgICAgICAgYj1iLzI7CiAgICAgICAgfQogICAgcmV0dXJuIGFuczsKIH0KCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUhBU0hJTkctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyoKc29tZSBrZXkgcG9pbnRzIC0KMS4gVXNlIChsb25nIGludCkgdG8gcmVtb3ZlIFRMRSBvciBNZW1vcnkgTGltaXQgaXNzdWUKMi4gSWYgc3RpbGwgV3JvbmcgYW5zd2VyIHRoZW4gbWF5IGJlIGNvbGxpc2lvbiBvY2N1ciAsIHVzZSBwIGFzIGJpZ2dlciBwcmltZSBuby4gcCA6IFszMSw1MywxMDcsMjA5LDQ3OTNdCjMuIHVzZSBtb2QgZWl0aGVyIDFlOSs3CjQgLklmIGl0IHN0aWxsIHNob3dzIFdBIHRoZW4gc3VyZWx5IGNvbGxpc2lvbiBvY2N1cnMgdXNlIERvdWJsZSBIYXNoaW5nCiAgIERvdWJsZSBIYXNoaW5nIC0KICAgICAgICBNYWtlIFByZWhhc2ggQXJyYXkgdXNpbmcgdHdvIGRpZmZlcmVudCBwIGFuZCBtb2Qgc28gY2hhbmNlcyBvZiBjb2xsaXNpb24gaXMgbGVzcwo1LiB1c2UgcGFzcyBieSByZWZlcmVuY2UgYWx3YXlzCgoKKi8KCgojZGVmaW5lIG1heGxlbiAxMDAwMDUgLy9tYXhpbXVtIGxlbmd0aCBvZiBzdHJpbmcKbGxpIHBvd19wW21heGxlbl07IC8vIHBeaSAlbQpsbGkgcF9pbnZbbWF4bGVuXTsgLy8gdGhpcyBpcyBpbnZlcnNlX01vZChwXmkpIGJhc2ljYWxseSBwXigtbikgPSAgW3BeKC0xKSBdXm4gc28gY2FsY3VsYXRlIGp1c3QgcF4oLTEpIGFuZCBjYWx1Y2xhdGUgcG93ZXIKICAgICAgICAgICAgICAgLy8gbGlrZSBpbnZlcnNlbW9kKHBeKC0yKSkgPSBwXigtMSkgKiBwXigtMSkKdm9pZCBpbml0KGxsaSBwKQp7CiAgICBwb3dfcFswXT0xOwogICAgcF9pbnZbMF09MTsKICAgIGxsaSBwaW52ID0gZmFzdGV4cG8ocCxtb2QtMik7CiAgICBmb3IobGxpIGk9MTtpPG1heGxlbjtpKyspCiAgICB7CiAgICAgICAgcG93X3BbaV0gPSBtb2RtdWwocG93X3BbaS0xXSxwKTsKICAgICAgICBwX2ludltpXSA9IG1vZG11bChwX2ludltpLTFdLHBpbnYpOwogICAgfQp9CgpzdHJ1Y3QgSGFzaHsKICAgICAgICAvLyAwIGJhc2VkIGluZGV4aW5nCiAgICAgICAgbGxpIHByZWhhc2hbbWF4bGVuXTsKICAgICAgICAvLyBoYXNoKHMpID0gc2lnbWEoaT0wIHRvIG4tMSkgc1tpXSpwXihpKQogICAgICAgIC8vIGEtPjEgLCBiLT4yICwgYy0+MyBhbmQgc28gb24KCiAgICAgICAgCgoKICAgICAgICB2b2lkIHByZWNvbXB1dGVoYXNoKHN0cmluZyAmcyxsbGkgcCl7IC8vcCBjYW4gYmUgYW55IHByaW1lIDE5ICwgMzEsIDUzLDEwNyAuLi4KCiAgICAgICAgICAgIHByZWhhc2hbMF09KHNbMF0tJ2EnKSsxOwogICAgICAgICAgICBmb3IgKGxsaSBpPTE7aTxzLnNpemUoKTtpKyspIHsKICAgICAgICAgICAgICAgIHByZWhhc2hbaV09IG1vZGFkZChwcmVoYXNoW2ktMV0gLCBtb2RtdWwoKHNbaV0tJ2EnKzEpLHBvd19wW2ldKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGhhc2hbbC4ucl0gPSAoKGhhc2hbdXB0byByXSAtIGhhc2hbdXB0byAobC0xKV0gKSAvIFBebCkgJSBtb2QgPSAoKGhhc2hbdXB0byByXSAtIGhhc2hbdXB0byAobC0xKV0gKSAqIG1vZGludihQXmwpICklbW9kCiAgICAgICAgbGxpIGdldGhhc2gobGxpIGwsIGxsaSByKXsKICAgICAgICAgICAgaWYobD09MCkKICAgICAgICAgICAgICAgIHJldHVybihwcmVoYXNoW3JdJW1vZCk7CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBsbGkgYW5zID0gbW9kc3ViKHByZWhhc2hbcl0scHJlaGFzaFtsLTFdKTsKICAgICAgICAgICAgICAgIGFucyA9IG1vZG11bChhbnMsIHBfaW52W2xdKTsKICAgICAgICAgICAgICAgIHJldHVybiBhbnM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGhhc2ggdmFsdWUgb2YgYWxsIHN0cmluZyBtZWFucyBoYXNoWzAuLihuLTEpXSAvLyAwIGJhc2VkIGluZGV4aW5nCiAgICAgICAgbGxpIHRvdGFsaGFzaChzdHJpbmcgJnMpewogICAgICAgICAgICByZXR1cm4ocHJlaGFzaFtzeihzKS0xXSVtb2QpOwogICAgICAgIH0KfTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tSEFTSElORy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKbGxpIGNudF9vdmVybGFwKHN0cmluZyAmYWFnZSAsIHN0cmluZyAmcGljaGUgLCBIYXNoICZvYmpfYWFnZSAsIEhhc2ggJm9ial9waWNoZSkKewogbGxpIGNudD0wLCBmPTA7CiAKIGxsaSBpPXN6KGFhZ2UpLTE7IC8vZm9yIGFhZ2UKIGxsaSBqPTA7IC8vIGZvciBwaWNoZQogCiBsbGkgbGVuX2FhZ2UgPSBzeihhYWdlKTsKIGxsaSBsZW5fcGljaGUgPSBzeihwaWNoZSk7CiAKIHdoaWxlKGk+PTAgYW5kIGo8bGVuX3BpY2hlKQogewogICAgIGlmKG9ial9hYWdlLmdldGhhc2goaSxsZW5fYWFnZS0xKSA9PSBvYmpfcGljaGUuZ2V0aGFzaCgwLGopICl7CiAgICAgICAgICAgIGNudD1qOwogICAgICAgICAgICBmPTE7CiAgICAgfQogICAgIGktLTsKICAgICBqKys7Ci8vICAgICBjbnQrKzsKIH0KIGlmKGYpCiAgICByZXR1cm4gY250KzE7CiByZXR1cm4gMDsKfQoKCgppbnQgbWFpbigpewpmYXN0aW8KbGxpIHQ9MTsKaW5pdCg1Myk7Ci8vY2luPj50Owp3aGlsZSh0LS0pIHsKICAgIHN0cmluZyBhLGIsYzsKICAgIGNpbj4+YT4+Yj4+YzsKICAgIAogICAgbGxpIHN6YSA9IHN6KGEpOwogICAgbGxpIHN6YiA9IHN6KGIpOwogICAgbGxpIHN6YyA9IHN6KGMpOwogICAgCiAgICBIYXNoIG9ial9hICwgb2JqX2IgLCBvYmpfYzsKICAgIAogICAgb2JqX2EucHJlY29tcHV0ZWhhc2goYSw1Myk7CiAgICAKICAgIG9ial9iLnByZWNvbXB1dGVoYXNoKGIsNTMpOwogICAgCiAgICBvYmpfYy5wcmVjb21wdXRlaGFzaChjLDUzKTsKICAgIAogICAgbGxpIGRpZmY7CiAgICAKICAgIGxsaSB0b3RhbCA9IDAgLCBhbnMgPSBJTkY7CiAgICAKLy8gLSAtLSAtIC0gLSAtLSAtIC0gIC0gLSAtIC0gLSAtLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCiAgICAgICAgCiAgICAvL2ErYitjCiAgICAKICAgIHRvdGFsPTA7CiAgICBkaWZmID0gc3phK3N6Yi1jbnRfb3ZlcmxhcChhLGIsb2JqX2Esb2JqX2IpOwogICAgLy9wcmludChkaWZmKTsKICAgIHRvdGFsKz1kaWZmOwogICAgZGlmZiA9IHN6YyAtIGNudF9vdmVybGFwKGIsYyxvYmpfYixvYmpfYyk7CiAgICAvL3ByaW50KGRpZmYpOwogICAgdG90YWwrPWRpZmY7CiAgICBhbnMgPSBtaW4oYW5zICx0b3RhbCk7CgogICAgCiAgICAKICAgIC8vYStjK2IKICAgIAogICAgdG90YWw9MDsKICAgIGRpZmYgPSBzemErc3pjIC0gY250X292ZXJsYXAoYSxjLG9ial9hLG9ial9jKTsKICAgLy8gcHJpbnQoZGlmZik7CiAgICB0b3RhbCs9ZGlmZjsKICAgIGRpZmYgPSBzemIgLSBjbnRfb3ZlcmxhcChjLGIsb2JqX2Msb2JqX2IpOwogICAgLy9wcmludChkaWZmKTsKICAgIHRvdGFsKz1kaWZmOwogICAgYW5zID0gbWluKGFucyAsdG90YWwpOwogICAgCiAgICAKICAgIC8vYithK2MKICAgIAogICAgdG90YWw9MDsKICAgIGRpZmYgPSBzemIrc3phIC0gY250X292ZXJsYXAoYixhLG9ial9iLG9ial9hKTsKICAgIHRvdGFsKz1kaWZmOwogICAgZGlmZiA9IHN6YyAtIGNudF9vdmVybGFwKGEsYyxvYmpfYSxvYmpfYyk7CiAgICB0b3RhbCs9ZGlmZjsKICAgIGFucyA9IG1pbihhbnMgLHRvdGFsKTsKICAgIAogICAgLy9iK2MrYQogICAgCiAgICB0b3RhbD0wOwogICAgZGlmZiA9IHN6YitzemMgLSBjbnRfb3ZlcmxhcChiLGMsb2JqX2Isb2JqX2MpOwogICAgdG90YWwrPWRpZmY7CiAgICBkaWZmID0gc3phIC0gY250X292ZXJsYXAoYyxhLG9ial9jLG9ial9hKTsKICAgIHRvdGFsKz1kaWZmOwogICAgYW5zID0gbWluKGFucyAsdG90YWwpOwogICAgCiAgICAKICAgIC8vYythK2IKICAgIAogICAgdG90YWw9MDsKICAgIGRpZmYgPSBzemMrc3phIC0gY250X292ZXJsYXAoYyxhLG9ial9jLG9ial9hKTsKICAgIHRvdGFsKz1kaWZmOwogICAgZGlmZiA9IHN6YiAtIGNudF9vdmVybGFwKGEsYixvYmpfYSxvYmpfYik7CiAgICB0b3RhbCs9ZGlmZjsKICAgIGFucyA9IG1pbihhbnMgLHRvdGFsKTsKICAgIAogICAgCiAgICAKICAgIC8vYytiK2EKICAgIAogICAgdG90YWw9MDsKICAgIGRpZmYgPSBzemMrc3piIC0gY250X292ZXJsYXAoYyxiLG9ial9jLG9ial9iKTsKICAgIHRvdGFsKz1kaWZmOwogICAgZGlmZiA9IHN6YSAtIGNudF9vdmVybGFwKGIsYSxvYmpfYixvYmpfYSk7CiAgICB0b3RhbCs9ZGlmZjsKICAgIGFucyA9IG1pbihhbnMgLHRvdGFsKTsKICAgIAovLyAtLS0gLS0gLS0gLSAtLSAtIC0gLSAtLS0tIC0tIC0gLSAtIC0gLSAtLSAtIC0gLSAgICAKCiAgICBwcmludChhbnMpOwogICAgCiAgICAKICB9CnJldHVybiAwOwp9Cg==