diff --git a/internal/domain/config.go b/internal/domain/config.go
index 0bea79f..6222d83 100644
--- a/internal/domain/config.go
+++ b/internal/domain/config.go
@@ -12,9 +12,10 @@ type (
}
ConfigProcessors struct {
- PayPal string `env:"PAYPAL"`
- Liberapay string `env:"LIBERAPAY"`
- YooMoney string `env:"YOOMONEY"`
- Kofi string `env:"KOFI"`
+ PayPal string `env:"PAYPAL"`
+ Liberapay string `env:"LIBERAPAY"`
+ YooMoney string `env:"YOOMONEY"`
+ Kofi string `env:"KOFI"`
+ DonationAlerts string `env:"DONATION_ALERTS"`
}
)
diff --git a/web/static/scripts.js b/web/static/scripts.js
index 2cb2347..dfe57a4 100644
--- a/web/static/scripts.js
+++ b/web/static/scripts.js
@@ -41,8 +41,9 @@ async function updateButtons() {
let inAmount = (!el.dataset.amountMin || el.dataset.amountMin <= form.amount) &&
(!el.dataset.amountMax || form.amount <= +el.dataset.amountMax);
let inPeriod = (!el.dataset.periodMin || +el.dataset.periodMin <= form.period) &&
- (!el.dataset.periodMax || form.period <= +el.dataset.periodMax);
- let inRegion = Boolean(el.dataset.inRussia) == form.inRussia;
+ (!el.dataset.periodMax || form.period <= +el.dataset.periodMax) &&
+ (!el.dataset.periodExcept || form.period != +el.dataset.periodExcept);
+ let inRegion = !el.dataset.inRussia || (el.dataset.inRussia == 'true') == form.inRussia;
if (form.amount == 0.0 || inAmount && inPeriod && inRegion) {
el.href = el.dataset.pattern.
diff --git a/web/static/styles.css b/web/static/styles.css
index 43482fd..1afc7ea 100644
--- a/web/static/styles.css
+++ b/web/static/styles.css
@@ -105,6 +105,12 @@ button[href*='ko-fi.com'] {
--color: hsl(0, 0%, 100%);
}
+.button[href*='donationalerts.com'],
+button[href*='donationalerts.com'] {
+ --background: hsl(30, 94%, 49%);
+ --color: hsl(0, 0%, 95%);
+}
+
.with-icon .icon,
.button .icon,
.button svg,
diff --git a/web/template/template.qtpl b/web/template/template.qtpl
index 0a1214b..9cf3401 100644
--- a/web/template/template.qtpl
+++ b/web/template/template.qtpl
@@ -101,6 +101,7 @@ func NewContext(processors domain.ConfigProcessors, lang language.Tag, amount ui
@@ -114,6 +115,7 @@ func NewContext(processors domain.ConfigProcessors, lang language.Tag, amount ui
@@ -144,6 +146,8 @@ func NewContext(processors domain.ConfigProcessors, lang language.Tag, amount ui
@@ -153,6 +157,20 @@ func NewContext(processors domain.ConfigProcessors, lang language.Tag, amount ui
{% endif %}
+ {% if ctx.processors.DonationAlerts != "" %}
+
+
+
+ {%= icon("da") %}
+ DonationAlerts
+
+
+ {% endif %}
{% endfunc %}
@@ -264,6 +282,17 @@ func NewContext(processors domain.ConfigProcessors, lang language.Tag, amount ui
+ {% case "da" %}
+
{% endswitch %}
{% endfunc %}
{% endstripspace %}
diff --git a/web/template/template.qtpl.go b/web/template/template.qtpl.go
index d6acd6f..649043a 100644
--- a/web/template/template.qtpl.go
+++ b/web/template/template.qtpl.go
@@ -251,563 +251,645 @@ func (ctx Context) streambody(qw422016 *qt422016.Writer) {
//line web/template/template.qtpl:103
qw422016.N().S(` `)
//line web/template/template.qtpl:103
+ qw422016.N().S(`data-in-russia="false"`)
+//line web/template/template.qtpl:104
+ qw422016.N().S(` `)
+//line web/template/template.qtpl:104
qw422016.N().S(`data-pattern="https://liberapay.com/`)
-//line web/template/template.qtpl:104
+//line web/template/template.qtpl:105
qw422016.E().S(ctx.processors.Liberapay)
-//line web/template/template.qtpl:104
+//line web/template/template.qtpl:105
qw422016.N().S(`/donate?amount=%f¤cy=USD&period=%p"`)
-//line web/template/template.qtpl:104
+//line web/template/template.qtpl:105
qw422016.N().S(` `)
-//line web/template/template.qtpl:104
+//line web/template/template.qtpl:105
qw422016.N().S(`rel="noopener noreferrer payment"`)
-//line web/template/template.qtpl:105
+//line web/template/template.qtpl:106
qw422016.N().S(` `)
-//line web/template/template.qtpl:105
+//line web/template/template.qtpl:106
qw422016.N().S(`href="https://liberapay.com/`)
-//line web/template/template.qtpl:106
+//line web/template/template.qtpl:107
qw422016.E().S(ctx.processors.Liberapay)
-//line web/template/template.qtpl:106
+//line web/template/template.qtpl:107
qw422016.N().S(`/donate`)
-//line web/template/template.qtpl:106
+//line web/template/template.qtpl:107
if ctx.amount > 0 {
-//line web/template/template.qtpl:106
+//line web/template/template.qtpl:107
qw422016.N().S(`?amount=`)
-//line web/template/template.qtpl:106
+//line web/template/template.qtpl:107
qw422016.N().FPrec(float64(ctx.amount)/100, 2)
-//line web/template/template.qtpl:106
+//line web/template/template.qtpl:107
qw422016.N().S(`¤cy=USD&period=monthly`)
-//line web/template/template.qtpl:106
+//line web/template/template.qtpl:107
}
-//line web/template/template.qtpl:106
+//line web/template/template.qtpl:107
qw422016.N().S(`">`)
-//line web/template/template.qtpl:108
+//line web/template/template.qtpl:109
streamicon(qw422016, "liberapay")
-//line web/template/template.qtpl:108
+//line web/template/template.qtpl:109
qw422016.N().S(`Liberapay`)
-//line web/template/template.qtpl:112
- }
//line web/template/template.qtpl:113
+ }
+//line web/template/template.qtpl:114
if ctx.processors.PayPal != "" {
-//line web/template/template.qtpl:113
+//line web/template/template.qtpl:114
qw422016.N().S(`
0 {
-//line web/template/template.qtpl:119
+//line web/template/template.qtpl:121
qw422016.N().S(`/`)
-//line web/template/template.qtpl:119
+//line web/template/template.qtpl:121
qw422016.N().FPrec(float64(ctx.amount)/100, 2)
-//line web/template/template.qtpl:119
+//line web/template/template.qtpl:121
qw422016.N().S(`USD`)
-//line web/template/template.qtpl:119
- }
-//line web/template/template.qtpl:119
- qw422016.N().S(`">`)
//line web/template/template.qtpl:121
+ }
+//line web/template/template.qtpl:121
+ qw422016.N().S(`">`)
+//line web/template/template.qtpl:123
streamicon(qw422016, "paypal")
-//line web/template/template.qtpl:121
+//line web/template/template.qtpl:123
qw422016.N().S(`PayPal`)
-//line web/template/template.qtpl:125
+//line web/template/template.qtpl:127
}
-//line web/template/template.qtpl:126
+//line web/template/template.qtpl:128
if ctx.processors.YooMoney != "" {
-//line web/template/template.qtpl:126
+//line web/template/template.qtpl:128
qw422016.N().S(` 0 {
-//line web/template/template.qtpl:135
+//line web/template/template.qtpl:137
qw422016.N().S(`/`)
-//line web/template/template.qtpl:135
+//line web/template/template.qtpl:137
qw422016.N().DUL(ctx.amount)
-//line web/template/template.qtpl:135
- }
-//line web/template/template.qtpl:135
- qw422016.N().S(`">`)
//line web/template/template.qtpl:137
+ }
+//line web/template/template.qtpl:137
+ qw422016.N().S(`">`)
+//line web/template/template.qtpl:139
streamicon(qw422016, "yoomoney")
-//line web/template/template.qtpl:137
+//line web/template/template.qtpl:139
qw422016.N().S(`ЮMoney`)
-//line web/template/template.qtpl:141
+//line web/template/template.qtpl:143
}
-//line web/template/template.qtpl:142
+//line web/template/template.qtpl:144
if ctx.processors.Kofi != "" {
-//line web/template/template.qtpl:142
+//line web/template/template.qtpl:144
qw422016.N().S(` 0 {
-//line web/template/template.qtpl:149
+//line web/template/template.qtpl:153
qw422016.N().S(`/`)
-//line web/template/template.qtpl:149
+//line web/template/template.qtpl:153
qw422016.N().FPrec(float64(ctx.amount)/100, 2)
-//line web/template/template.qtpl:149
+//line web/template/template.qtpl:153
}
-//line web/template/template.qtpl:149
+//line web/template/template.qtpl:153
qw422016.N().S(`">`)
-//line web/template/template.qtpl:151
+//line web/template/template.qtpl:155
streamicon(qw422016, "kofi")
-//line web/template/template.qtpl:151
+//line web/template/template.qtpl:155
qw422016.N().S(`Ko-fi`)
-//line web/template/template.qtpl:155
- }
-//line web/template/template.qtpl:155
- qw422016.N().S(``)
-//line web/template/template.qtpl:157
-}
-
-//line web/template/template.qtpl:157
-func (ctx Context) writebody(qq422016 qtio422016.Writer) {
-//line web/template/template.qtpl:157
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line web/template/template.qtpl:157
- ctx.streambody(qw422016)
-//line web/template/template.qtpl:157
- qt422016.ReleaseWriter(qw422016)
-//line web/template/template.qtpl:157
-}
-
-//line web/template/template.qtpl:157
-func (ctx Context) body() string {
-//line web/template/template.qtpl:157
- qb422016 := qt422016.AcquireByteBuffer()
-//line web/template/template.qtpl:157
- ctx.writebody(qb422016)
-//line web/template/template.qtpl:157
- qs422016 := string(qb422016.B)
-//line web/template/template.qtpl:157
- qt422016.ReleaseByteBuffer(qb422016)
-//line web/template/template.qtpl:157
- return qs422016
-//line web/template/template.qtpl:157
-}
-
//line web/template/template.qtpl:159
-func (ctx Context) streamdir(qw422016 *qt422016.Writer) {
-//line web/template/template.qtpl:160
- switch ctx.language {
-//line web/template/template.qtpl:161
- default:
-//line web/template/template.qtpl:161
- qw422016.N().S(`ltr`)
-//line web/template/template.qtpl:163
- case language.Arabic, language.Persian, language.Hebrew, language.Urdu:
-//line web/template/template.qtpl:163
- qw422016.N().S(`rtl`)
-//line web/template/template.qtpl:165
}
+//line web/template/template.qtpl:160
+ if ctx.processors.DonationAlerts != "" {
+//line web/template/template.qtpl:160
+ qw422016.N().S(``)
//line web/template/template.qtpl:169
+ streamicon(qw422016, "da")
+//line web/template/template.qtpl:169
+ qw422016.N().S(`DonationAlerts`)
+//line web/template/template.qtpl:173
+ }
+//line web/template/template.qtpl:173
+ qw422016.N().S(``)
+//line web/template/template.qtpl:175
+}
+
+//line web/template/template.qtpl:175
+func (ctx Context) writebody(qq422016 qtio422016.Writer) {
+//line web/template/template.qtpl:175
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line web/template/template.qtpl:175
+ ctx.streambody(qw422016)
+//line web/template/template.qtpl:175
+ qt422016.ReleaseWriter(qw422016)
+//line web/template/template.qtpl:175
+}
+
+//line web/template/template.qtpl:175
+func (ctx Context) body() string {
+//line web/template/template.qtpl:175
+ qb422016 := qt422016.AcquireByteBuffer()
+//line web/template/template.qtpl:175
+ ctx.writebody(qb422016)
+//line web/template/template.qtpl:175
+ qs422016 := string(qb422016.B)
+//line web/template/template.qtpl:175
+ qt422016.ReleaseByteBuffer(qb422016)
+//line web/template/template.qtpl:175
+ return qs422016
+//line web/template/template.qtpl:175
+}
+
+//line web/template/template.qtpl:177
+func (ctx Context) streamdir(qw422016 *qt422016.Writer) {
+//line web/template/template.qtpl:178
+ switch ctx.language {
+//line web/template/template.qtpl:179
+ default:
+//line web/template/template.qtpl:179
+ qw422016.N().S(`ltr`)
+//line web/template/template.qtpl:181
+ case language.Arabic, language.Persian, language.Hebrew, language.Urdu:
+//line web/template/template.qtpl:181
+ qw422016.N().S(`rtl`)
+//line web/template/template.qtpl:183
+ }
+//line web/template/template.qtpl:184
+}
+
+//line web/template/template.qtpl:184
+func (ctx Context) writedir(qq422016 qtio422016.Writer) {
+//line web/template/template.qtpl:184
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line web/template/template.qtpl:184
+ ctx.streamdir(qw422016)
+//line web/template/template.qtpl:184
+ qt422016.ReleaseWriter(qw422016)
+//line web/template/template.qtpl:184
+}
+
+//line web/template/template.qtpl:184
+func (ctx Context) dir() string {
+//line web/template/template.qtpl:184
+ qb422016 := qt422016.AcquireByteBuffer()
+//line web/template/template.qtpl:184
+ ctx.writedir(qb422016)
+//line web/template/template.qtpl:184
+ qs422016 := string(qb422016.B)
+//line web/template/template.qtpl:184
+ qt422016.ReleaseByteBuffer(qb422016)
+//line web/template/template.qtpl:184
+ return qs422016
+//line web/template/template.qtpl:184
+}
+
+//line web/template/template.qtpl:186
+func (ctx Context) streamlang(qw422016 *qt422016.Writer) {
+//line web/template/template.qtpl:187
base, _ := ctx.language.Base()
-//line web/template/template.qtpl:170
+//line web/template/template.qtpl:188
qw422016.E().S(base.String())
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
}
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
func (ctx Context) writelang(qq422016 qtio422016.Writer) {
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
qw422016 := qt422016.AcquireWriter(qq422016)
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
ctx.streamlang(qw422016)
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
qt422016.ReleaseWriter(qw422016)
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
}
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
func (ctx Context) lang() string {
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
qb422016 := qt422016.AcquireByteBuffer()
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
ctx.writelang(qb422016)
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
qs422016 := string(qb422016.B)
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
qt422016.ReleaseByteBuffer(qb422016)
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
return qs422016
-//line web/template/template.qtpl:171
+//line web/template/template.qtpl:189
}
-//line web/template/template.qtpl:173
+//line web/template/template.qtpl:191
func (ctx Context) streamt(qw422016 *qt422016.Writer, format message.Reference, v ...any) {
-//line web/template/template.qtpl:174
+//line web/template/template.qtpl:192
qw422016.E().S(ctx.printer.Sprintf(format, v...))
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
}
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
func (ctx Context) writet(qq422016 qtio422016.Writer, format message.Reference, v ...any) {
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
qw422016 := qt422016.AcquireWriter(qq422016)
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
ctx.streamt(qw422016, format, v...)
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
qt422016.ReleaseWriter(qw422016)
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
}
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
func (ctx Context) t(format message.Reference, v ...any) string {
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
qb422016 := qt422016.AcquireByteBuffer()
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
ctx.writet(qb422016, format, v...)
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
qs422016 := string(qb422016.B)
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
qt422016.ReleaseByteBuffer(qb422016)
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
return qs422016
-//line web/template/template.qtpl:175
+//line web/template/template.qtpl:193
}
-//line web/template/template.qtpl:177
+//line web/template/template.qtpl:195
func (ctx Context) streamtitle(qw422016 *qt422016.Writer) {
-//line web/template/template.qtpl:177
+//line web/template/template.qtpl:195
qw422016.N().S(`NotDotPay`)
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
}
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
func (ctx Context) writetitle(qq422016 qtio422016.Writer) {
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
qw422016 := qt422016.AcquireWriter(qq422016)
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
ctx.streamtitle(qw422016)
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
qt422016.ReleaseWriter(qw422016)
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
}
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
func (ctx Context) title() string {
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
qb422016 := qt422016.AcquireByteBuffer()
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
ctx.writetitle(qb422016)
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
qs422016 := string(qb422016.B)
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
qt422016.ReleaseByteBuffer(qb422016)
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
return qs422016
-//line web/template/template.qtpl:179
+//line web/template/template.qtpl:197
}
-//line web/template/template.qtpl:181
+//line web/template/template.qtpl:199
func StreamTemplate(qw422016 *qt422016.Writer, p Page) {
-//line web/template/template.qtpl:181
+//line web/template/template.qtpl:199
qw422016.N().S(`NotDotPay`)
-//line web/template/template.qtpl:191
+//line web/template/template.qtpl:209
p.streamhead(qw422016)
-//line web/template/template.qtpl:191
+//line web/template/template.qtpl:209
qw422016.N().S(``)
-//line web/template/template.qtpl:195
+//line web/template/template.qtpl:213
p.streambody(qw422016)
-//line web/template/template.qtpl:195
+//line web/template/template.qtpl:213
qw422016.N().S(``)
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
}
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
func WriteTemplate(qq422016 qtio422016.Writer, p Page) {
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
qw422016 := qt422016.AcquireWriter(qq422016)
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
StreamTemplate(qw422016, p)
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
qt422016.ReleaseWriter(qw422016)
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
}
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
func Template(p Page) string {
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
qb422016 := qt422016.AcquireByteBuffer()
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
WriteTemplate(qb422016, p)
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
qs422016 := string(qb422016.B)
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
qt422016.ReleaseByteBuffer(qb422016)
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
return qs422016
-//line web/template/template.qtpl:203
+//line web/template/template.qtpl:221
}
-//line web/template/template.qtpl:205
+//line web/template/template.qtpl:223
func streamicon(qw422016 *qt422016.Writer, id string) {
-//line web/template/template.qtpl:206
+//line web/template/template.qtpl:224
switch id {
-//line web/template/template.qtpl:207
+//line web/template/template.qtpl:225
case "liberapay":
-//line web/template/template.qtpl:207
+//line web/template/template.qtpl:225
qw422016.N().S(``)
-//line web/template/template.qtpl:218
- case "paypal":
-//line web/template/template.qtpl:218
- qw422016.N().S(``)
+//line web/template/template.qtpl:236
+ case "paypal":
+//line web/template/template.qtpl:236
+ qw422016.N().S(``)
-//line web/template/template.qtpl:234
+//line web/template/template.qtpl:252
case "yoomoney":
-//line web/template/template.qtpl:234
+//line web/template/template.qtpl:252
qw422016.N().S(``)
-//line web/template/template.qtpl:246
+//line web/template/template.qtpl:264
case "kofi":
-//line web/template/template.qtpl:246
+//line web/template/template.qtpl:264
qw422016.N().S(``)
//line web/template/template.qtpl:267
+ qw422016.N().S(` `)
+//line web/template/template.qtpl:267
+ qw422016.N().S(`viewBox="0 0 665.2 436.4"`)
+//line web/template/template.qtpl:268
+ qw422016.N().S(` `)
+//line web/template/template.qtpl:268
+ qw422016.N().S(`aria-hidden="true"`)
+//line web/template/template.qtpl:269
+ qw422016.N().S(` `)
+//line web/template/template.qtpl:269
+ qw422016.N().S(`focusable="false"`)
+//line web/template/template.qtpl:270
+ qw422016.N().S(` `)
+//line web/template/template.qtpl:270
+ qw422016.N().S(`xmlns="http://www.w3.org/2000/svg">`)
+//line web/template/template.qtpl:285
+ case "da":
+//line web/template/template.qtpl:285
+ qw422016.N().S(``)
+//line web/template/template.qtpl:296
}
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
}
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
func writeicon(qq422016 qtio422016.Writer, id string) {
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
qw422016 := qt422016.AcquireWriter(qq422016)
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
streamicon(qw422016, id)
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
qt422016.ReleaseWriter(qw422016)
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
}
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
func icon(id string) string {
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
qb422016 := qt422016.AcquireByteBuffer()
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
writeicon(qb422016, id)
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
qs422016 := string(qb422016.B)
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
qt422016.ReleaseByteBuffer(qb422016)
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
return qs422016
-//line web/template/template.qtpl:268
+//line web/template/template.qtpl:297
}