# /*
#  * Copyright (C) 2016 The Android Open Source Project
#  *
#  * Licensed under the Apache License, Version 2.0 (the "License");
#  * you may not use this file except in compliance with the License.
#  * You may obtain a copy of the License at
#  *
#  *      http://www.apache.org/licenses/LICENSE-2.0
#  *
#  * Unless required by applicable law or agreed to in writing, software
#  * distributed under the License is distributed on an "AS IS" BASIS,
#  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  * See the License for the specific language governing permissions and
#  * limitations under the License.
#  */
#
.class public LMain;
.super Ljava/lang/Object;
.implements LIface;

.method public constructor <init>()V
    .registers 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    return-void
.end method

.method public static main([Ljava/lang/String;)V
    .locals 2
    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
    const-string v1, "Pass"
    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
    return-void
.end method

.method public abstractMethod0()V
    .locals 0
    return-void
.end method

.method public abstractMethod1()V
    .locals 0
    return-void
.end method

.method public abstractMethod2()V
    .locals 0
    return-void
.end method

.method public abstractMethod3()V
    .locals 0
    return-void
.end method

.method public abstractMethod4()V
    .locals 0
    return-void
.end method

.method public abstractMethod5()V
    .locals 0
    return-void
.end method

.method public abstractMethod6()V
    .locals 0
    return-void
.end method

.method public abstractMethod7()V
    .locals 0
    return-void
.end method

.method public abstractMethod8()V
    .locals 0
    return-void
.end method

.method public abstractMethod9()V
    .locals 0
    return-void
.end method

.method public abstractMethod10()V
    .locals 0
    return-void
.end method

.method public abstractMethod11()V
    .locals 0
    return-void
.end method

.method public abstractMethod12()V
    .locals 0
    return-void
.end method

.method public abstractMethod13()V
    .locals 0
    return-void
.end method

.method public abstractMethod14()V
    .locals 0
    return-void
.end method

.method public abstractMethod15()V
    .locals 0
    return-void
.end method

.method public abstractMethod16()V
    .locals 0
    return-void
.end method

.method public abstractMethod17()V
    .locals 0
    return-void
.end method

.method public abstractMethod18()V
    .locals 0
    return-void
.end method

.method public abstractMethod19()V
    .locals 0
    return-void
.end method

.method public abstractMethod20()V
    .locals 0
    return-void
.end method

.method public abstractMethod21()V
    .locals 0
    return-void
.end method

.method public abstractMethod22()V
    .locals 0
    return-void
.end method

.method public abstractMethod23()V
    .locals 0
    return-void
.end method

.method public abstractMethod24()V
    .locals 0
    return-void
.end method

.method public abstractMethod25()V
    .locals 0
    return-void
.end method

.method public abstractMethod26()V
    .locals 0
    return-void
.end method

.method public abstractMethod27()V
    .locals 0
    return-void
.end method

.method public abstractMethod28()V
    .locals 0
    return-void
.end method

.method public abstractMethod29()V
    .locals 0
    return-void
.end method

.method public abstractMethod30()V
    .locals 0
    return-void
.end method

.method public abstractMethod31()V
    .locals 0
    return-void
.end method

.method public abstractMethod32()V
    .locals 0
    return-void
.end method

.method public abstractMethod33()V
    .locals 0
    return-void
.end method

.method public abstractMethod34()V
    .locals 0
    return-void
.end method

.method public abstractMethod35()V
    .locals 0
    return-void
.end method

.method public abstractMethod36()V
    .locals 0
    return-void
.end method

.method public abstractMethod37()V
    .locals 0
    return-void
.end method

.method public abstractMethod38()V
    .locals 0
    return-void
.end method

.method public abstractMethod39()V
    .locals 0
    return-void
.end method

.method public abstractMethod40()V
    .locals 0
    return-void
.end method

.method public abstractMethod41()V
    .locals 0
    return-void
.end method

.method public abstractMethod42()V
    .locals 0
    return-void
.end method

.method public abstractMethod43()V
    .locals 0
    return-void
.end method

.method public abstractMethod44()V
    .locals 0
    return-void
.end method

.method public abstractMethod45()V
    .locals 0
    return-void
.end method

.method public abstractMethod46()V
    .locals 0
    return-void
.end method

.method public abstractMethod47()V
    .locals 0
    return-void
.end method

.method public abstractMethod48()V
    .locals 0
    return-void
.end method

.method public abstractMethod49()V
    .locals 0
    return-void
.end method

.method public abstractMethod50()V
    .locals 0
    return-void
.end method

.method public abstractMethod51()V
    .locals 0
    return-void
.end method

.method public abstractMethod52()V
    .locals 0
    return-void
.end method

.method public abstractMethod53()V
    .locals 0
    return-void
.end method

.method public abstractMethod54()V
    .locals 0
    return-void
.end method

.method public abstractMethod55()V
    .locals 0
    return-void
.end method

.method public abstractMethod56()V
    .locals 0
    return-void
.end method

.method public abstractMethod57()V
    .locals 0
    return-void
.end method

.method public abstractMethod58()V
    .locals 0
    return-void
.end method

.method public abstractMethod59()V
    .locals 0
    return-void
.end method

.method public abstractMethod60()V
    .locals 0
    return-void
.end method

.method public abstractMethod61()V
    .locals 0
    return-void
.end method

.method public abstractMethod62()V
    .locals 0
    return-void
.end method

.method public abstractMethod63()V
    .locals 0
    return-void
.end method

.method public abstractMethod64()V
    .locals 0
    return-void
.end method
