Skip to content

Commit

Permalink
first upload into public SAMI repository
Browse files Browse the repository at this point in the history
  • Loading branch information
Adam Zabicki committed May 15, 2021
1 parent 6f43a0c commit 45b008e
Show file tree
Hide file tree
Showing 108 changed files with 6,459 additions and 0 deletions.
24 changes: 24 additions & 0 deletions sami_examples/DemoOne_BehavEmotionRating.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
s07t21v1.c3d,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1
s07t20v2.c3d,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1
s03t26v1.c3d,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
s08t12v1.c3d,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
s05t12v2.c3d,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1
s11t07v1.c3d,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1
s08t17v2.c3d,2,2,2,2,2,2,2,1,3,2,2,3,2,2,3,2,2,2,2
s10t20v2.c3d,2,2,2,1,2,2,2,2,2,2,2,1,2,2,1,1,2,2,2
s03t22v2.c3d,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,2,3,2,2
s03t28v1.c3d,1,1,2,1,2,2,2,1,2,2,1,1,2,2,1,1,1,4,2
s03t19v2.c3d,1,1,2,2,2,2,2,2,2,1,2,1,2,2,1,2,3,2,2
s07t26v3.c3d,3,2,2,1,2,2,2,2,3,1,3,2,2,1,1,1,2,2,2
s11t20v2.c3d,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3
s03t32v1.c3d,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3
s10t25v2.c3d,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
s07t34v2.c3d,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3
s07t31v2.c3d,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3
s07t35v1.c3d,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3
s10t06v1.c3d,4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,4,4,4,4
s10t08v1.c3d,4,4,4,4,4,4,1,4,4,4,4,4,4,4,4,4,4,4,4
s07t03v1.c3d,4,4,4,4,4,4,1,4,4,4,4,4,1,4,4,4,4,4,4
s07t32v1.c3d,4,3,4,4,3,4,4,3,4,4,4,4,4,4,4,4,4,4,4
s05t05v2.c3d,4,4,1,4,4,4,3,4,4,4,4,4,4,4,4,4,3,4,4
s10t04v2.c3d,4,3,4,4,3,4,4,3,4,4,3,4,4,4,4,4,1,4,3
24 changes: 24 additions & 0 deletions sami_examples/DemoOne_BehavValenceRating.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
s07t21v1.c3d,2,4,5,3,5,4,5,5,3,5,5,5,4,4,4,2,3,3,3
s07t20v2.c3d,2,5,5,3,3,3,5,4,4,4,4,5,4,2,5,2,3,3,3
s03t26v1.c3d,2,2,4,3,2,3,5,4,3,3,4,3,4,4,3,4,3,3,2
s08t12v1.c3d,3,5,5,2,4,4,5,5,4,3,4,2,3,3,4,1,2,4,1
s05t12v2.c3d,3,2,2,3,2,3,5,4,3,4,4,2,3,3,1,1,3,3,2
s11t07v1.c3d,2,2,3,2,3,3,5,4,2,4,4,1,3,3,3,3,2,3,1
s08t17v2.c3d,2,3,2,2,2,5,5,2,-1,2,4,-1,2,4,1,5,3,2,3
s10t20v2.c3d,2,2,4,2,2,4,4,4,3,3,3,2,3,2,3,1,3,3,2
s03t22v2.c3d,1,3,3,2,2,2,5,2,1,3,4,3,4,3,1,1,-3,4,2
s03t28v1.c3d,2,2,3,1,5,3,5,2,3,4,3,2,3,5,3,2,3,-2,2
s03t19v2.c3d,2,1,3,3,1,2,5,2,2,2,2,1,1,4,0,2,2,3,4
s07t26v3.c3d,-2,1,3,1,1,1,4,1,-2,0,-2,2,1,2,1,2,3,1,1
s11t20v2.c3d,-2,-3,-5,-2,-5,-1,-5,-5,-4,-3,-4,-5,-4,2,-5,-2,-3,-5,-4
s03t32v1.c3d,-2,-2,-5,-4,-5,-2,-5,-5,-3,-4,-4,-5,-4,-5,-5,-5,2,-3,-2
s10t25v2.c3d,-3,-3,-5,-3,-4,-1,-5,-3,-2,-2,-3,-3,-3,-2,-5,-3,-2,-3,-3
s07t34v2.c3d,-3,-2,-2,-2,-4,-3,-5,-2,-3,-3,-2,0,-3,-2,-3,-3,-3,-2,-2
s07t31v2.c3d,-2,-3,-2,-2,-4,-4,-5,-2,-1,-2,-4,0,-2,-4,-3,-1,-3,-1,-2
s07t35v1.c3d,-4,-1,-3,-2,-3,-2,-4,-1,-2,-4,-3,-4,-2,-3,-2,-2,1,-1,-1
s10t06v1.c3d,-2,-2,-2,-3,-3,-2,-5,-1,-2,-5,-2,-2,-3,-2,-3,-1,-3,-2,-2
s10t08v1.c3d,-1,-4,-5,-3,-4,-1,3,-2,-4,-3,-4,-5,-1,-4,-1,-1,-3,-2,-2
s07t03v1.c3d,-2,-3,-4,-1,-2,-3,2,-3,-3,-3,-3,-4,1,-3,-1,-2,-3,-3,-2
s07t32v1.c3d,-2,-2,-3,-2,-3,-2,-3,-2,-2,-2,-2,-4,-2,-3,-2,-3,-2,-2,-1
s05t05v2.c3d,-1,-3,0,-3,-3,-4,-2,-2,-2,-2,-2,-3,-2,-3,-1,-3,-2,-2,-1
s10t04v2.c3d,-1,-1,-3,-2,-3,-2,-3,-3,-2,-2,0,-2,-4,-3,-2,-2,2,-2,-1
92 changes: 92 additions & 0 deletions sami_examples/DemoOne_SAMI.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
%% example script
clear all; close all;

% add toolbox to path
returnHere = pwd;
cd ../sami_toolbox;
addpath(genpath(pwd));
cd(returnHere)

% +++ obligatory: loading userOptions / initializing SAMItoolbox +++++++++++++++++++++++++
userOptions = DemoOne_defineUserOptions();
userOptions = sami.initSAMI(userOptions,'c');

redo = 0;
if redo == 1
% +++ loading c3d-files and checking them ++++++++++++++++++++++++++++++++++++++++++++
c3dData = sami.c3d.importFiles(userOptions);

% +++ calculate features +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
feat_idv = sami.calcFeatures(c3dData, 'idv', userOptions);
feat_itx = sami.calcFeatures(c3dData, 'itx', userOptions);
else
load(fullfile(userOptions.rootPath,'c3dData.mat'));

load(fullfile(userOptions.rootPath,'features_idv.mat'));
load(fullfile(userOptions.rootPath,'features_itx.mat'));
end

% +++ create feature_RDMs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RDMs_idv = sami.createFeatureRDMs(feat_idv, userOptions);
RDMs_itx = sami.createFeatureRDMs(feat_itx, userOptions);

% +++ create model RDMs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
modelThis = {'emotion','valence'};
RDMs_stim_models_categorical = sami.createCategoryRDMs(modelThis, 'binary', userOptions);

% +++ create behavioral RDMs +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[RDMs_behav_val_subj, behav_val_data] = sami.createBehavioralRDMs('DemoOne_BehavValenceRating.txt', 'Valence', 'distance', userOptions);
[RDMs_behav_emo_subj, behav_emo_data] = sami.createBehavioralRDMs('DemoOne_BehavEmotionRating.txt', 'Emotion', 'binary', userOptions);

% average across subjects
RDMs_behav_val = sami.rdm.averageRDMs(RDMs_behav_val_subj,'mean_val_RDM',[1 0 0]);
RDMs_behav_emo = sami.rdm.averageRDMs(RDMs_behav_emo_subj,'mean_emo_RDM',[1 0 0]);

%% display RDMs/MDS plots
% +++ show RDMs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sami.plotRDMs([RDMs_stim_models_categorical RDMs_idv],userOptions);
sami.plotRDMs([RDMs_stim_models_categorical RDMs_itx],userOptions);
sami.plotRDMs([RDMs_behav_val_subj RDMs_behav_val],userOptions);
sami.plotRDMs([RDMs_behav_emo_subj RDMs_behav_emo],userOptions);

% +++ MDS of Stimuli +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sami.MDSofStimuli(RDMs_idv(1), 'emotion', userOptions);
sami.MDSofStimuli(RDMs_idv(1), 'valence', userOptions);

% +++ 2nd order - RDM correlation matrix and MDS +++++++++++++++++++++++++++++++++++++++++
sami.RDMsPairwiseCorrelations([RDMs_stim_models_categorical RDMs_idv], userOptions, 'CAT and IDV');
sami.RDMsPairwiseCorrelations([RDMs_stim_models_categorical RDMs_itx], userOptions, 'CAT and ITX');
sami.RDMsPairwiseCorrelations([RDMs_behav_val RDMs_behav_emo RDMs_idv], userOptions, 'BEHAV and IDV');
sami.RDMsPairwiseCorrelations([RDMs_behav_val RDMs_behav_emo RDMs_itx], userOptions, 'BEHAV and ITX');

sami.MDSofRDMs([RDMs_stim_models_categorical RDMs_idv], userOptions,'CategoricalModels and IDV');
sami.MDSofRDMs([RDMs_stim_models_categorical RDMs_itx], userOptions,'CategoricalModels and ITX');
sami.MDSofRDMs([RDMs_behav_val RDMs_behav_emo RDMs_stim_models_categorical RDMs_idv], userOptions,'Behavior and CategoricalModels and IDV');
sami.MDSofRDMs([RDMs_behav_val RDMs_behav_emo RDMs_stim_models_categorical RDMs_itx], userOptions,'Behavior and CategoricalModels and ITX');

%% do some statistical analyses, like RSA or ANOVA...
% +++ compare METRIC behavioral data +++++++++++++++++++++++++++++++++++++++++++++++++++++
sami.compareBehavData(behav_val_data, 'emotion', 'Valence', userOptions);

% +++ compare CATEGORICAL behavioral data ++++++++++++++++++++++++++++++++++++++++++++++++
sami.compareBehavCategoricalData(behav_emo_data, 'emotion', 'Emotion', userOptions);

% +++ compare average feature-values between specific categories +++++++++++++++++++++++++
sami.compareFeatValues(feat_idv, 'emotion', 'IDV', userOptions);
sami.compareFeatValues(feat_idv, 'valence', 'IDV', userOptions);
sami.compareFeatValues(feat_itx, 'emotion', 'ITX', userOptions);
sami.compareFeatValues(feat_itx, 'valence', 'ITX', userOptions);

% +++ compare categoryRDMs with movement RDMs ++++++++++++++++++++++++++++++++++++++++++++
sami.compareCatRDMs2FeatRDMs(RDMs_stim_models_categorical,RDMs_idv,'Categorical vs IDV',userOptions);
sami.compareCatRDMs2FeatRDMs(RDMs_stim_models_categorical,RDMs_itx,'Categorical vs ITX',userOptions);

% +++ compare behavioralRDMs with movement RDMs ++++++++++++++++++++++++++++++++++++++++++
userOptions.rdms_pairWiseCorr = 'Pearson';
statsA = sami.compareBehavRDMs2FeatRDMs(RDMs_behav_val_subj, RDMs_idv, 'Valence', 'IDV', userOptions);
statsB = sami.compareBehavRDMs2FeatRDMs(RDMs_behav_val_subj, RDMs_itx, 'Valence', 'ITX', userOptions);

userOptions.rdms_pairWiseCorr = 'Kendall_taua';
statsC = sami.compareBehavRDMs2FeatRDMs(RDMs_behav_emo_subj, RDMs_idv, 'Emotion', 'IDV', userOptions);
statsD = sami.compareBehavRDMs2FeatRDMs(RDMs_behav_emo_subj, RDMs_itx, 'Emotion', 'ITX', userOptions);

Binary file added sami_examples/DemoOne_c3d/s03t19v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s03t22v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s03t26v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s03t28v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s03t32v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s05t05v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s05t12v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s07t03v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s07t20v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s07t21v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s07t26v3.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s07t31v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s07t32v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s07t34v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s07t35v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s08t12v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s08t17v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s10t04v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s10t06v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s10t08v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s10t20v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s10t25v2.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s11t07v1.c3d
Binary file not shown.
Binary file added sami_examples/DemoOne_c3d/s11t20v2.c3d
Binary file not shown.
168 changes: 168 additions & 0 deletions sami_examples/DemoOne_defineUserOptions.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
function userOptions = DemoOne_defineUserOptions()
% defineUserOptions is a nullary function which initialises a struct
% containing the preferences and details for a particular project.
% It should be edited to taste before a project is run, and a new
% one created for each substantially different project.
%
% For a guide to how to fill out the fields in this file, consult
% the documentation folder (particularly the userOptions_guide.m)
%
% A. Zabicki 09-2020
%__________________________________________________________________________

userOptions.debug = true; % will save and/or display some more information during execution of several functions

%% **********************************************************
% Project details
% **********************************************************
% *** edit how needed *********************

% This name identifies a collection of files which all belong to the same run of a project.
userOptions.analysisName = 'DemoOne_sami';

% The path leading to where the c3d files are stored.
userOptions.c3dPath = fullfile(pwd,'DemoOne_c3d');

% *** no need to change here anything *******************************
% This is the root directory of the project.
userOptions.rootPath = fullfile(pwd,userOptions.analysisName);
% *******************************************************************


%% **********************************************************
% c3d file and label settings
% **********************************************************

% if "Vicon Plug-in Gait" Modell is used and markers are named according to Plug-in Gait
% and _c3d_personIdentifier, sami_toolbox will transform data automatically
userOptions.c3d_ViconPluginGait = false;

% if markers are available, but named differently, use this to rename labels of "ownMarker"
% into "samiMarker" [Head, LSHO, LELB, LWRI, LHIP, LKNE, LANK, RSHO, RELB, RWRI, RHIP, RKNE, RANK]
userOptions.c3d_OwnMarker = true;
userOptions.c3d_MarkerMatching = {...
'ownMarker','samiMarker';...
'HAND','WRI';...
};
% if specified, user is able to keep own indiviuum identifications,
% otherwise markers will be renamed, e.g. 'p1HEAD' and 'p2HEAD", automatically
% userOptions.c3d_personIdentifier = '[[marker]][[person]]';


%% **********************************************************
% descriptions of stimuli: regarding their categories, and how to sort them
% **********************************************************
% set category which is used to sort the stimuli according to
userOptions.stimuli_sorting = 'emotion';

% if filename is specified: "stimulus_settings" will be loaded from this file
userOptions.stimuli_settings_filename = 'DemoOne_stimuli_settings.txt';
% else: stimulus_settings have to be defined here
userOptions.stimuli_settings = {};

% providing labels for each category describing the stimuli
userOptions.stimuli_naming_key(1).name = 'emotion';
userOptions.stimuli_naming_key(1).condition = {'happiness','affection','sadness','anger'};
userOptions.stimuli_naming_key(1).color = {[0 .5 1],[.1 .8 .1],[1 .5 0],[1 0 0]};
userOptions.stimuli_naming_key(2).name = 'valence';
userOptions.stimuli_naming_key(2).condition = {'positive','negative'};
userOptions.stimuli_naming_key(2).color = {[0 .5 1],[1 .5 0]};

% stimuli_labels for MDS plots
% ---> !!! same order as in first column in userOptions.stimuli_settings_filename !!!
% [userOptions.stimuli_MDS_labels{1:size(userOptions.stimuli_settings,1)-1}] = deal(' ');

%% **********************************************************
% calculating individual/interaction movement-features
% -> comparing movement-features between stimuli-categories
% -> creating movement/feature-RDMs for stimulus-set
% **********************************************************
% set alpha and correction method which will be applied in post-hoc multiple comparisons of feature values
userOptions.feat_threshold = 0.05; % default: 0.05
userOptions.feat_multipleTesting = 'bonferroni'; % ['bonferroni'] | 'tukey-kramer' | 'hsd' | 'lsd' | 'dunn-sidak' | 'scheffe'

% which distance measure to use when calculating feature-RDMs.
userOptions.feat_distance = 'euclidean'; % input into pdist function, default: 'euclidean'

% should feature-RDM-entries be rank transformed into [0,1] before they're displayed?
userOptions.feat_rankTransform = false; % !!!!!!!! NOT YET IMPLEMENTED !!!!!!!!!!!!

%% **********************************************************
% behavioral data:
% -> comparing average behavioral ratings between stimuli-categories
% -> creating behavioral-RDMs for each subject
% **********************************************************
% set alpha and correction method which will be applied in post-hoc multiple comparisons of behavioral ratings
userOptions.behav_threshold = 0.05; % default: 0.05
userOptions.behav_multipleTesting = 'bonferroni'; % ['bonferroni'] | 'tukey-kramer' | 'hsd' | 'lsd' | 'dunn-sidak' | 'scheffe'

% which distance measure to use between stimuli-rating-values when calculating subjects behavioral-RDMs
userOptions.behav_distanceMeasure = 'euclidean'; % input into pdist function, default: 'euclidean'

%% **********************************************************
% MDS plots
% **********************************************************
% what criterion to be minimised in MDS calculation?
userOptions.MDS_criterion = 'metricstress'; % default: 'metricstress'

% style
userOptions.MDS_plotLabels = true; % show labels in MDS-Plot
userOptions.MDS_plotLegend = true; % show color-legend in MDS-plot -> useful for "stimuliMDS()"
userOptions.MDS_dotSize = 20; % default: 20
userOptions.MDS_fontSize = 9; % default: 9

%% **********************************************************
% second-order-analysis of RDMs
% **********************************************************
% which similarity-measure is used for the pair-wise comparison of RDMs
userOptions.rdms_pairWiseCorr = 'Kendall_taua';

% for 'compareCatRDMs2FeatRDMs' function
% set alpha and correction method to be applied in pairwise-RDM-correlation analysis
userOptions.rdms_pairWiseCorrThreshold = 0.05; % default: 0.05
userOptions.rdms_pairWiseCorrMultipleTesting = 'holm'; % ['holm'] | 'bonferroni' | 'FDR'

% for 'compareBehavRDMs2FeatRDMs' function
% set test, alpha and correction method for analysing relatedness of features and behavioral RDMs
userOptions.rdms_relatednessTest = 'signedRank'; % ['signedRank'] | 'randomisation'
userOptions.rdms_relatednessThreshold = 0.05; % default: 0.05
userOptions.rdms_relatednessMultipleTesting = 'FDR'; % ['FDR'] | 'bonferroni' | 'holm'

% set test, alpha and correction method for analysing relatedness of features and behavioral RDMs
userOptions.rdms_differencesTest = 'signedRank'; % ['signedRank'] | 'conditionBootstrap'
userOptions.rdms_differencesThreshold = 0.05; % default: 0.05
userOptions.rdms_differencesMultipleTesting = 'FDR'; % ['FDR'] | 'bonferroni' | 'holm'

% some set test, alpha and correction method for analysing relatedness of features and behavioral RDMs
userOptions.rdms_orderByCorr = true; % sort features by height of relatedness? default: true
userOptions.rdms_nRandomisations = 50000; % default: 50000 (min. 10,000 highly recommended)
userOptions.rdms_nBootstrap = 1000; % default: 1000

%% **********************************************************
% everything else, my be set or not
% (here, defaults are used to show what can be edited)
% **********************************************************
userOptions.default_modelRDMcolor = [.5 .5 .5];
userOptions.default_behavRDMcolor = [.9 .2 .1];

% threshold: minimal number of datapoints for parametric group-comparisons (ANOVA, t-test)
userOptions.stats_minNforSubjectRFXtests = 12;
% threshold: minimal number of datapoints for NON-parametric group-comparisons (Wilcoxon, Kruskall-Walis)
userOptions.stats_minNforNonParamTests = 5;

%% **********************************************************
% handling figures
% **********************************************************
% generall displaying all figures?
userOptions.fig_display = true; % default: true

% How should figures be outputted?
userOptions.fig_saveFIG = true; % default: false
userOptions.fig_savePDF = true; % default: false
userOptions.fig_saveSVG = true; % default: false
userOptions.fig_saveTIF = true; % default: false

% Which dots per inch resolution do we output?
userOptions.fig_dpi = 300;

end
25 changes: 25 additions & 0 deletions sami_examples/DemoOne_stimuli_settings.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
filename,emotion,valence
s07t21v1.c3d,1,1
s07t20v2.c3d,1,1
s03t26v1.c3d,1,1
s08t12v1.c3d,1,1
s05t12v2.c3d,1,1
s11t07v1.c3d,1,1
s08t17v2.c3d,2,1
s10t20v2.c3d,2,1
s03t22v2.c3d,2,1
s03t28v1.c3d,2,1
s03t19v2.c3d,2,1
s07t26v3.c3d,2,1
s11t20v2.c3d,3,2
s03t32v1.c3d,3,2
s10t25v2.c3d,3,2
s07t34v2.c3d,3,2
s07t31v2.c3d,3,2
s07t35v1.c3d,3,2
s10t06v1.c3d,4,2
s10t08v1.c3d,4,2
s07t03v1.c3d,4,2
s07t32v1.c3d,4,2
s05t05v2.c3d,4,2
s10t04v2.c3d,4,2
Loading

0 comments on commit 45b008e

Please sign in to comment.