#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <utility>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <queue>
#include <cassert>
#define rf freopen("in.in", "r", stdin)
#define wf freopen("out.out", "w", stdout)
#define rep(i, s, n) for(int i=int(s); i<=int(n); ++i)
using namespace std;
const int mx = 1e5 + 10, mod = 1e9+7;
char tic[21][21];
int main()
{
//rf;// wf;
ios::sync_with_stdio(0);
int t;
cin >> t;
assert(1 <= t and t <= 100);
while(t--)
{
int n, k;
cin >> n >> k;
assert(1 <=n and n<=20 and 1<=k and k<=n);
rep(i, 0, n-1)
cin >> tic[i];
int check = 0;
rep(i, 0, n-1)
{
rep(j, 0, n-1)
{
int markr = 0, markc = 0, markd1 = 0, markd2 = 0;
int lenr = 0, lenc = 0, lend1 = 0, lend2 = 0;
int ti = i, tj = j, tk = i;
rep(p, 0, k-1)
{
if(ti < n and markr <= 1)
{
if(tic[ti][j] == 'X')
lenr++;
if(tic[ti][j] == '.' and !markr)
lenr++, markr++;
}
if(tj < n and markc <= 1)
{
if(tic[i][tj] == 'X')
lenc++;
if(tic[i][tj] == '.' and !markc)
lenc++, markc++;
}
if(ti < n and tj < n and markd1 <= 1)
{
if(tic[ti][tj] == 'X')
lend1++;
if(tic[ti][tj] == '.' and !markd1)
lend1++, markd1++;
}
if(tk >= 0 and tj < n and markd2 <= 1)
{
if(tic[tk][tj] == 'X')
lend2++;
if(tic[tk][tj] == '.' and !markd2)
lend2++, markd2++;
}
ti++; tj++; tk--;
}
if(lend1 == k or lend2 == k or lenc == k or lenr == k)
{
cout << "YES\n";
check = 1;
break;
}
}
if(check)
break;
}
if(!check)
cout << "NO\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2RlZmluZSByZiBmcmVvcGVuKCJpbi5pbiIsICJyIiwgc3RkaW4pCiNkZWZpbmUgd2YgZnJlb3Blbigib3V0Lm91dCIsICJ3Iiwgc3Rkb3V0KQojZGVmaW5lIHJlcChpLCBzLCBuKSBmb3IoaW50IGk9aW50KHMpOyBpPD1pbnQobik7ICsraSkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IG14ID0gMWU1ICsgMTAsIG1vZCA9IDFlOSs3OwogCmNoYXIgdGljWzIxXVsyMV07CiAKaW50IG1haW4oKQp7CgkvL3JmOy8vIHdmOwoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAKCWludCB0OwoJY2luID4+IHQ7Cglhc3NlcnQoMSA8PSB0IGFuZCB0IDw9IDEwMCk7CiAKCXdoaWxlKHQtLSkKCXsKCQlpbnQgbiwgazsKCQljaW4gPj4gbiA+PiBrOwoJCWFzc2VydCgxIDw9biBhbmQgbjw9MjAgYW5kIDE8PWsgYW5kIGs8PW4pOwogCgkJcmVwKGksIDAsIG4tMSkKCQkJY2luID4+IHRpY1tpXTsKCQkKCQlpbnQgY2hlY2sgPSAwOwoJCXJlcChpLCAwLCBuLTEpCgkJewoJCQlyZXAoaiwgMCwgbi0xKQoJCQl7CgkJCQlpbnQgbWFya3IgPSAwLCBtYXJrYyA9IDAsIG1hcmtkMSA9IDAsIG1hcmtkMiA9IDA7CgkJCQlpbnQgbGVuciA9IDAsIGxlbmMgPSAwLCBsZW5kMSA9IDAsIGxlbmQyID0gMDsKCQkJCWludCB0aSA9IGksIHRqID0gaiwgdGsgPSBpOwogCgkJCQlyZXAocCwgMCwgay0xKQoJCQkJewoJCQkJCWlmKHRpIDwgbiBhbmQgbWFya3IgPD0gMSkKCQkJCQl7CgkJCQkJCWlmKHRpY1t0aV1bal0gPT0gJ1gnKQoJCQkJCQkJbGVucisrOwoJCQkJCQlpZih0aWNbdGldW2pdID09ICcuJyBhbmQgIW1hcmtyKQoJCQkJCQkJbGVucisrLCBtYXJrcisrOwoJCQkJCX0KCQkJCQlpZih0aiA8IG4gYW5kIG1hcmtjIDw9IDEpCgkJCQkJewoJCQkJCQlpZih0aWNbaV1bdGpdID09ICdYJykKCQkJCQkJCWxlbmMrKzsKCQkJCQkJaWYodGljW2ldW3RqXSA9PSAnLicgYW5kICFtYXJrYykKCQkJCQkJCWxlbmMrKywgbWFya2MrKzsKCQkJCQl9CgkJCQkJaWYodGkgPCBuIGFuZCB0aiA8IG4gYW5kIG1hcmtkMSA8PSAxKQoJCQkJCXsKCQkJCQkJaWYodGljW3RpXVt0al0gPT0gJ1gnKQoJCQkJCQkJbGVuZDErKzsKCQkJCQkJaWYodGljW3RpXVt0al0gPT0gJy4nIGFuZCAhbWFya2QxKQoJCQkJCQkJbGVuZDErKywgbWFya2QxKys7CgkJCQkJfQoJCQkJCWlmKHRrID49IDAgYW5kIHRqIDwgbiBhbmQgbWFya2QyIDw9IDEpCgkJCQkJewoJCQkJCQlpZih0aWNbdGtdW3RqXSA9PSAnWCcpCgkJCQkJCQlsZW5kMisrOwoJCQkJCQlpZih0aWNbdGtdW3RqXSA9PSAnLicgYW5kICFtYXJrZDIpCgkJCQkJCQlsZW5kMisrLCBtYXJrZDIrKzsKCQkJCQl9CiAKIAoJCQkJCXRpKys7IHRqKys7IHRrLS07CgkJCQl9CiAKCQkJCWlmKGxlbmQxID09IGsgb3IgbGVuZDIgPT0gayBvciBsZW5jID09IGsgb3IgbGVuciA9PSBrKQoJCQkJewoJCQkJCWNvdXQgPDwgIllFU1xuIjsKCQkJCQljaGVjayA9IDE7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KIAoJCQlpZihjaGVjaykKCQkJCWJyZWFrOwoJCX0KIAoJCWlmKCFjaGVjaykKCQkJY291dCA8PCAiTk9cbiI7Cgl9CglyZXR1cm4gMDsKfQog