diff --git a/examples/AliPay/Airline/Airline.en.shtml b/examples/AliPay/Airline/Airline.en.shtml
new file mode 100644
index 00000000..50e5ddb0
--- /dev/null
+++ b/examples/AliPay/Airline/Airline.en.shtml
@@ -0,0 +1,164 @@
+
+
+
diff --git a/examples/AliPay/Airline/Airline.xml b/examples/AliPay/Airline/Airline.xml
new file mode 100644
index 00000000..2d9146fc
--- /dev/null
+++ b/examples/AliPay/Airline/Airline.xml
@@ -0,0 +1,152 @@
+
+
+
+ ]>
+
+
+
+ Ticket
+ Tickets
+
+
+
+
+ 0x6060c2bc6bcd71b528e9669ccac0faf17824e3cd
+
+
+
+
+
+
+
+
+
+
+
+
+ &Airline.en;
+
+
+ &Airline.en;
+
+
+
+
+
+
+
+
+ Time
+
+
+
+
+
+
+
+
+
+ City
+
+
+
+
+
+ Shanghai
+
+
+ London
+
+
+
+
+
+
+
+
+ Venue
+
+
+
+
+
+ Shanghai Pudong Airport
+
+
+ London Heathrow Airport
+
+
+
+
+
+
+
+
+
+ From
+
+
+
+
+
+
+
+
+ To
+
+
+
+
+
+
+
+
+ Cat
+ 等级
+ Cat
+
+
+
+
+
+ Business Class
+
+
+
+
+
+
+
+
+ №
+
+
+
+
+
+
+
+
+ Redeemed
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/AliPay/Hotel/Hotel.en.shtml b/examples/AliPay/Hotel/Hotel.en.shtml
new file mode 100644
index 00000000..50e5ddb0
--- /dev/null
+++ b/examples/AliPay/Hotel/Hotel.en.shtml
@@ -0,0 +1,164 @@
+
+
+
diff --git a/examples/AliPay/Hotel/Hotel.xml b/examples/AliPay/Hotel/Hotel.xml
new file mode 100644
index 00000000..e9bcc129
--- /dev/null
+++ b/examples/AliPay/Hotel/Hotel.xml
@@ -0,0 +1,133 @@
+
+
+
+ ]>
+
+
+
+ Reservation
+ Reservations
+
+
+
+
+ 0x1391f80f4b7c5e88ae8354b9c1094236f89c8274
+
+
+
+
+
+
+
+
+
+
+
+
+ &Hotel.en;
+
+
+ &Hotel.en;
+
+
+
+
+
+
+
+
+ Time
+
+
+
+
+
+
+
+
+
+ City
+
+
+
+
+
+ Shanghai
+
+
+ London
+
+
+
+
+
+
+
+
+ Venue
+
+
+
+
+
+ Hilton Resorts
+
+
+ Trump Tower
+
+
+
+
+
+
+
+
+ Cat
+ 等级
+ Cat
+
+
+
+
+
+ Executive Suite
+
+
+ Deluxe Suite
+
+
+
+
+
+
+
+
+ №
+
+
+
+
+
+
+
+
+ Redeemed
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/AliPay/Makefile b/examples/AliPay/Makefile
new file mode 100644
index 00000000..f23ccd51
--- /dev/null
+++ b/examples/AliPay/Makefile
@@ -0,0 +1,38 @@
+XMLSECTOOL=xmlsectool
+KEYSTORE=
+KEY=1
+KEYPASSWORD=
+SIGNATURE_ALGORITHM=rsa-sha256
+
+help:
+ # Needs a target, example: $$ make EntryToken.canonicalized.xml
+ #
+ # Let's say you have a TokenScript "EntryToken.xml"
+ #- to validate and canonicalize, add 'canonicalized' in the filename
+ @echo $$ make EntryToken.canonicalized.xml
+ # - to sign, use tsml as file extension:
+ @echo $$ make EntryToken.tsml
+
+%.canonicalized.xml : %.xml
+ # xmlsectool canonicalises automatically when needed, but leaving an xml:base attribute which creates trouble later.
+ # xmlstarlet does it neatly
+ # XML Canonicalization
+ xmlstarlet c14n $^ > $@
+ # xmlsectool validates too, albeit adding xml:base with breaks schema. Example:
+ # JVMOPTS=-Djavax.xml.accessExternalDTD=all /opt/xmlsectool-2.0.0/xmlsectool.sh --validateSchema --xsd --schemaDirectory ../../schema --inFile $^
+ # XML Validation
+ # if INVALID, run validation again with xmllint to get meaningful error
+ # then delete the canonicalized file
+ -xmlstarlet val --xsd http://tokenscript.org/2019/10/tokenscript/tokenscript.xsd $@ || (mv $@ $@.INVALID; xmllint --noout --schema http://tokenscript.org/2019/10/tokenscript/tokenscript.xsd $@.INVALID)
+
+%.tsml: %.canonicalized.xml
+ifeq (,$(KEYSTORE))
+ @echo ---------------- Keystore missing. Try this ----------------
+ @echo $$ make KEYSTORE=shong.wang.p12 KEYPASSWORD=shong.wang $@
+ @echo replace it with your .p12 file and your password
+ rm $^
+else
+ $(XMLSECTOOL) --sign --keyInfoKeyName 'AliPay' --digest SHA-256 --signatureAlgorithm http://www.w3.org/2001/04/xmldsig-more#$(SIGNATURE_ALGORITHM) --inFile $^ --outFile $@ --keystore $(KEYSTORE) --keystoreType PKCS12 --key $(KEY) --keyPassword $(KEYPASSWORD) --signaturePosition LAST
+ # removing the canonicalized created for validation
+ rm $^
+endif
diff --git a/examples/AliPay/Pickup/Pickup.en.shtml b/examples/AliPay/Pickup/Pickup.en.shtml
new file mode 100644
index 00000000..50e5ddb0
--- /dev/null
+++ b/examples/AliPay/Pickup/Pickup.en.shtml
@@ -0,0 +1,164 @@
+
+
+
diff --git a/examples/AliPay/Pickup/Pickup.xml b/examples/AliPay/Pickup/Pickup.xml
new file mode 100644
index 00000000..eb5eccd7
--- /dev/null
+++ b/examples/AliPay/Pickup/Pickup.xml
@@ -0,0 +1,155 @@
+
+
+
+ ]>
+
+
+
+ Ticket
+ Tickets
+
+
+
+
+ 0x5e8c614cac6d140fbd5a454f41a1d5dc5da1a218
+
+
+
+
+
+
+
+
+
+
+
+
+ &Pickup.en;
+
+
+ &Pickup.en;
+
+
+
+
+
+
+
+
+ Time
+
+
+
+
+
+
+
+
+
+ City
+
+
+
+
+
+ Shanghai
+
+
+ London
+
+
+
+
+
+
+
+
+ Venue
+
+
+
+
+
+ Shanghai Pudong Airport
+
+
+ London Heathrow Airport
+
+
+
+
+
+
+
+
+
+ From
+
+
+
+
+
+
+
+
+ To
+
+
+
+
+
+
+
+
+ Cat
+ 等级
+ Cat
+
+
+
+
+
+ Silver cabs
+
+
+ Presidential limo
+
+
+
+
+
+
+
+
+ №
+
+
+
+
+
+
+
+
+ Redeemed
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/AliPay/Summit/Summit.en.shtml b/examples/AliPay/Summit/Summit.en.shtml
new file mode 100644
index 00000000..50e5ddb0
--- /dev/null
+++ b/examples/AliPay/Summit/Summit.en.shtml
@@ -0,0 +1,164 @@
+
+
+
diff --git a/examples/AliPay/Summit/Summit.xml b/examples/AliPay/Summit/Summit.xml
new file mode 100644
index 00000000..7bf31998
--- /dev/null
+++ b/examples/AliPay/Summit/Summit.xml
@@ -0,0 +1,155 @@
+
+
+
+ ]>
+
+
+
+ Ticket
+ Tickets
+
+
+
+
+ 0x6b2c1f4f903ce8df4e52e153e4d0a103030787c0
+
+
+
+
+
+
+
+
+
+
+
+
+ &Summit.en;
+
+
+ &Summit.en;
+
+
+
+
+
+
+
+
+ Time
+
+
+
+
+
+
+
+
+
+ City
+
+
+
+
+
+ Shanghai
+
+
+ London
+
+
+
+
+
+
+
+
+ Venue
+
+
+
+
+
+ MGM Grand
+
+
+ ICC centre
+
+
+
+
+
+
+
+
+
+ From
+
+
+
+
+
+
+
+
+ To
+
+
+
+
+
+
+
+
+ Cat
+ 等级
+ Cat
+
+
+
+
+
+ Speaker pass
+
+
+ Volunteer pass
+
+
+
+
+
+
+
+
+ №
+
+
+
+
+
+
+
+
+ Redeemed
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/AliPay/Tour Package A/TourA.en.shtml b/examples/AliPay/Tour Package A/TourA.en.shtml
new file mode 100644
index 00000000..50e5ddb0
--- /dev/null
+++ b/examples/AliPay/Tour Package A/TourA.en.shtml
@@ -0,0 +1,164 @@
+
+
+
diff --git a/examples/AliPay/Tour Package A/TourA.xml b/examples/AliPay/Tour Package A/TourA.xml
new file mode 100644
index 00000000..2eccfbdf
--- /dev/null
+++ b/examples/AliPay/Tour Package A/TourA.xml
@@ -0,0 +1,152 @@
+
+
+
+ ]>
+
+
+
+ Ticket
+ Tickets
+
+
+
+
+ 0xec78db1c7244854420a2d8d8d8349c646ac60e06
+
+
+
+
+
+
+
+
+
+
+
+
+ &TourA.en;
+
+
+ &TourA.en;
+
+
+
+
+
+
+
+
+ Time
+
+
+
+
+
+
+
+
+
+ City
+
+
+
+
+
+ Wellington
+
+
+ London
+
+
+
+
+
+
+
+
+ Venue
+
+
+
+
+
+ Seven wonders of the world
+
+
+ Red Rocks
+
+
+
+
+
+
+
+
+
+ From
+
+
+
+
+
+
+
+
+ To
+
+
+
+
+
+
+
+
+ Cat
+ 等级
+ Cat
+
+
+
+
+
+ Great explorer
+
+
+
+
+
+
+
+
+ №
+
+
+
+
+
+
+
+
+ Redeemed
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/AliPay/Tour Package B/TourB.en.shtml b/examples/AliPay/Tour Package B/TourB.en.shtml
new file mode 100644
index 00000000..50e5ddb0
--- /dev/null
+++ b/examples/AliPay/Tour Package B/TourB.en.shtml
@@ -0,0 +1,164 @@
+
+
+
diff --git a/examples/AliPay/Tour Package B/TourB.xml b/examples/AliPay/Tour Package B/TourB.xml
new file mode 100644
index 00000000..5a51f9cb
--- /dev/null
+++ b/examples/AliPay/Tour Package B/TourB.xml
@@ -0,0 +1,152 @@
+
+
+
+ ]>
+
+
+
+ Ticket
+ Tickets
+
+
+
+
+ 0xb0732d2e1805e13de5388e7e8ddf3485a76107e2
+
+
+
+
+
+
+
+
+
+
+
+
+ &TourB.en;
+
+
+ &TourB.en;
+
+
+
+
+
+
+
+
+ Time
+
+
+
+
+
+
+
+
+
+ City
+
+
+
+
+
+ Sydney
+
+
+ Fiji
+
+
+
+
+
+
+
+
+ Venue
+
+
+
+
+
+ Great get away HQ
+
+
+ Figure 8 Pools
+
+
+
+
+
+
+
+
+
+ From
+
+
+
+
+
+
+
+
+ To
+
+
+
+
+
+
+
+
+ Cat
+ 等级
+ Cat
+
+
+
+
+
+ VIP pass
+
+
+
+
+
+
+
+
+ №
+
+
+
+
+
+
+
+
+ Redeemed
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/AliPay/shared.css b/examples/AliPay/shared.css
new file mode 100644
index 00000000..230e7468
--- /dev/null
+++ b/examples/AliPay/shared.css
@@ -0,0 +1,127 @@
+.tbml-category {
+ font-family: "SourceSansPro";
+ font-weight: 400;
+ font-size: 12px;
+ color: white;
+}
+.tbml-venue {
+ font-family: "SourceSansPro";
+ font-weight: 500;
+ font-size: 15px;
+ color: white;
+ display: block;
+ padding-top: 3%;
+}
+.tbml-match {
+ font-family: "SourceSansPro";
+ font-weight: bold;
+ font-size: 19px;
+ color: white;
+ padding: 2%;
+ background-color: rgb(117, 185, 67);
+ display: block;
+ text-align: center;
+ margin-top: 1px;
+ width: 80%;
+ margin: auto;
+ margin-top: 8%;
+}
+.tbml-time {
+ font-family: "SourceSansPro";
+ font-weight: lighter;
+ font-size: 15px;
+ color: white;
+}
+.data-icon {
+ height: 20px;
+ vertical-align: middle;
+ color: white;
+}
+.ticket {
+ background-image: url('data:image/png;base64,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');
+ border-radius: 15px;
+ display: flex;
+ flex-direction: column;
+ background-size: cover;
+ height: -webkit-fill-available;
+ width: -webkit-fill-available;
+}
+.ticketname {
+ font-family: "SourceSansPro";
+ font-weight: 500;
+ font-size: 15px;
+ color: white;
+ width: 100%;
+ display: block;
+ padding-top: 3%;
+}
+.tbml-city {
+ font-family: "SourceSansPro";
+ font-weight: bolder;
+ font-size: 25px;
+ color: white;
+ display: block;
+ padding-top: 3%;
+}
+
+.ticket-bottom-section {
+ padding-left: 3%;
+ display: flex;
+ width: 100%;
+ margin: auto;
+ padding-bottom: 10%;
+ align-self: center;
+}
+.left-column{
+ flex: 70%;
+ align-items: center;
+ display: block;
+ padding-top: 5%;
+}
+.right-column{
+ flex: 30%;
+ display: block;
+}
+.uefa-logo {
+ height: 60px;
+ width: -webkit-fill-available;
+ display: block;
+ margin: auto;
+}
+.date {
+ font-family: "SourceSansPro";
+ font-weight: 400;
+ font-size: 12px;
+ color: white;
+}
+.top-section {
+ display: flex;
+ flex-direction: row;
+ padding: 5%;
+ margin-bottom: 30%;
+}
+.local-time {
+ font-family: "SourceSansPro";
+ font-weight: lighter;
+ font-size: 10px;
+ color: white;
+}
+
+.left-col {
+ flex: 50%;
+ margin-left: 2%;
+}
+.right-col {
+ flex: 50%;
+}
+.white-line {
+ border: 5% solid white;
+ width: -webkit-fill-available;
+ margin-bottom: 3%;
+}
+.redeemed {
+ color: #cffFAB;
+ font-family: "SourceSansPro";
+ font-weight: 500;
+ font-size: 15px;
+}
\ No newline at end of file