<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class="">Stefano, </div><div class=""><br class=""></div>I will report the results to these shortly. To your second question, this is the first matrix assembly of the code. <div class=""><br class=""></div><div class="">-Manav<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Aug 20, 2020, at 8:31 AM, Stefano Zampini <<a href="mailto:stefano.zampini@gmail.com" class="">stefano.zampini@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Manav<div class=""><br class=""></div><div class="">Can you add a MPI_Barrier before</div><div class=""><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class=""><br class=""></span></div><div class=""><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class="">ierr = MatAssemblyBegin(aij->A,mode);CHKERRQ(ierr);</span><div class=""><br class=""></div><div class="">Also, in order to assess where the issue is, we need to see the values (per rank) of </div><div class=""><br class=""></div><div class=""><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class="">((Mat_SeqAIJ*)aij->B->data)->nonew</span></div><div class=""><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class="">mat->was_assembled</span></div><div class=""><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class="">aij->donotstash</span></div><div class=""><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class="">mat->nooffprocentries</span></div><div class=""><br class=""></div><div class="">Another question: is this the first matrix assembly of the code?</div><div class="">If you change to pc_none, do you get the same issue?</div><div class=""><br class=""><blockquote type="cite" class=""><div class="">On Aug 20, 2020, at 3:10 PM, Manav Bhatia <<a href="mailto:bhatiamanav@gmail.com" class="">bhatiamanav@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">On Aug 19, 2020, at 9:39 PM, Matthew Knepley <<a href="mailto:knepley@gmail.com" class="">knepley@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">Jed is more knowledgeable about the communication, but I have a simple question about the FEM method. Normally, the way</div><div style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">we divide unknowns is that the only unknowns which might have entries computed off-process are those on the partition boundary.</div><div style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">However, it sounds like you have a huge number of communicated values. Is it possible that the division of rows in your matrix does</div><div style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">not match the division of the cells you compute element matrices for?</div></div></blockquote></div><div class=""><br class=""></div><div class="">I hope that is not the case. I am using libMesh to manage the mesh and creation of sparsity pattern, which uses Parmetis to create the partitions. </div><div class="">libMesh ensures that off-process entries are only at the partition boundary (unless an extra set of DoFs are marked for coupling. </div><div class=""><br class=""></div><div class="">I also printed and looked at the n_nz and n_oz values on each rank and it does not seem to raise any flags. </div><div class=""><br class=""></div><div class="">I will try to dig in a bit further to make sure everything checks out. </div><div class=""><br class=""></div><div class="">Looking at the screenshots I had shared yesterday, all processes are in this function: </div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(88, 208, 247); background-color: rgb(255, 255, 255);" class="">PetscErrorCode<span style="" class=""> </span>MatAssemblyEnd_MPIAIJ<span style="" class="">(Mat mat,MatAssemblyType mode)</span></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class="">{</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> Mat_MPIAIJ *aij = (Mat_MPIAIJ*)mat->data;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> Mat_SeqAIJ *a = (Mat_SeqAIJ*)aij->A->data;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> PetscErrorCode ierr;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> PetscMPIInt n;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> PetscInt i,j,rstart,ncols,flg;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> PetscInt *row,*col;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> PetscBool other_disassembled;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> PetscScalar *val;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 15px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(154, 170, 186); background-color: rgb(255, 255, 255);" class=""><span style="" class=""> </span>/* do not use 'b = (Mat_SeqAIJ*)aij->B->data' as B can be reset in disassembly */</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 15px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> PetscFunctionBegin;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">if</b></span> (!aij->donotstash && !mat->nooffprocentries) {</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">while</b></span> (<span style="color: rgb(174, 153, 45);" class="">1</span>) {</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatStashScatterGetMesg_Private(&mat->stash,&n,&row,&col,&val,&flg);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">if</b></span> (!flg) <span style="color: rgb(202, 6, 91);" class=""><b class="">break</b></span>;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 15px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">for</b></span> (i=<span style="color: rgb(174, 153, 45);" class="">0</span>; i<n; ) {</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(154, 170, 186); background-color: rgb(255, 255, 255);" class=""><span style="" class=""> </span>/* Now identify the consecutive vals belonging to the same row */</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">for</b></span> (j=i,rstart=row[j]; j<n; j++) {</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">if</b></span> (row[j] != rstart) <span style="color: rgb(202, 6, 91);" class=""><b class="">break</b></span>;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> }</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">if</b></span> (j < n) ncols = j-i;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">else</b></span> ncols = n-i;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(154, 170, 186); background-color: rgb(255, 255, 255);" class=""><span style="" class=""> </span>/* Now assemble all these values with a single function call */</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatSetValues_MPIAIJ(mat,<span style="color: rgb(174, 153, 45);" class="">1</span>,row+i,ncols,col+i,val+i,mat->insertmode);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 15px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> i = j;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> }</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> }</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatStashScatterEnd_Private(&mat->stash);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> }</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatAssemblyBegin(aij->A,mode);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatAssemblyEnd(aij->A,mode);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 15px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(154, 170, 186); background-color: rgb(255, 255, 255);" class=""><span style="" class=""> </span>/* determine if any processor has disassembled, if so we must</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(154, 170, 186); background-color: rgb(255, 255, 255);" class=""> also disassemble ourselfs, in order that we may reassemble. */</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(154, 170, 186);" class="">/*</span></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(154, 170, 186); background-color: rgb(255, 255, 255);" class=""> if nonzero structure of submatrix B cannot change then we know that</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(154, 170, 186); background-color: rgb(255, 255, 255);" class=""> no processor disassembled thus we can skip this stuff</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(154, 170, 186); background-color: rgb(255, 255, 255);" class=""> */</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">if</b></span> (!((Mat_SeqAIJ*)aij->B->data)->nonew) {</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MPIU_Allreduce(&mat->was_assembled,&other_disassembled,<span style="color: rgb(174, 153, 45);" class="">1</span>,MPIU_BOOL,MPI_PROD,PetscObjectComm((PetscObject)mat));CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">if</b></span> (mat->was_assembled && !other_disassembled) {</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatDisAssemble_MPIAIJ(mat);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> }</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> }</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">if</b></span> (!mat->was_assembled && mode == MAT_FINAL_ASSEMBLY) {</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatSetUpMultiply_MPIAIJ(mat);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> }</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatSetOption(aij->B,MAT_USE_INODES,PETSC_FALSE);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatAssemblyBegin(aij->B,mode);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatAssemblyEnd(aij->B,mode);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 15px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = PetscFree2(aij->rowvalues,aij->rowindices);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 15px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> aij->rowvalues = <span style="color: rgb(174, 153, 45);" class="">0</span>;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 15px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = VecDestroy(&aij->diag);CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">if</b></span> (a->inode.size) mat->ops->multdiagonalblock = MatMultDiagonalBlock_MPIAIJ;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 15px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; color: rgb(154, 170, 186); background-color: rgb(255, 255, 255);" class=""><span style="" class=""> </span>/* if no new nonzero locations are allowed in matrix then only set the matrix state the first time through */</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> <span style="color: rgb(202, 6, 91);" class=""><b class="">if</b></span> ((!mat->was_assembled && mode == MAT_FINAL_ASSEMBLY) || !((Mat_SeqAIJ*)(aij->A->data))->nonew) {</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> PetscObjectState state = aij->A->nonzerostate + aij->B->nonzerostate;</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MPIU_Allreduce(&state,&mat->nonzerostate,<span style="color: rgb(174, 153, 45);" class="">1</span>,MPIU_INT64,MPI_SUM,PetscObjectComm((PetscObject)mat));CHKERRQ(ierr);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> }</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> PetscFunctionReturn(<span style="color: rgb(174, 153, 45);" class="">0</span>);</div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class="">}</div></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""> I noticed that of the 8 MPI processes, 2 were stuck at </div><div style="margin: 0px; font-stretch: normal; font-size: 13px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""> ierr = MatStashScatterGetMesg_Private(&mat->stash,&n,&row,&col,&val,&flg);CHKERRQ(ierr);</div><div class=""><span style="caret-color: rgb(0, 0, 0);" class=""><br class=""></span></div><div class=""><span style="caret-color: rgb(0, 0, 0);" class="">Other two were stuck at</span></div><div class=""><span style="caret-color: rgb(0, 0, 0);" class=""> </span><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class=""> </span><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class=""> </span><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class="">ierr = MatStashScatterEnd_Private(&mat->stash);CHKERRQ(ierr);</span></div><div class=""><span style="caret-color: rgb(0, 0, 0);" class=""><br class=""></span></div><div class=""><span style="caret-color: rgb(0, 0, 0);" class="">And remaining four were under</span></div><div class=""><span style="caret-color: rgb(0, 0, 0);" class=""> </span><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class=""> </span><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class=""> </span><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class="">ierr = MatSetUpMultiply_MPIAIJ(mat);CHKERRQ(ierr);</span></div><div class=""><span style="font-family: Menlo; font-size: 13px; background-color: rgb(255, 255, 255);" class=""><br class=""></span></div><div class=""><span style="caret-color: rgb(0, 0, 0);" class="">Is it expected for processes to be at different stages in this function? </span></div><div class=""><span style="caret-color: rgb(0, 0, 0);" class=""><br class=""></span></div><div class=""><span style="caret-color: rgb(0, 0, 0);" class="">-Manav</span></div><div class=""><span style="caret-color: rgb(0, 0, 0);" class=""><br class=""></span></div><div class=""><span style="caret-color: rgb(0, 0, 0);" class=""><br class=""></span></div></div></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div></body></html>