diff --git a/lib/org/ciyam/AT/1.4.1/AT-1.4.1.jar b/lib/org/ciyam/AT/1.4.1/AT-1.4.1.jar
new file mode 100644
index 00000000..05c548c8
Binary files /dev/null and b/lib/org/ciyam/AT/1.4.1/AT-1.4.1.jar differ
diff --git a/lib/org/ciyam/AT/1.4.1/AT-1.4.1.pom b/lib/org/ciyam/AT/1.4.1/AT-1.4.1.pom
new file mode 100644
index 00000000..16f644b9
--- /dev/null
+++ b/lib/org/ciyam/AT/1.4.1/AT-1.4.1.pom
@@ -0,0 +1,124 @@
+
+ 4.0.0
+ org.ciyam
+ AT
+ 1.4.1
+ jar
+
+
+ UTF-8
+ false
+
+ 3.8.1
+ 3.2.0
+ 3.3.1
+ 3.0.0-M4
+ 3.2.0
+
+ 1.64
+
+
+
+ src/main/java
+ src/test/java
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 11
+ 11
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ ${skipTests}
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ ${maven-source-plugin.version}
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+
+ attach-javadoc
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ test-jar
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ ${maven-source-plugin.version}
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+ org.bouncycastle
+ bcprov-jdk15on
+ ${bouncycastle.version}
+ test
+
+
+ junit
+ junit
+ 4.13
+ test
+
+
+
diff --git a/lib/org/ciyam/AT/maven-metadata-local.xml b/lib/org/ciyam/AT/maven-metadata-local.xml
index 063c735d..d8f3dd34 100644
--- a/lib/org/ciyam/AT/maven-metadata-local.xml
+++ b/lib/org/ciyam/AT/maven-metadata-local.xml
@@ -3,7 +3,7 @@
org.ciyam
AT
- 1.4.0
+ 1.4.1
1.3.4
1.3.5
@@ -11,7 +11,8 @@
1.3.7
1.3.8
1.4.0
+ 1.4.1
- 20221105114346
+ 20230821074325
diff --git a/pom.xml b/pom.xml
index fbcd40a5..0d286d8d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,18 +11,18 @@
0.15.10
1.69
${maven.build.timestamp}
- 1.4.0
- 3.6
- 1.8
- 2.6
- 1.21
- 3.12.0
+ 1.4.1
+ 3.9.0
+ 1.10.0
+ 2.13.0
+ 1.23.0
+ 3.13.0
1.9
1.2.2
- 28.1-jre
- 2.5.1
+ 32.1.2-jre
+ 2.7.2
1.2.1
- 70.1
+ 73.2
1.1
2.29.1
9.4.29.v20200521
@@ -33,9 +33,9 @@
3.23.8
1.1.0
1.13.1
- 4.10
- 1.45.1
- 3.19.4
+ 4.12
+ 1.57.2
+ 3.24.2
1.17
diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java
index cd2b30fa..c2e9cd62 100644
--- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java
+++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java
@@ -454,40 +454,40 @@ public class HSQLDBDatabaseUpdates {
case 12:
// Groups
- stmt.execute("CREATE TABLE Groups (group_id GroupID, owner QortalAddress NOT NULL, group_name GroupName NOT NULL, "
+ stmt.execute("CREATE TABLE `Groups` (group_id GroupID, owner QortalAddress NOT NULL, group_name GroupName NOT NULL, "
+ "created_when EpochMillis NOT NULL, updated_when EpochMillis, is_open BOOLEAN NOT NULL, "
+ "approval_threshold TINYINT NOT NULL, min_block_delay INTEGER NOT NULL, max_block_delay INTEGER NOT NULL, "
+ "reference Signature, creation_group_id GroupID, reduced_group_name GroupName NOT NULL, "
+ "description GenericDescription NOT NULL, PRIMARY KEY (group_id))");
// For finding groups by name
- stmt.execute("CREATE INDEX GroupNameIndex on Groups (group_name)");
+ stmt.execute("CREATE INDEX GroupNameIndex on `Groups` (group_name)");
// For finding groups by reduced name
- stmt.execute("CREATE INDEX GroupReducedNameIndex on Groups (reduced_group_name)");
+ stmt.execute("CREATE INDEX GroupReducedNameIndex on `Groups` (reduced_group_name)");
// For finding groups by owner
- stmt.execute("CREATE INDEX GroupOwnerIndex ON Groups (owner)");
+ stmt.execute("CREATE INDEX GroupOwnerIndex ON `Groups` (owner)");
// We need a corresponding trigger to make sure new group_id values are assigned sequentially starting from 1
- stmt.execute("CREATE TRIGGER Group_ID_Trigger BEFORE INSERT ON Groups "
+ stmt.execute("CREATE TRIGGER Group_ID_Trigger BEFORE INSERT ON `Groups` "
+ "REFERENCING NEW ROW AS new_row FOR EACH ROW WHEN (new_row.group_id IS NULL) "
- + "SET new_row.group_id = (SELECT IFNULL(MAX(group_id) + 1, 1) FROM Groups)");
+ + "SET new_row.group_id = (SELECT IFNULL(MAX(group_id) + 1, 1) FROM `Groups`)");
// Admins
stmt.execute("CREATE TABLE GroupAdmins (group_id GroupID, admin QortalAddress, reference Signature NOT NULL, "
- + "PRIMARY KEY (group_id, admin), FOREIGN KEY (group_id) REFERENCES Groups (group_id) ON DELETE CASCADE)");
+ + "PRIMARY KEY (group_id, admin), FOREIGN KEY (group_id) REFERENCES `Groups` (group_id) ON DELETE CASCADE)");
// For finding groups by admin address
stmt.execute("CREATE INDEX GroupAdminIndex ON GroupAdmins (admin)");
// Members
stmt.execute("CREATE TABLE GroupMembers (group_id GroupID, address QortalAddress, "
+ "joined_when EpochMillis NOT NULL, reference Signature NOT NULL, "
- + "PRIMARY KEY (group_id, address), FOREIGN KEY (group_id) REFERENCES Groups (group_id) ON DELETE CASCADE)");
+ + "PRIMARY KEY (group_id, address), FOREIGN KEY (group_id) REFERENCES `Groups` (group_id) ON DELETE CASCADE)");
// For finding groups by member address
stmt.execute("CREATE INDEX GroupMemberIndex ON GroupMembers (address)");
// Invites
stmt.execute("CREATE TABLE GroupInvites (group_id GroupID, inviter QortalAddress, invitee QortalAddress, "
+ "expires_when EpochMillis, reference Signature, "
- + "PRIMARY KEY (group_id, invitee), FOREIGN KEY (group_id) REFERENCES Groups (group_id) ON DELETE CASCADE)");
+ + "PRIMARY KEY (group_id, invitee), FOREIGN KEY (group_id) REFERENCES `Groups` (group_id) ON DELETE CASCADE)");
// For finding invites sent by inviter
stmt.execute("CREATE INDEX GroupInviteInviterIndex ON GroupInvites (inviter)");
// For finding invites by group
@@ -503,7 +503,7 @@ public class HSQLDBDatabaseUpdates {
// NULL expires_when means does not expire!
stmt.execute("CREATE TABLE GroupBans (group_id GroupID, offender QortalAddress, admin QortalAddress NOT NULL, "
+ "banned_when EpochMillis NOT NULL, reason GenericDescription NOT NULL, expires_when EpochMillis, reference Signature NOT NULL, "
- + "PRIMARY KEY (group_id, offender), FOREIGN KEY (group_id) REFERENCES Groups (group_id) ON DELETE CASCADE)");
+ + "PRIMARY KEY (group_id, offender), FOREIGN KEY (group_id) REFERENCES `Groups` (group_id) ON DELETE CASCADE)");
// For expiry maintenance
stmt.execute("CREATE INDEX GroupBanExpiryIndex ON GroupBans (expires_when)");
break;