def main(#A_9#1: FiberTensorFType(DenseLevelFType(SparseListLevelFType(ElementLevelFType(fv=0.0)))), #A_10#2: FiberTensorFType(DenseLevelFType(SparseListLevelFType(ElementLevelFType(fv=0.0)))), #A_4#3: BufferizedNDArray) -> tuple(element_0: BufferizedNDArray):
    #_A_9#4: FiberTensorFType(DenseLevelFType(SparseListLevelFType(ElementLevelFType(fv=0.0)))) = #A_9#1
    #_A_9#4_lvl_lvl_lvl_val_slot: np_buf_t(float64) = unpack(#_A_9#4.lvl.lvl.lvl.val)
    #_A_9#4_lvl_lvl_ptr_slot: np_buf_t(int64) = unpack(#_A_9#4.lvl.lvl.ptr)
    #_A_9#4_lvl_lvl_idx_slot: np_buf_t(int64) = unpack(#_A_9#4.lvl.lvl.idx)
    #A_9_dim_0#5: finch.int64 = #_A_9#4.lvl.dimension
    #A_9_dim_1#6: finch.int64 = #_A_9#4.lvl.lvl.dimension
    #_A_10#7: FiberTensorFType(DenseLevelFType(SparseListLevelFType(ElementLevelFType(fv=0.0)))) = #A_10#2
    #_A_10#7_lvl_lvl_lvl_val_slot: np_buf_t(float64) = unpack(#_A_10#7.lvl.lvl.lvl.val)
    #_A_10#7_lvl_lvl_ptr_slot: np_buf_t(int64) = unpack(#_A_10#7.lvl.lvl.ptr)
    #_A_10#7_lvl_lvl_idx_slot: np_buf_t(int64) = unpack(#_A_10#7.lvl.lvl.idx)
    #A_10_dim_0#8: finch.int64 = #_A_10#7.lvl.dimension
    #A_10_dim_1#9: finch.int64 = #_A_10#7.lvl.lvl.dimension
    #_A_4#10: BufferizedNDArray = #A_4#3
    #_A_4#10_val_slot: np_buf_t(float64) = unpack(#_A_4#10.val)
    #A_4_dim_0#11: finch.int64 = #_A_4#10.shape.element_0
    #A_4_dim_1#12: finch.int64 = #_A_4#10.shape.element_1
    for i in range(0, length(slot(#_A_4#10_val_slot, np_buf_t(float64)))):
        store(slot(#_A_4#10_val_slot, np_buf_t(float64)), i, 0.0)
    for #i_7#13 in range(0, #A_10_dim_0#8):
        #i_7#13__pos: finch.int64 = add(0, mul(#_A_4#10.strides.element_0, #i_7#13))
        #i_7#13__pos_2: finch.int64 = add(0, mul(#_A_9#4.lvl.stride, #i_7#13))
        #i_7#13__pos_3: finch.int64 = add(0, mul(#_A_10#7.lvl.stride, #i_7#13))
        q: finch.int64 = load(slot(#_A_9#4_lvl_lvl_ptr_slot, np_buf_t(int64)), #i_7#13__pos_2)
        q_stop: finch.int64 = load(slot(#_A_9#4_lvl_lvl_ptr_slot, np_buf_t(int64)), add(#i_7#13__pos_2, 1))
        if lt(q, q_stop):
            i_stop: finch.int64 = load(slot(#_A_9#4_lvl_lvl_idx_slot, np_buf_t(int64)), q)
            i_last: finch.int64 = load(slot(#_A_9#4_lvl_lvl_idx_slot, np_buf_t(int64)), sub(q_stop, 1))
        else:
            i_stop: finch.int64 = 1
            i_last: finch.int64 = 0
        q_2: finch.int64 = load(slot(#_A_10#7_lvl_lvl_ptr_slot, np_buf_t(int64)), #i_7#13__pos_3)
        q_stop_2: finch.int64 = load(slot(#_A_10#7_lvl_lvl_ptr_slot, np_buf_t(int64)), add(#i_7#13__pos_3, 1))
        if lt(q_2, q_stop_2):
            i_stop_2: finch.int64 = load(slot(#_A_10#7_lvl_lvl_idx_slot, np_buf_t(int64)), q_2)
            i_last_2: finch.int64 = load(slot(#_A_10#7_lvl_lvl_idx_slot, np_buf_t(int64)), sub(q_stop_2, 1))
        else:
            i_stop_2: finch.int64 = 1
            i_last_2: finch.int64 = 0
        if lt(load(slot(#_A_9#4_lvl_lvl_idx_slot, np_buf_t(int64)), q), 0):
            q: finch.int64 = scansearch(slot(#_A_9#4_lvl_lvl_idx_slot, np_buf_t(int64)), 0, q, sub(q_stop, 1))
        if lt(load(slot(#_A_10#7_lvl_lvl_idx_slot, np_buf_t(int64)), q_2), 0):
            q_2: finch.int64 = scansearch(slot(#_A_10#7_lvl_lvl_idx_slot, np_buf_t(int64)), 0, q_2, sub(q_stop_2, 1))
        i_start: finch.int64 = 0
        while lt(min(i_stop, i_stop_2), min(min(#A_10_dim_1#9, add(i_last, 1)), add(i_last_2, 1))):
            if eq(min(i_stop, i_stop_2), i_stop):
                #i_8#14__pos_2: finch.int64 = q_2
                #i_8#14__pos_4: finch.int64 = q
                #i_8#14__pos_6: finch.int64 = q
                #i_8#14__pos_7: finch.int64 = q_2
                for #i_8#14 in range(i_start, min(min(add(i_stop, 1), i_stop), i_stop_2)):
                    #i_8#14__pos: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
                for #i_8#14 in range(max(i_start, i_stop_2), min(add(i_stop, 1), i_stop)):
                    #i_8#14__pos_3: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
                for #i_8#14 in range(max(i_start, i_stop), min(add(i_stop, 1), i_stop_2)):
                    #i_8#14__pos_5: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
                for #i_8#14 in range(max(max(i_start, i_stop), i_stop_2), add(i_stop, 1)):
                    #i_8#14__pos_8: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
                    store(slot(#_A_4#10_val_slot, np_buf_t(float64)), #i_8#14__pos_8, _initwrite(load(slot(#_A_4#10_val_slot, np_buf_t(float64)), #i_8#14__pos_8), mul(load(slot(#_A_9#4_lvl_lvl_lvl_val_slot, np_buf_t(float64)), #i_8#14__pos_6), load(slot(#_A_10#7_lvl_lvl_lvl_val_slot, np_buf_t(float64)), #i_8#14__pos_7))))
                i_start: finch.int64 = add(i_stop, 1)
                q: finch.int64 = add(q, 1)
                if lt(q, q_stop):
                    i_stop: finch.int64 = load(slot(#_A_9#4_lvl_lvl_idx_slot, np_buf_t(int64)), q)
                else:
                    i_stop: finch.int64 = #_A_9#4.lvl.lvl.dimension
            if eq(min(i_stop, i_stop_2), i_stop_2):
                #i_8#14__pos_10: finch.int64 = q_2
                #i_8#14__pos_12: finch.int64 = q
                #i_8#14__pos_14: finch.int64 = q
                #i_8#14__pos_15: finch.int64 = q_2
                for #i_8#14 in range(i_start, min(min(add(i_stop_2, 1), i_stop), i_stop_2)):
                    #i_8#14__pos_9: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
                for #i_8#14 in range(max(i_start, i_stop_2), min(add(i_stop_2, 1), i_stop)):
                    #i_8#14__pos_11: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
                for #i_8#14 in range(max(i_start, i_stop), min(add(i_stop_2, 1), i_stop_2)):
                    #i_8#14__pos_13: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
                for #i_8#14 in range(max(max(i_start, i_stop), i_stop_2), add(i_stop_2, 1)):
                    #i_8#14__pos_16: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
                    store(slot(#_A_4#10_val_slot, np_buf_t(float64)), #i_8#14__pos_16, _initwrite(load(slot(#_A_4#10_val_slot, np_buf_t(float64)), #i_8#14__pos_16), mul(load(slot(#_A_9#4_lvl_lvl_lvl_val_slot, np_buf_t(float64)), #i_8#14__pos_14), load(slot(#_A_10#7_lvl_lvl_lvl_val_slot, np_buf_t(float64)), #i_8#14__pos_15))))
                i_start: finch.int64 = add(i_stop_2, 1)
                q_2: finch.int64 = add(q_2, 1)
                if lt(q_2, q_stop_2):
                    i_stop_2: finch.int64 = load(slot(#_A_10#7_lvl_lvl_idx_slot, np_buf_t(int64)), q_2)
                else:
                    i_stop_2: finch.int64 = #_A_10#7.lvl.lvl.dimension
        for #i_8#14 in range(max(0, add(i_last_2, 1)), min(#A_10_dim_1#9, add(i_last, 1))):
            #i_8#14__pos_17: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
        for #i_8#14 in range(max(0, add(i_last, 1)), min(#A_10_dim_1#9, add(i_last_2, 1))):
            #i_8#14__pos_18: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
        for #i_8#14 in range(max(max(0, add(i_last, 1)), add(i_last_2, 1)), #A_10_dim_1#9):
            #i_8#14__pos_19: finch.int64 = add(#i_7#13__pos, mul(#_A_4#10.strides.element_1, #i_8#14))
    repack(#_A_9#4_lvl_lvl_lvl_val_slot)
    repack(#_A_9#4_lvl_lvl_ptr_slot)
    repack(#_A_9#4_lvl_lvl_idx_slot)
    repack(#_A_10#7_lvl_lvl_lvl_val_slot)
    repack(#_A_10#7_lvl_lvl_ptr_slot)
    repack(#_A_10#7_lvl_lvl_idx_slot)
    repack(#_A_4#10_val_slot)
    main_return: tuple(element_0: BufferizedNDArray) = make_tuple(#A_4#3)
    return main_return
