#include<bits/stdc++.h>
using namespace std;
#define repp(it, a) for(auto it = a.begin(); it != a.end(); ++it)
map<int, int> color;
map<int, vector<int>> idxs;
int arr[100005];
int n;
bool is_possible(){
for(int i = 0; i < n; ++i){
if(n - color[arr[i]] < color[arr[i]]) return false;
}
return true;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int t;
cin>>t;
while(t--){
cin>>n;
color = map<int, int>();
idxs = map<int, vector<int>>();
for(int i = 0; i < n; ++i)
cin>>arr[i],
color[arr[i]]++,
idxs[arr[i]].push_back(i);
bool possible = is_possible();
if(!possible){
cout<<"No"<<endl;
continue;
}
cout<<"Yes"<<endl;
repp(i, idxs){
i++;
auto j = i==idxs.end() ? idxs.begin() : i;
i--;
auto & temp = (*i).second;
int l = temp.size();
for(int k = 0; k < l; ++k){
while(color[(*j).first] <= 0 || j == i) {
j++;
if(j == idxs.end()) j = idxs.begin();
}
arr[temp[k]] = (*j).first;
color[(*j).first]--;
}
}
for(int i = 0; i < n; ++i) cout<<arr[i]<<" ";
cout<<endl;
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSByZXBwKGl0LCBhKSBmb3IoYXV0byBpdCA9IGEuYmVnaW4oKTsgaXQgIT0gYS5lbmQoKTsgKytpdCkKCm1hcDxpbnQsIGludD4gY29sb3I7Cm1hcDxpbnQsIHZlY3RvcjxpbnQ+PiBpZHhzOwppbnQgYXJyWzEwMDAwNV07CmludCBuOwoKYm9vbCBpc19wb3NzaWJsZSgpewogICAgZm9yKGludCBpID0gMDsgaSA8IG47ICsraSl7CiAgICAgICAgaWYobiAtIGNvbG9yW2FycltpXV0gPCBjb2xvclthcnJbaV1dKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKaW50IG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKSwgY291dC50aWUoTlVMTCk7CgogICAgaW50IHQ7CiAgICBjaW4+PnQ7CiAgICB3aGlsZSh0LS0pewogICAgICAgIGNpbj4+bjsKICAgICAgICBjb2xvciA9IG1hcDxpbnQsIGludD4oKTsKICAgICAgICBpZHhzID0gbWFwPGludCwgdmVjdG9yPGludD4+KCk7CgogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyArK2kpCiAgICAgICAgICAgIGNpbj4+YXJyW2ldLAogICAgICAgICAgICBjb2xvclthcnJbaV1dKyssCiAgICAgICAgICAgIGlkeHNbYXJyW2ldXS5wdXNoX2JhY2soaSk7CgogICAgICAgIGJvb2wgcG9zc2libGUgPSBpc19wb3NzaWJsZSgpOwogICAgICAgIGlmKCFwb3NzaWJsZSl7CiAgICAgICAgICAgIGNvdXQ8PCJObyI8PGVuZGw7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgY291dDw8IlllcyI8PGVuZGw7CiAgICAgICAgcmVwcChpLCBpZHhzKXsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBhdXRvIGogPSBpPT1pZHhzLmVuZCgpID8gaWR4cy5iZWdpbigpIDogaTsKICAgICAgICAgICAgaS0tOwogICAgICAgICAgICBhdXRvICYgdGVtcCA9ICgqaSkuc2Vjb25kOwogICAgICAgICAgICBpbnQgbCA9IHRlbXAuc2l6ZSgpOwogICAgICAgICAgICBmb3IoaW50IGsgPSAwOyBrIDwgbDsgKytrKXsKICAgICAgICAgICAgICAgIHdoaWxlKGNvbG9yWygqaikuZmlyc3RdIDw9IDAgfHwgaiA9PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgICAgIGlmKGogPT0gaWR4cy5lbmQoKSkgaiA9IGlkeHMuYmVnaW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFyclt0ZW1wW2tdXSA9ICgqaikuZmlyc3Q7CiAgICAgICAgICAgICAgICBjb2xvclsoKmopLmZpcnN0XS0tOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyArK2kpIGNvdXQ8PGFycltpXTw8IiAiOwogICAgICAgIGNvdXQ8PGVuZGw7CiAgICB9CgoKICAgIHJldHVybiAwOwp9Cg==