import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
class M {
@Override public int hashCode() {
final int prime=31;
int result=1;
result
=prime
*result
+Arrays.
deepHashCode(b
); return result;
}
@Override
public boolean equals
(Object obj
) { if(this==obj) return true;
if(obj==null) return false;
if(getClass()!=obj.getClass()) return false;
M other=(M)obj;
if(!Arrays.
deepEquals(b,other.
b)) return false; return true;
}
int[][] b=new int[3][3];
}
class SetEquality {
static List
<Object
> list
(Object o
) { ArrayList<Object> l=new ArrayList<>();
l.add(o);
return l;
}
static Set
<Object
> set
(Object o
) { Set<Object> l=new LinkedHashSet<>();
l.add(o);
return l;
}
public static void main
(String[] args
) { M f=new M();
M g=new M();
System.
out.
println(f.
hashCode()); System.
out.
println(g.
hashCode()); List<Object> listWithF=list(f);
List<Object> listWithG=list(g);
System.
out.
println("lists: "+listWithF.
equals(listWithG
)); Set<Object> setWithF=set(f);
Set<Object> setWithG=set(g);
System.
out.
println("sets: "+setWithF.
equals(setWithG
)); }
}
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CmNsYXNzIE0gewogICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgZmluYWwgaW50IHByaW1lPTMxOwogICAgICAgIGludCByZXN1bHQ9MTsKICAgICAgICByZXN1bHQ9cHJpbWUqcmVzdWx0K0FycmF5cy5kZWVwSGFzaENvZGUoYik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgIGlmKHRoaXM9PW9iaikgcmV0dXJuIHRydWU7CiAgICAgICAgaWYob2JqPT1udWxsKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYoZ2V0Q2xhc3MoKSE9b2JqLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKICAgICAgICBNIG90aGVyPShNKW9iajsKICAgICAgICBpZighQXJyYXlzLmRlZXBFcXVhbHMoYixvdGhlci5iKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaW50W11bXSBiPW5ldyBpbnRbM11bM107Cn0KY2xhc3MgU2V0RXF1YWxpdHkgewogICAgc3RhdGljIExpc3Q8T2JqZWN0PiBsaXN0KE9iamVjdCBvKSB7CiAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gbD1uZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBsLmFkZChvKTsKICAgICAgICByZXR1cm4gbDsKICAgIH0KICAgIHN0YXRpYyBTZXQ8T2JqZWN0PiBzZXQoT2JqZWN0IG8pIHsKICAgICAgICBTZXQ8T2JqZWN0PiBsPW5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKICAgICAgICBsLmFkZChvKTsKICAgICAgICByZXR1cm4gbDsKICAgIH0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBNIGY9bmV3IE0oKTsKICAgICAgICBNIGc9bmV3IE0oKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZi5oYXNoQ29kZSgpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZy5oYXNoQ29kZSgpKTsKICAgICAgICBMaXN0PE9iamVjdD4gbGlzdFdpdGhGPWxpc3QoZik7CiAgICAgICAgTGlzdDxPYmplY3Q+IGxpc3RXaXRoRz1saXN0KGcpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibGlzdHM6ICIrbGlzdFdpdGhGLmVxdWFscyhsaXN0V2l0aEcpKTsKICAgICAgICBTZXQ8T2JqZWN0PiBzZXRXaXRoRj1zZXQoZik7CiAgICAgICAgU2V0PE9iamVjdD4gc2V0V2l0aEc9c2V0KGcpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2V0czogIitzZXRXaXRoRi5lcXVhbHMoc2V0V2l0aEcpKTsKICAgIH0KfQ==