//用到了Havel-Hakimi定理,判断是否能够构图
//两种情况不能构图,1:对剩下序列排序后,最大的度数超过了剩下的顶点数
// 2:对最大的度数后面的f个度数减-后,出现了负数
//记录到临街矩阵只需要每次排序后减-记录。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 20
struct node
{
int u,index;
} a[N];
int ma[N][N];
int cmp(const void *a,const void *b)
{
return (*(struct node *)b).u-(*(struct node *)a).u;
}
int main()
{
int t,n,i,j,flag,to,index;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&a[i].u);
a[i].index=i+1;
}
flag=1;
memset(ma,0,sizeof(ma));
for(i=0; i<n&&flag; i++)
{
qsort(a+i,n-i,sizeof(a[0]),cmp);
to=a[i].u;
index=a[i].index;
if(to>n-i-1)flag=0;
for(j=i+1; j<n&&flag; j++)
{
if(to==0)break;
if(a[j].u<=0)flag=0;
a[j].u--;
to--;
ma[index][a[j].index]=ma[a[j].index][index]=1;
}
}
if(flag==0)
printf("NO\n");
else {
printf("YES\n");
for(i=1; i<=n; i++)
{
for(j=1; j<=n-1; j++)
printf("%d ",ma[i][j]);
printf("%d\n",ma[i][j]);
}
}
if(t)
printf("\n");
}
return 0;
}