Initial commit

This commit is contained in:
Bas Kloosterman 2022-05-02 16:30:13 +02:00
commit c07bada12e
101 changed files with 4979 additions and 0 deletions

11
.gitignore vendored Normal file
View File

@ -0,0 +1,11 @@
.DS_Store
._.DS_Store
node_modules
package-lock.json
dist/*
bin/*
data/db/data.db
nginx/flip_cohen.conf
data/config/config.yaml
cohen_site
!.keep

21
Makefile Normal file
View File

@ -0,0 +1,21 @@
.PHONY: all clean config
all: bin/site_flip dist/js/shared.js dist/css/index.css config
bin/site_flip: main.go events.go albums.go
go build main.go events.go albums.go && mv main bin/site_flip
dist/js/shared.js: $(wildcard src/js/*.js src/js/*/*.js)
NODE_ENV=production gulp build
dist/css/index.css: $(wildcard src/sass/*.scss src/sass/*/*.scss)
NODE_ENV=production gulp build
config: nginx/flip_cohen.conf
nginx/flip_cohen.conf: nginx/template.conf
./init.sh `pwd`
clean:
rm -f nginx/flip_cohen.conf
rm -f bin/site_flip

152
albums.go Normal file
View File

@ -0,0 +1,152 @@
package main
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"path"
"strings"
)
type Song struct {
Title string
Lyrics []string
Path string
NR string
}
type Album struct {
Name string
Release string
Path string
Songs []Song
Links map[string]string
}
const ALBUM_DIR = "./data/albums/"
var albums []*Album
func parseAlbumName(fName string) (string, string) {
s := strings.Split(fName, ".")
s = strings.Split(s[0], "_")
return s[0], strings.Join(s[1:], " ")
}
func ParseSong(s os.FileInfo, basePath string) Song {
nr, title := parseAlbumName(s.Name())
f, err := os.Open(path.Join(basePath, s.Name()))
defer f.Close()
if err != nil {
log.Fatal(err)
}
content, err := ioutil.ReadAll(f)
if err != nil {
log.Fatal(err)
}
lyrics := strings.Split(string(content), "\n\n")
song := Song{
Title: title,
Lyrics: lyrics,
Path: strings.ToLower(strings.Replace(title, " ", "-", -1)),
NR: nr,
}
return song
}
func getSong(album *Album, title string) (Song, error) {
for _, song := range album.Songs {
if song.Path == strings.ToLower(title) {
return song, nil
}
}
return Song{}, io.EOF
}
func ParseAlbum(f os.FileInfo) *Album {
year, name := parseAlbumName(f.Name())
filen := path.Join(ROOT_DIR, ALBUM_DIR, f.Name())
files, err := ioutil.ReadDir(filen)
if err != nil {
fmt.Printf("Error read songs: %s", err)
log.Fatal(err)
}
album := Album{
Name: name,
Path: strings.ToLower(strings.Replace(name, " ", "-", -1)),
Release: year,
}
for _, f := range files {
if !strings.HasSuffix(f.Name(), ".lyric") {
continue
}
album.Songs = append(album.Songs, ParseSong(f, filen))
}
fd, err := os.Open(path.Join(filen, "info.json"))
defer fd.Close()
if err != nil {
fmt.Printf("Error info.json: %s", err)
log.Fatal(err)
}
content, _ := ioutil.ReadAll(fd)
json.Unmarshal(content, &album)
return &album
}
func getAlbum(albums []*Album, title string) (*Album, error) {
for _, album := range albums {
if album.Path == strings.ToLower(title) {
return album, nil
}
}
return nil, io.EOF
}
func getAlbums() []*Album {
if albums != nil {
return albums
}
files, err := ioutil.ReadDir(path.Join(ROOT_DIR, ALBUM_DIR))
if err != nil {
log.Fatal(err)
}
for _, f := range files {
if strings.HasPrefix(f.Name(), ".") {
continue
}
albums = append(albums, ParseAlbum(f))
}
for i := len(albums)/2 - 1; i >= 0; i-- {
opp := len(albums) - 1 - i
albums[i], albums[opp] = albums[opp], albums[i]
}
return albums
}

0
bin/.keep Normal file
View File

View File

@ -0,0 +1,30 @@
Ga het bos in met een stropdas om je nek
Zodat de kraaien weten: die hangt niet voor gek
En je hoort je kind al huilen en de kerkklok voor je luiden
En voor god, die jouw driften steeds verbood
Maar je ziet twee mannen bij de dennen doen wat jij steeds moest ontkennen
En hun kreunen fluisteren frutselend aan jouw knoop
Tijd te koop, tijd te koop, tijd te koop
Wie kent een kind dat nimmer heeft gejokt?
Ik ken een kind dat door de zee werd opgeslokt
Hij werd verzwolgen door de golven en weer uitgekotst door kolken
In een volk dat riep: 'ga terug naar het scheepswrak waar je hoort
Oh, zijn zakmes vindt zijn pols wel. 'Ach jongen, ik heb een voorstel'
Roept de koning farizeeër met de hoorntjes uit zijn hoofd
Tijd te koop, tijd te koop, tijd te koop
Tijd te koop
Leef elke dag alsof het je laatste is
En nooit geschoten dat is altijd mis
Dus je speelt roulette met Russen, het is jouw beurt de loop te kussen
Je hoort 'klik' en krijgt het geld zoals beloofd
Maar buiten in het steegje hoor je: 'Hé daar! Niet bewegen...'
En je weet: dat is wel een echte loop tegen je hoofd
Tijd te koop, tijd te koop, tijd te koop
Tijd te koop
Ga het bos in met een stropdas om je nek

View File

@ -0,0 +1,48 @@
Ik ben dapper maar onrechtvaardig
Ik ben strategisch maar ik ben kwaadaardig
Ik ben gelukkig maar niet te pruimen
Ik ben een baby zonder speen en met afgehakte duimen
Ik ben de klootzak die steeds het laatste lacht
Ben charismatisch maar immoreel
Gebruik mijn naasten, mijn naasten instrumenteel
Ik ben de roofbouw, ik ben de ploeg
En zelfs van mijn hebzucht heb ik nog niet genoeg
De hyena die steeds het laatste lacht, maar hé!
Ik heb de Sir yes sir
Macht Sir yes sir
Ik heb de Sir yes sir
Macht Sir yes sir
Ik heb de macht!
Ik ben groots maar kleinzielig
Ik win altijd, maar ik win, ik win schlemielig
Ik ben de trap in de ballen
De appel die niet rust voordat hij omhoog kan vallen
De hyena die steeds het laatste lacht, maar hé!
Ik heb de Sir yes sir
Macht Sir yes sir
Ik heb de Sir yes sir
Macht Sir yes sir
Ik heb de macht!
Ik ben de bergen, ik ben de dalen
Ik ben de levenszin vertaald in alle talen
Ik ben de wijsheid, ik ben waarachtig
Op de bodem van de diepste zee is elke monnik toch weer oppervlakkig
Maar IK...
IK rijk dieper
IK vlieg hoger
Voorbij de tijdgeest
Voorbij het feit
IK bezweer het lot, IK ben de heerser van de onbeheersbaarheid
Die steeds het laatste lacht. Want
IK heb de Sir yes sir
Macht Sir yes sir
IK heb de Sir yes sir
Macht Sir yes sir
IK heb de macht!

View File

@ -0,0 +1,42 @@
Het plafond is altijd schoon
Stof dwarrelt naar beneden
Op pizzadozen van een maand geleden
En half lege halve liters bier
Bob Marley door de muren
Reggaeparty bij de buren
In hun slaapkamer doen twee liefjes het
En ik lig hier maar alleen starend op mijn bed
Starend op mijn bed lig ik alleen maar hier
Nagels in een wijnglas
Schimmel in de bank
Dat ik hier ranzig woon
Ach man, ik kijk toch alleen omhoog
Ik kijk alleen omhoog
En het plafond is altijd schoon
Ja, ik klom uit het konijnenhol
De rode rook rond haar gezicht
Want ja, ze mist de spiegel
Die op de wereld staat gericht
Maar hier alleen in mijn drakenhol
Dreunt het door mijn kop:
Zij is de schoonheid in verandering
Die door de wereld juist gespiegeld wordt
Nagels in een wijnglas
Schimmel in de bank
Ladderzat en stoned
Kijk ik heel de nacht omhoog
Ik kijk alleen omhoog
Want zou ik nu gaan slapen
Zie ik hoe ze met hem vrijt
Een door het slijk getrokken droom
Dus kijk ik heel de nacht omhoog
Ik kijk alleen omhoog
Want het plafond is altijd schoon
Het plafond is altijd schoon

View File

@ -0,0 +1,47 @@
Ik ben al oud
Wellicht zie jij op elke steen mijn naam al staan
Maar ik vind heus nog wel een stok
Waarmee ik jou
Voordat je met mijn dochter trouwt de goede kant op zal slaan
Want er moet nou eenmaal brood op de plank
En dat je van haar houdt
Maar voor jouw hart van goud betaalt geen hond hier geld
Dat is het enige dat telt
Ga je mee naar het museum?
De onvoorwaardelijke liefde wordt tentoongesteld
Er moet brood op de plank
Neem haar hand
Zodra je je principes laat verwelken
Er is niks zo armetierig
Als een werkeloze intellectueel
Neem haar hand
Zodra je je principes laat verwelken
Wie de koe bij de horens vat
Kan haar niet meer melken
Ik ben al oud
Dus denk je nu werkelijk dat jij deze hond nog iets leert?
Ik zal maar doen wat ik je vraag
Mijn geweten en ik zijn al eeuwen gebrouilleerd
Wil je haar hand?
Dan komt er brood op de plank
Neem haar hand
Zodra je je principes laat verwelken
Je bruid is veel en veel te mooi
Om daar geen munt uit te slaan
Neem haar hand
Zodra je je principes laat verwelken
Wie de koe bij de horens vat
Kan haar niet meer melken
Wie de koe bij de horens vat kan haar niet meer melken
Wie de koe bij de horens vat kan haar niet meer melken
Wie de koe bij de horens vat kan haar niet meer melken
Wie de koe bij de horens vat kan haar niet meer melken
Wie de koe bij de horens vat kan haar niet meer melken
Wie de koe bij de horens vat kan haar niet meer melken

View File

@ -0,0 +1,32 @@
Voer je hart aan maden
Ruk je nagels uit, verkoop ze aan de smaad
Voer je idealen aan de slager
En je vuist aan het verraad
Of geloof dat de machten het werkelijk iets kan schelen [1]
Naar welke kant jouw weegschaal uit zal slaan
En verkoop je hoop aan het 'meer dan de som der delen'
Maar alles van waarde zal hoe dan ook vergaan
Voer je rede aan het toeval
En je matigheid geef die [2] maar aan de drank
Voer je zaad aan de oerknal
En je eerlijkheid laat haar investeren door de bank
Of geloof dat de machten het werkelijk iets kan schelen [1]
Naar welke kant jouw weegschaal uit zal slaan
En verkoop je hoop aan het 'meer dan de som der delen'
Maar alles van waarde zal hoe dan ook vergaan
Verga in de illusie dat het anders kan
Verga in de illusie dat het beter moet
Verga in de illusie, verga in de illusie
Verga in de illusie dat het anders kan
Of besta hier in de wereld
Besta hier in de echte, onverschillige wereld
Waarin er niks, helemaal niks toe doet
Alles van waarde zal hoe dan ook vergaan
1. Op plaat klinkt: 'Of geloof dat de machten het werkelijk kunnen schelen'
2. Op de plaat klinkt: 'dat'

View File

@ -0,0 +1,25 @@
We zitten samen aan de kade
Jij gooit een steentje in de maan
En dan verlaat je me
Het was allang tijd om te gaan
En in ons spiegelbeeld
Gooi jij een hand vol kiezelstenen
Langzaam wordt het beeld weer zichtbaar
En ben jij eruit verdwenen
De horizon kwam rakelings voorbij
(neurie)
De horizon kwam rakelings voorbij
Maar jij blijft de afstand tussen ik en wij
(neurie)
De horizon kwam rakelings voorbij
(neurie)
De horizon kwam rakelings voorbij
Maar jij blijft de afstand tussen ik en wij
Ik en wij
Jij gooit een steentje in de maan
En dan verlaat je me
Het was allang tijd om te gaan

View File

@ -0,0 +1,44 @@
Er zat een meisje bij een boom
Ze zei: Ik had vannacht een droom
Een open veld, een lange man
Die prekend uit een boek daar stond
En na elk woord dat hij had verteld
Boog elk wezen van dat veld
Vogels zonder vleugels
Mensen zonder mond
Niemand durfde de bossen in
Die schaduw, die vertwijfeling
Ze dachten: elk nieuw begin
Is veel kouder dan die open grond
Dus bogen bomen naar die man
Hij zal het dus wel weten dan
Dachten vogels zonder vleugels
En mensen, mensen zonder mond
Het meisje zei dat ze ook wist
Waarom een vogel vleugels mist
Want ze droomde in haar droom vannacht
Dat zij er twee weer vleugels gaf
Nou, de eerste vloog maar was zo bang
Ze vloog niet hoger dan die man
Dus greep de man haar uit de lucht
En sneed haar vleugels af
En de tweede dacht dat zij wel kon
Vliegen nog voorbij de zon
Haar vleugels smolten
En ze stortte neer op de open grond
Dus boog de hemel voor die vent
Toen vrijheid leek op onbegrensd, of angstig was
Als de vogels zonder vleugels
Of als mensen zonder mond
Dus buigen bomen voor die man
Hij brengt ons echt geen vrijheid want
Hij snijdt alleen de vleugels af bij vogels
Hij schept mensen zonder mond

View File

@ -0,0 +1,55 @@
Elke schipper die jouw schaakte gaf jou hoop op een remise
Zodat het spel maar later werd; veel later
En nu je aan het water staart naar schepen die verdwijnen
Weet je dat hij slechts de rust zocht van jouw haven
Maar al wekenlang jouw armen had verslagen
En je bouwt in de ruïne die jij je ziel noemt, jezelf weer op
Uit het wrakhout van je omgevallen koning
Als elke schipper schaakte hij slechts voor die vrouw die werkelijk
Werkelijk zijn koning bedreigen
Een koningin die zeeën weg kan grijnzen
Niet het eerste het beste havenmeisje
En opeens begin je dat te begrijpen
En je blinkt weer aan de horizon als een vesting als een bastion [1]
Waar weer een schipper heen vaart om te schaken
Hij speelt de 'schippersopening': laat zijn heer zonder verdediging
En zegt dat hij zijn droom heeft laten varen
Dat hij geen schipper is maar de 'eeuwige schaker'
Dus je biedt die man je haven aan, je wijn, je bed, je lichaam
Maar je merkt hoe voorspelbaar hij ontwikkelt
Hij fluistert dat hij je begeert.
Maar je weet dat elke schipper dan rokeert en zo probeert te winnen
Plots valt het zwaar hem nog aantrekkelijk te vinden
Woest kijk je naar buiten, naar de zee, maar je blik wordt mild
De golven lijken van je af te stromen
Jouw haven is van wal geraakt en al haar duizend boten schreeuwen
Dat jij, ja jij, aan boord mag komen
Dat jij, ja jij, van verre landen mag gaan dromen
En meteen doemt dat veld weer op, die verdrongen baai op het open bord
Met die klippen waarop jouw schip ooit is versplinterd
Maar nu schuif jij je dame naar dat veld
Hij neemt je aas, jij zet hem schaak en in je ooghoek zie je zijn heer schrikken
Want zulke vallen zet alleen een schipper
En hij beseft dat hij onmogelijk nog kan winnen
Hij bedenkt nog wel een wanhoopsplan maar het anker op zijn bovenarm
Lijkt voor jouw koningin te moeten kiezen
Hij krijgt zijn arm niet opgetild
En speelt die zet die een schipper alleen speelt als hij niks meer kan verliezen
Valt op zijn knieën en zegt: mijn liefste, mijn koningin
Ik bied je een remise
En ik bouw in de ruïne die ik mijn ziel noem mezelf weer op
Uit het wrakhout van mijn omgevallen koning
Als elke schipper schaakte jij slechts voor die heer die werkelijk
Werkelijk jouw dame kan verleiden
Een koning die zeeën weg kan grijnzen
Geen troubadour met zijn valse liefdeswijsjes
Maar een koning die zeeën weg kan grijnzen
1. Op de plaat klinkt: 'bataljon'

View File

@ -0,0 +1,47 @@
Ze zei: leg je hoofd op mijn borsten
Voel mijn adem en hart en geloof in dat
Wat je nooit zeker weet
Ik zei: liefste
Als jouw liefde geloof is, geloof mij zij schiep me
Ik ben haar profeet
Stuur engel Gabriël dan schrijf ik uw verhaal wel
Leid de duif naar de olijftak en hoor mijn dankgebed
Ze zei: je woorden zijn een kaartenhuis
Een zuchtje, weg charme
Zet je hersens eens op stop man en omarm me
Heb in het echt lief
Naast me in bed
En langzaam raak ik haar volmaakte lichaam aan
En drink ik haar lippen als wijn
Langzaam brengt ze maar waar je alleen nooit kan gaan
En geloof je haar: dit is het enige waar het allemaal om gaat
Toen ik nog een kind was
Was ik boos op nacht omdat ze zo lang was
En ik veel te grote delen van mijn leven vergat
Maar de nachtzwanen zingen
Open ik straks de gordijnen, heeft de ochtend zich geschilderd
En wilde ik dat ik nog wat nacht had met jou
Ze zei: laat ons dan beginnen
Zo langzaam te beminnen
Dat de haastige dag
Ons uiteindelijk vergeet
Leg je hoofd op mijn borsten
Voel mijn adem en hart
En geloof in dat
Wat je nooit zeker weet
En langzaam raak ik haar volmaakte lichaam aan
Vrij in de zilveren maan
Langzaam brengt ze me waar je alleen nooit kan gaan
En langzaam raakt zij mijn lichaam aan
En drinkt ze mijn lichaam als wijn
Langzaam breng ik haar waar je alleen nooit kan gaan
En weet je wel zeker: dit is het enige waar het allemaal om gaat

View File

@ -0,0 +1,42 @@
Dans me als de mus in jouw hand
Met zijn fluit de zon bezweert
En dans me als jouw schaduw
Met de wolven naar de maan terugkeert
Ay, ay, ay ay, in stille klanken
Dans me liefje, dans
Dans me naar jouw lippen
Zacht in het dauwgras of de geur van
Jasmijnthee in de nacht
En vrij me bij de vijver
Als de meidoorns in jouw ogen zwemmen
Vrij me als het vriest in huis
En wij elkaar in vuur omklemmen
Ay, ay, ay ay, stille getijden
Vrij me liefje
Ay, ay, jouw lentes als je lacht
En de herfstwind als wij vrijen
Jasmijnthee in de nacht
En jouw lichaam bloesemt open
In de dagen zonder vragen
Seizoenen knielen volgzaam
Voor de jaren van gitaren
Vurige sonates zullen klinken
En drinken op jouw pracht
Voor rode balustrades
Jasmijnthee in de nacht
Want telkens als ik liefde zie
Als vruchteloze appelboom
Bestijg jij juist die nachtmerrie
En temt haar tot de wildste droom
Ay, ay, ay, ay, jouw stille liedjes
En ik vrees niet langer
Dus dans me naar jouw lippen
Zacht in het dauwgras of de geur van
Jasmijnthee, jasmijnthee, jasmijnthee in de nacht
Jasmijnthee in de nacht
Jasmijnthee in de nacht
Jasmijnthee in de nacht

View File

@ -0,0 +1,6 @@
{
"links": {
"itunes": "https://music.apple.com/nl/album/bellse-parese/727596551",
"spotify": "https://open.spotify.com/album/43P3oVt0iMzGcWyQfRuuLQ"
}
}

View File

@ -0,0 +1,42 @@
Lief, lief, lief
Schatje doe niet zo naïef
Al dat innerlijk vertoon
Interesseert me niet
Ik wil je om je lipstick
En om je smokey eyes
Je Calvin Klein, Chanel
Louis Vuitton, DKNY
Ik wil je bedrog
Jouw Trojaanse paard
Als het masker geil genoeg is
Is het de afslachting waard
M.m.m.m.m
Make-up
Lief, lief, lief,
Al het franke is fictief
Elke weldaad wordt geboren
Uit een corrupt motief
De held smeekt om een oorlog
Sherlock om een moord
De drukpers smeekt despoten
Verban het vrije woord
Niemand is zo listig
Als zij die deugen
Niks is zo eerlijk
Als een onvervalste leugen
M.m.m.m.m
Make-up
Verover dus mijn hart
Met jouw Trojaanse paard
Als het masker geil genoeg is
Is het de afslachting waard
Make-up

View File

@ -0,0 +1,54 @@
Kieren. Gaten. Uit het lood geslagen
Ratten. Kieren. Larven. Gaten
Hond. Tot je deugt hok op slot
Laat het galmen tot het botst
Dreun, dreun, het kreupelhout kreunt
Een silhouet van een man die op zijn spade leunt
Er is iets gaande. Waanzin. Waanzin
Het is een vloek, een zucht, de diesel in de lucht
De maan heeft livor mortis, de versleten waarheid vlucht
Het is waanzin. Waanzin. Waanzin
En ik? Ik ben uw gastheer vannacht
Pak mijn hand en dans
Op het ritme van een dumporkest Ratta toenkien ka skattatikke koeng koen
We drinken wijn uit een gebroken fles Hup, huhup
Een dronken dwaas met een roestige trompet
En het orgel spuwt clusters uit de hel
Klinkt het niet? Dan botst het wel!
Tel snel. De druppels bloed goed
Liberté is een dikkop met een klompvoet
Na mij de zondvloed. Waanzin. Waanzin
De waarheid ligt in het midden zegt de egocentrist
Idealist? Kist dicht!
Na mij de zondvloed. Waanzin. Waanzin
Maar de waanzin breekt uit de grond vannacht
Pak mijn hand en dans
Op het ritme van een dumporkest Ratta toenkien ka skattatikke koeng koen
We drinken wijn uit een gebroken fles Hup, huhup
Een dronken dwaas met een roestige trompet
En het orgel spuwt clusters uit de hel
Klinkt het niet?
Bevrijd jezelf dat is een bevel
Klinkt het niet? Dan botst het, botst het, botst het
Botst het wel!
Ratten. Kieren. Larven. Gaten.
Boem! Ratatoenkie ka. Skapatikke koen
Piepen. Kieren. Kraken. Gaten
Boem! Honden die in
Tongen Blaffen.
Trap de waarheid op de grond
Schaadt het niet? Dan baadt het niet!
Schaadt het niet. Baadt het niet.
Schaadt het niet. Baadt het niet.
Rennen. Razen. Rennen. Razen.
Rennen. Razen. Rennen. Razen.
Halt!

View File

@ -0,0 +1,45 @@
Er zijn twee manen, de pier is van ijs
Ik kijk naar je nu je in de duisternis verdwijnt
De wind vergrijpt zich gulzig aan jouw haar
Je jurk vlamt als een godheid om je zo volmaakte lijf
Dat ik er tranen in mijn ogen van krijg
Ik ben van jou en jij van mij. Dat is klaar
Dus omhels me weer
Als een roedel wolven schat
Verscheur me met jouw lippen
Tot ik snap wat jij bedoelt
Omhels me weer
Als een anaconda
Hoe vaster jouw omhelzing is
Hoe vrijer ik me voel
Het meer is zilver, de nacht heeft geen eind
Ik kijk je aan nu je in de duisternis verdwijnt
De grond is koud en zacht, je lichaam zwaar
De wind gaat liggen, alles is stil
Ik kniel, leg je voorzichtig in de ongerepte sneeuw
Er is gebeurd wat er is gebeurd. Dat is klaar
Dus omhels me weer
Als een roedel wolven schat
Verscheur me met jouw lippen
Tot ik snap wat jij bedoelt
Omhels me weer
Als een anaconda
Hoe vaster jouw omhelzing is
Hoe vrijer ik me voel
Ik ben van jou. Jij bent van mij
Het is de vallende ster die het helderst schijnt
Ik omhels je
Zodat je in de duisternis verdwijnt
Dus omhels me weer
Als een roedel wolven schat
Verscheur me met jouw lippen
Tot ik snap wat jij bedoelt
Omhels me weer
Als een anaconda
Hoe vaster jouw omhelzing is
Hoe vrijer ik me voel

View File

@ -0,0 +1,66 @@
Dames en heren
De stilstand gaat maar door
U bent verstandig, u bent onwijs verstandig
Dus u ziet dat ze altijd inconsequent zijn
Ze gaan als een trein maar ze sporen niet
En ze zeggen: U bent niet gek
Ze zeggen: u bent toch niet gek. Integendeel. U bent wel gek
Dus wij zijn tegen. Overal tegen zijn daar zijn we voor
De stilstand gaat maar door
Dames en heren
Verlangen we niet allemaal terug naar de progressieve tijden?
Laat alles voor de verandering
Alles voor de verandering toch
Één keer hetzelfde blijven
Geen taboes meer. Basta!
We verdragen geen intolerantie roep ik eenzaam in koor
De stilstand gaat maar door
Ze zijn vredezuchtig, oorlogslievend
Architecten van ruïnes
Goed is slecht en slecht is goed
Krab de westerse belangen en de hele wereld bloedt
Geweld wordt pas taboe wanneer de ander het terug doet
Ze hebben zelfs van hun hebzucht niet genoeg
Oh jee
Ik ben mezelf aan het herhalen maar goed dat deed ik nog nooit eerder
En ik bedoel, vernieuwend zijn nee dat is lekker origineel
Maar goed. Daar gaat het ook niet om, laat ik voor de vorm maar wat inhoudelijker zijn
De stilstand gaat maar door
Dames en heren
Laat de rechtspraak links liggen
Want ik deed het in een vlaag van voorbedachte rade, edelachtbare
Waarom heeft een koelbloedige despoot meer met zijn gedrag te maken
Dan een psychoot?
Klop het onheil af op je houten been
De rechter heeft geen weegschaal maar een dobbelsteen
Waar een wil is, is een weg, waar een wil is, is een weg
Hang: “Waar een wil is, is een weg” geketend aan de muur
In dezelfde cel als de regendans en het vagevuur.
Daar waar de eeuwigheid is overleden
Hij was door het exorcisme bezeten
Hij ging er aan zijn hoogmoed onderdoor
De stilstaand gaat maar door
De meeste stemmen gelden?
Niks is zo democratisch als een groepsverkrachting
Onze vrijheid die in de hemel zijt uw naam worde geheiligd
Leid ons niet in verzoeking maar zoek ons in de verleiding
Van Bangladesh cash, SALE, k-tjing, kijk weg. En zeg: 'Ik kan niet tegen onrecht'
Maar onder de tafel strelen we allemaal de dijen van:
'Fair Trade mijn reet, je weet dat grote vis de kleine vis eet
In de cirkel van het leven zijn zij ook geen haartje beter
Groen?
Groen is de kleur dat je gas mag
Groen is de kleur dat je gas mag geven
Als wij het niet doen, doen zij het
Radicaal gematigd
Extreem normaal
Het was bedoeld om te mislukken en daarin ben ik geslaagd
Ik heb het gemaakt door dingen te slopen
Je verdient geen geld met nee verkopen
Voor het eerst voor het laatst aan dit gehoor
De stilstand gaat maar door

View File

@ -0,0 +1,30 @@
Jouw ratio is ook maar een emotie
Die binnen een ronde knock-out gaat tegen mijn trots
Moord, brand, hartstilstand, dat is allemaal niet aan de hand
Als je op mijn lange pik trapt, een treetje hoger op de rots
Ja, je bent misschien de beste schaker
Helaas, hier wordt Mens-erger-je-niet gespeeld
Hoe vaker je dat aapje vlooit
Hoe sneller hij zijn eten met je deelt
De waarheid is een slaaf van intuïtie
Logica de bijbal van instinct
Consistent argument? Man ik weet niet wie je bent
Zorg dat je op de juiste feestjes met de juiste mensen drinkt
En lik eerst alle tranen uit mijn tissue
Voordat jouw rede iets beveelt
Hoe vaker je dat aapje vlooit
Hoe sneller hij zijn eten met je deelt
Je moet een dwaas zijn om te denken
Dat ik jou mijn wang toekeer
Waarom? Ik heb geen reden nodig
Want we zijn met meer
Want we zijn met meer, want we zijn met meer
Want we zijn met meer, want we zijn met meer
Hoe vaker je dat aapje vlooit
Hoe sneller hij zijn eten met je deelt

View File

@ -0,0 +1,39 @@
Een schim onder zijn hoedrand
Die in zichzelf praat
Ik zal goed voor je zijn
Als tijd niet bestaat
En de barman vraagt cynisch
Wil je ijs bij je tranen?
Het hagelt katten op de ruit
En de wind klinkt als Wagner
De dronkaard zwalkt tussen ooit en toen
Liefde, mijn liefde
Ik wil je, ik wil je
Ik wil je wild, ik wil je traag
Jouw lach, jouw seks en jouw zoen
En al dat soort dingen die mensen doen
Als tijd niet bestaat
Een gezicht als een gedicht
Je haar morst op mijn borst, als je me kust
Geeft je lichaam licht
Maar alle hoop is hier een waan
Tussen vloeken en gebeden
Geeft de dronkaard zijn dromen en zijn verleden
Als een wijze les aan vreemden
Ik wend mijn blik af en ik denk aan:
Liefde, mijn liefde
Ik wil je, ik wil je
Ik wil je wild, ik wil je traag
Jouw lach, jouw seks en jouw zoen
En al dat soort dingen die mensen doen
Als tijd niet bestaat
Liefde, mijn liefde
Ik wil je, ik wil je
Dronken en naakt
Tot ons kreunen verdwaalt in een zoen
En al dat soort dingen die mensen doen
Als tijd niet bestaat

View File

@ -0,0 +1,30 @@
HÉ! Wat zit je nou te kijken vuile....
Ik vind treinen sowieso al beklemmend
HÉ! Wat zit je nou te kijken vuile k...
Ik vind treinen sowieso al beklemmend.
Maar zeker als er op zaterdagnacht iemand naast je komt zitten
Terwijl er plaats zat is.
Hij is van de kaart. Paardenstaart. Zo'n gore gehavende geitenbaard.
Een door de drank gekneveld gebit
En een geur alsof je naast een conceptueel kunstwerk zit.
Ik heb een tik met mijn neus maar hij werkt niet meer
Normaal beweeg ik hem snel van rechts naar links
Naar rechts gaat prima maar links blijft hangen.
En hij kijkt schichtig om zich heen met van die kraaienogen
Totdat zijn ogen blijven hangen in de ogen van een vrouw in de coupé
HÉ! Wat zit je nou te kijken vuile...
Ik probeer mijn ogen te knipperen maar het werkt niet meer
Rechts gaat prima maar links blijft hangen
Ik span mijn nekspieren aan. Rechts gaat prima. Links blijft hangen
Ik raak in paniek. Mijn adem verhevigt, mijn hart bonst. Ik moet iets doen.
Ik neem een slok water. Het druipt er langs mijn linker mondhoek weer uit
Ik denk dat ik een beroerte heb gehad. Een TIA. Dat is iets in je hersenen.
Er mag niks met mijn hersenen zijn. Als er iets met je hersenen aan de hand is ga je dingen vergeten. Ik mag geen dingen vergeten
Er mag niks met mijn hersenen zijn. Ik moet me iets herinneren. Ik probeer me iets te herinneren
Het eerste dat ik mij herinner is.
Aus. Bei. Mit. Nach. Seit. Von. Zu.
Ik vind treinen sowieso al beklemmend
Maar zeker als je er op zaterdagnacht achter komt dat de helft van je gezicht verlamd is geraakt
En naast je zit iemand die met elke vrouw in de coupé oogcontact zoekt
En als hij het heeft. Roept:
HÉ! Wat zit je nou te kijken vuile kankerhoer

View File

@ -0,0 +1,52 @@
Ik deed het schat, ik deed het schat, ik deed het schat
Ik deed het schat, ik deed het schat, (hè)
Schat, schat. Ik deed het schat, ik deed het schat
Schat, schat. Ik deed het schat, omdat
Schat, schat. Ik deed het schat, om om
Ik deed het schat omdat
Knip mijn wilde haar
Neem mijn beste vriend
Sla me als een hond
Ik heb het vast verdiend, schat schat, schat schat schat
Bijt mijn stembanden door
Laat me huilend voor je staan
Maar vraag me niet waarom, waarom,
Waarom ik het heb gedaan
Schat, schat. Ik deed het schat, ik deed het schat
Schat, schat. Ik deed het schat, omdat
Schat, schat. Ik deed het schat, om om
Ik deed het schat omdat
Als ik je eerlijk geef
Alle poeha strip
Redenen zijn leugens
Met magneten voor begrip, gun me dat gelul toch niet
Hoezeer ik het ook haten mag
De wijsgeer spreekt
De straathond blaft
Ik deed het schat omdat
Ik deed het schat, ik deed het schat, ik deed het schat (hè)
Ik deed het schat, ik deed het schat, omdat
Schat, schat. Ik deed het schat, ik deed het schat
Schat, schat. Ik deed het schat, om, om
Schat, schat. Ik deed het schat, ik deed het schat
omdat
Als ik je eerlijk geef
Alle poeha strip
Redenen zijn leugens
Met magneten voor begrip
Je blijft bij me mits Ik hou van je maar
Je bleef bij me mits
Ik hou van je, ik hou van je
En alles loopt mis vanwege
Daar en daar
Toen en toen
Die en die
Ik deed het schat omdat

View File

@ -0,0 +1,25 @@
Knoopje voor knoopje
Open ik trillend haar gordijnen
Vuurvliegjes schiet zij
Met strelende nagels in mijn dijen
Zij heeft duizenden namen en terecht
Een drinkplaats waar ooit elke man
Zijn dorst heeft gelest
Het is leeg in haar raam
Slechts de nacht en een hijgende zee
Ze kleedt me in schuimkoppen
Langzaam dein ik met haar mee
Zij heet: Onzichtbare Maan en terecht
En ze lispelt verlegen, mijn liefje
Zit stil en zit recht
Er verschijnt in haar raam
Een schim van de maan door de mist
Maar ik rijk ernaar en meteen
Is het beeld mij ontglipt
Zij heet: Zilveren Vis en terecht
Mijn armen zijn leeg
En haar raam in de muur is weer weg
Mijn armen zijn leeg
En haar raam in de muur is weer weg

View File

@ -0,0 +1,25 @@
Toen mijn zoon stopte mij onderdanig te groeten
Toen mijn zoon stopte mij onderdanig te groeten
Beet ik zijn testikels af
Elke vrouw bij wie ik langs kom lopen
Elke vrouw in ons dorpje bij wie ik langsloop
Presenteert mij, presenteert mij haar geslacht
Aad dat is mijn beste maat
Ik betrapte hem gister met mijn vrouw
Maar dat is prima, dat is prima
Zolang ze maar niet ovuleert
Bas heeft een erectie
Want hij streeft naar mijn positie
Maar ik bluf hem af en laat hem nu voor straf
Door mijn rughaar woelen
Toen mijn zoon, toen mijn zoon, toen mijn zoon
Stopte mij onderdanig te begroeten
Toen mijn zoon, toen mijn zoon, toen mijn zoon
Stopte mij onderdanig te begroeten
Beet ik zijn
Beet ik zijn
Beet ik zijn testikels af

View File

@ -0,0 +1,21 @@
Mijn dromen spatten als lemmings op de grond
Grijnzend telt het onheil de tanden in mijn mond
Hoe lang kan ik nog wegkijken
Het antwoord blaast niet in de wind
Het valt op straat als natte sneeuw
Waar het mengt met modder en uitlaatgassen
Gooi het in duigen
Alles kan stuk
Scherven brengen geluk
Ben ik niet eenzaam; dan zijn we wel tweezaam
We zijn nog dezelfden maar alles lijkt anders vandaag
Van ongezouten naar zouteloos
De vallei werd een dal
En ik hou van jou als een man die zijn vrouw niet meer aanraakt
Omdat hij van haar walgt
Gooi het in duigen
Alles kan stuk
Scherven brengen geluk

View File

@ -0,0 +1,6 @@
{
"links": {
"itunes": "https://music.apple.com/nl/album/make-up/1072353104",
"spotify": "https://open.spotify.com/album/2LUZLG1CjR6CyxBqpeef0w"
}
}

View File

@ -0,0 +1,40 @@
Oh, de rotsen rollen wild uit hun evenwicht
De zon is weerloos van zijn bed gelicht
De meren kolken het water uit de wijn
De wereldorde was een infectie in het brei
Het circus rolt de stad in als een vormloze mutant
De liederen waaien gevlamd en dissonant
Men vreest, men beeft maar ergens wist men dat dit kwam
En de vlaggen op de tent spellen
De Big One
Oh, de houvast wordt bleek, uit de schaduw klimt een stem:
“Alles dat je weet, zit tussen paradoxen klem”
De wijze boeken smelten, de televisie zwijgt
In kleuren waar geen visuele cortex grip op krijgt
En het draait in een hypnose, de betekenis ontspoord
De dingen op zich zelf zijn weggezogen uit het woord
En de spreekstalmeester groet u zonder rijm of samenhang
Maar u kent de reputatie va
De Big One, De Big One
De Big One, De Big One
Het is de aardbeving, de hartstilstand, de donderslag bij licht
De curieuze karavaan die het zelfbeeld ontwricht
U wilt de tiet van uw routine maar u voelt de klauwen van
De afgrond die zich schuilhoudt in
De Big One
En alles galmt hoogdravend, obscuur, duister en zwaar
Dames en heren, dit is de gezelligste plaat van het jaar
Want ja, u wilt escapisme, vermaak, dansend licht
Juwelen in de lucht en een lach op het gezicht
Waarom de zere plek beroeren?
Want de psyche schreeuwt al lang
Dat u nooit gaat kunnen vluchten voor
De Big One
Voor De Big One, De Big One
Voor De Big One, De Big One

View File

@ -0,0 +1,51 @@
Ah Rhum Cha Cha Cha
Geef me een kus
Nu de tent hier in de fik staat
Want morgen
Begint het weer van voor af aan
Geef me de rum
Dan meng ik het met arsenicum
Want er is niks aan
Als het niet gruwelijk mis kan gaan
Verstrengeld op de grond
En het bloed in onze monden
Kus me nu de tent hier in de fik staat
Het is de cirkel van de maan
Het kraaien van de haan en morgen
Begint het weer van voor af aan
Ah Rhum Cha Cha Cha
En onbewust
Ben ik al duizend keer gestorven
En hoe dat spook
Mijn brein nu binnen morst
Mijn slotapplaus
Heeft als een mitrailleur geklonken
En mijn buiging
Was met het mes op mijn strot
Verstrengeld op de grond
En het bloed in onze monden
Kus me nu de tent hier in de fik staat
Het is de cirkel van de maan
Het kraaien van de haan en morgen
Begint het weer van voor af aan
Want ben je vrij
Als je mag dansen in je ketens?
Nee, het aapje ontwaakt pas
Als het gruwelijk mis kan gaan
Dus vrij met mij
Nu de tent hier in de fik staat
Want morgen
Begint het weer van voor af aan
Lalalalala
Ah Rhum Cha Cha Cha

View File

@ -0,0 +1,53 @@
Schat, daar gaan we weer
Naar die dode stad
En al het licht gedoofd
Schat, daar gaan we weer
Ik sleep mijn lege hart
Nog een paar passen
naar je zwijgende lijf
En in je hese schaduwogen is
Al het licht gedoofd
Schat, daar zijn we weer
Ik voel het ijs op je huilende handen
Maar met je lijf aan mijn lijf duren we weer een lawine langer
En al is al het licht gedoofd
Al het licht gedoofd
Aan de oever van het slijk
liggen de gedachten
Als grommende wilde honden aangelijnd te wachten
Tot ze uiteindelijk, onvermijdelijk
Hun weg weer zullen bijten naar die dode stad
Waar al het licht is het gedoofd
Daar zie ik je weer
Als al het licht is gedoofd
Kus je het licht weer in mijn ogen
Je streelt het denken uit mijn dijen
Verleidt engelen te dansen
Op het ritme van ons deinen, oh schat
In die stad waar het licht is gedoofd
Daar zie je me weer
Ik kus het licht weer in je ogen
Streel het denken uit je dijen
Verleid engelen te dansen
Op het ritme van ons deinen
Je kust het licht weer in mijn ogen
Streelt het denken uit mijn dijen
Verleidt engelen te dansen
Op het ritme van ons deinen
Ik kus het licht weer in je ogen
Streel het denken uit je dijen
Verleid engelen te dansen
Op het ritme van ons deinen
Op het ritme van ons deinen
Op het ritme van ons deinen
Op het ritme van ons deinen
Op het ritme van ons deinen

View File

@ -0,0 +1,47 @@
Je bent mijn poes
Je bent mijn teef
Mijn koe, mijn kip
Mijn hen, mijn tiet, mijn pop, mijn sik en ik
Verschijn stinkend naar urine luid schreeuwend ten tonele
Ik neem voedsel voor je mee zodat je mij niet op zal eten
Ik zal mijn vleugels wrijven in arpeggios en akkoorden
Ik zal mijn werkers opdracht geven de rivalen te vermoorden
Je bent mijn bache
Je bent mijn zeug
Mijn hinde, mijn vooi
Mijn kuiter, apin, mijn wijfje en mijn ooi
En ik: Te klein en mollig, k zal op de eieren gaan passen
Tollend met mijn staart tegelijk schijten en plassen
En ik lig tot je alleen bent in de bosjes te loeren
Ik zal mijn maaginhoud opbraken en het aan je voeren, want je bent
Bronstig, berig, ritsig, welig
Broeds, krols, rams, loops, hengstig en tochtig
Bronstig, berig, ritsig, welig
Broeds, krols, rams, loops, hengstig en tochtig
Je bent mijn merrie
Je bent mijn moer
Duivin, ezelin,
Woerhen, kloek, leeuwin, tijgerin
En ik zal mijn lichaam strekken en naar de hemel brullen
Voor je dansen tot je kuit schiet en het nest met mijn hom vullen want je bent
Bronstig, berig, ritsig, welig
Broeds, krols, rams, loops, hengstig en tochtig
Bronstig, berig, ritsig, welig
Broeds, krols, rams, loops, hengstig en tochtig
Je bent mijn vrouwtje
Je bent mijn vrouwtje
Je bent mijn vrouwtje
Je bent mijn vrouwtje
Bronstig, berig, ritsig, welig
Broeds, krols, rams, loops, hengstig en tochtig
Bronstig, berig, ritsig, welig
Broeds, krols, rams, loops, hengstig en tochtig

View File

@ -0,0 +1,32 @@
Het begint met de smaak van metaal
En de geur van vuur
Het leeft in de neuronen en het gromt mentaal
Maar alles lijkt echt op dit uur
En nu is het hier, is het hier
Nadat het mijn toekomst al mee had genomen
Is het nu hier, is het hier
Voor mijn dromen
Een man met een mes zit op me op bed
En hij dreigt, hij dreigt
De objecten in de kamer krijgen snavels en hamers
In een maan die in zwarttinten schijnt
Nu is het hier, is het hier
Nadat het mijn toekomst al mee had genomen
Is het nu hier, is het hier
Voor mijn dromen
Het klopt op de ruit, het grijpt in mijn huid
Het beweegt, beweegt
De jas in mijn kast is een duistere gast
Die via mijn smartphone spreekt:
“We zijn nu hier, we zijn hier
Na het perspectief dat al mee was genomen
Zijn we nu hier, zijn we hier gekomen...”
Nu is het hier, is het hier
Nadat het mijn toekomst al mee had genomen
Is het nu hier, is het hier, gekomen
Voor mijn dromen

View File

@ -0,0 +1,51 @@
De zon verdrinkt in de bergen
Ik draag de poten van het beest
Het zal wel weer een noodlot vergen
Je was hier anders niet geweest
Ik zie je woede en je vragen
Je ambitie, je talent
Je kan mijn ogen niet verdragen
Omdat je steeds verlaten bent
Er zijn onnoemelijk veel slangen
Maar neem dit van de echte aan
De zon was nooit meer opgekomen
Als hij niet onder was gegaan
Laat me je helpen om te sterven
Te vervellen, op te staan
Want wil je vliegen als een vlinder?
Dan zal je zingen als een zwaan
Ja wil je als de zon opkomen?
Dan zal je onder moeten gaan
Hmmmm, hmmmm
Rapoem!
Hmmmm, hmmmm, mmmm, Rapoem! Clap!
Hmmmm
Rapoem! Clap! Wow!
Rapoem! Clap! Wow! Rapoem! Clap! Wow!
Je bent verblind door de verhalen
Van het licht waar je naar streeft
Maar geen boom zal ooit de hemel halen
Als hij geen diepe wortels heeft
Dus wil je vliegen, schoon en helder?
De sterren proeven in je mond?
Omarm de duivels in de kelder
Van de donkere, dode grond
Er zijn onnoemelijk veel slangen
Blijf ver van hun verlichting vandaan
De zon was nooit meer opgekomen
Als hij niet onder was gegaan
Er zijn onnoemelijk veel slangen
Maar neem dit van de echte aan
Wil je vliegen als een vlinder?
Leer dan sterven als een zwaan
Ja wil je als de zon opkomen?
Dan zal je onder moeten gaan

View File

@ -0,0 +1,25 @@
De geweren zijn geladen, het maaiveld staat in brand
Het is vechten of vluchten en ik sta hier verlamd
Ik sluit mezelf weer op in de bunker van mijn hoofd
Ik zou willen janken als een baby maar de bron is opgedroog
Alle gasten bleken gieren, mijn wijf bleek gestoord
Hoe kom ik binnen twee keer knipperen in het midden van dit koord?
En ik spartel als een vlieg in het spinnenweb in mijn hoofd
Ik zou willen janken als een baby maar de bron is opgedroogd
En het vangnet is gemaakt van vuisten en vuur
Mijn verlaten geraamte slaat zijn hoofd tegen de muur
Een meter boven het skelet, naast het ziekenhuisbed
Met vleugels van vliezen kijkt mijn geest of hij het redt
En ze zagen aan mijn voeten, Damocles zegt: “Kijk omhoog”
En ik wil alleen maar janken maar de bron is opgedroogd
The show must go on met zelfdestructie aan het stuur
De klokken lopen huiswaarts, slaan mijn hoofd tegen de muur
De witte jas machine met zijn robotstem zegt:
“Ik zou je broer wel willen helpen maar de dokters zijn defect”
En ik sluit mezelf weer op in de ruïne van mijn hoofd
Ik zou willen janken als een baby maar de bron is opgedroogd
Is opgedroogd, is opgedroogd, is opgedroogd

View File

@ -0,0 +1,42 @@
De wind grijpt in de jas van een oude gek
Een afgesneden konijnenpoot om zijn nek
Hij zegt: “Of het nu goed is of verkeerd
De hond geeft de poot die hem is aangeleerd
Ik ben overal geweest, ik heb alles gezien
Ik heb mijn ware zelf gevonden op zn minst een keer of tien
Ik dacht fake it till you make it, waar een wil is, is een weg
Precies zoals mijn pa dat tegen mij had gezegd
Oh, ik waaide zo lang met de winden mee
Dat ik dacht dat ik zelf de wind was
Ik ben overal geweest, ik heb elke tijd gezien
Ik heb de zon op zien komen in Beijing
Ik zag een God die in de donder woont
Het goede waar je na je dood voor wordt beloond
Ik zag de hemel breken voor een regendans
Beulen die zeiden keer de andere wang
En ik riep Deutschland über alles en America is Great
En mijn ego bleef roepen dat hij zelf controle heeft
Oh, ik waaide zo lang met de winden mee
Dat ik dacht dat ik zelf de wind was
Of het nu goed is, of verkeerd
Vrijheid is de dwang die je brein accepteert”
De wind krult de bladeren om hem heen
Hij zegt: “Ik zag de toekomst in een rune steen
De illusies verlicht, de oude Goden gesmoord
En bloed kleeft aan het zwaard van het nieuwe ware woord
Maar nu weet men zeker dat hij voor beschaving strijdt
En er is altijd de gek die zegt: Zo gaat het altijd
Oh, ik waaide zo lang met de winden mee
Dat ik dacht dat ik zelf de wind was”
En de zon scheen omdat hij geen keus heeft op het niks nieuws
De zon scheen omdat hij geen keus heeft op het niks nieuws*
“En ik waaide zo lang met de winden mee
Dat ik dacht dat ik zelf de wind was”
*Parafrase: Samuel Beckett, Murphy

View File

@ -0,0 +1,58 @@
Oh, zoen me
Ik brand, ik smelt alleen nog
Voor jou, voor jou
Je wil alles met me doen ja
En schat ik ben een voodoopopje
Voor jou, voor jou
Dus verlok me, prooi me
Flik me en flooi me
Bind me vast of vergooi me
Maar zoen me
Dan ben ik een voodoopopje
Voor jou, voor jou
Er is een lamp in een kalebas
De trommels in het hoge gras
En we zijn waar de wind wil dat we zijn
Er is een vuur, er is tabak en er wordt gedanst
Stemmen zwemmen naar een trance
En de rum is aan het tongen met mijn brein
En jij stak met je stralen de maan zo uit het water
Je druppelde als een druipsteen naar me toe
Oh, zoen me
Ik brand, ik smelt alleen nog
Voor jou, voor jou
Je wil alles met me doen ja
En schat ik ben een voodoopopje
Voor jou, voor jou
Dus verlok me, prooi me,
Flik me en flooi me
Bind me vast of vergooi me
Maar zoen me
Dan ben ik een voodoopopje
Voor jou, voor jou
De bomen zijn van schaduwen gemaakt
Je fluisterstem heeft mijn oren aangeraakt
Het grijpt in mijn lijf als een visioen
De maan in je haren glinstert dichterbij
De malagueña is van jou en mij
De fakkels vlammen in de wind en de rivier kolkt naar ons toe, oeh
Zoen me
Ik brand, ik smelt alleen nog
Voor jou, voor jou
Je wil alles met me doen ja
Schat ik ben een voodoopopje
Voor jou, voor jou
Verlok me, prooi me,
Flik me en flooi me
Bind me vast of vergooi me
Maar zoen me
Dan ben ik een voodoopopje
Voor jou, voor jou

View File

@ -0,0 +1,28 @@
Oh, jullie die zo democratisch spreken:
“Kniel voor de vrijheid anders ben je een terrorist”
Maar heb je wel eens naar jouw slachtoffers gekeken?
Of was je dronken en heb je die gemist?
En jij die met je dikke nek om de drukpers geeft
“De grens ligt bij geweld,” preek je gedwee
Maar voor het gemak de illegale bommen op mijn vaderland vergeet
Wil je geen terreur?
Stop er dan zelf mee!
Eerst moeten volken die jij platgooit voor je rijkdom
De vrijheid krijgen, jouw wrede vrijheid, af te wijzen
Ga je echt pochen over hoe vrij het westen is?
Hoe vrij het westen is
Blijkt als ze straffeloos
Met drones, embargos en napalm
Miljoenen vermoordt
Het westen vaart zo wel
Want buiten haar grenzen
Heeft ze nog nooit
Van het woord mensenrechten gehoor
Oh ontken voor één keer niet het rauwe feit
Het westen is zo vrij door haar
Gewelddadigheid

View File

@ -0,0 +1,44 @@
Bevrijd de wraakzucht uit de kerker
En de wellust uit de kast
Zij die uit chaos zijn gerezen
Elke hond heeft zijn dag
En daar komen de begerenden
De trotsen, de onterenden
De rancuneuzen, nijdigen
Crematoren van de lach
Oh haal je eerzucht onder de zweep vandaan
Vlooi de meelij uit je vacht
De laatsten staan ver voor jou
Elke hond heeft zijn dag
Dus daar staan de tegendraadsen
De stampers en de lammen
De blinden, de doofstommen
De morelen zonder macht
En de zwaarmoedigen, opvliegenden
De onwelwillenden, de liegenden
De galblazers, de saters
Elke hond heeft zijn...
Bevrijd de hartstocht van de zondaar
Gooi je vooruitgang overstag
En ik hoop dat je hebt genoten, maar
Elke hond heeft zijn dag
Oh heil de gebrokenen, de grievenden
De werkelijk vredelievenden
De spiegelkijkende hoeders
Van het zelfbeklag
En de vertrapten en de gebruikten
De ontkenden en besmuikten
De knielenden en de gekromden
Elke hond heeft zijn dag
Bevrijd de wraakzucht uit de kerker
En de wellust uit de kast
Zij die uit chaos zijn gerezen
Elke hond heeft zijn dag

View File

@ -0,0 +1,70 @@
Ik heb mijn toevlucht gezocht
Toen ik in de war leek
Omdat de wereld bizar bleek
Toen heb ik gezocht
In de havens, in de kroegen
In de heilige boeken
Met glanzende vodden
Als een sint en als een schoft
En ik heb mijn toevlucht gezocht
In de nachtclubs en de lijven
Van door God gezonden wijven
En hun troost die ik kocht
Ik heb mijn toevlucht gezocht
Na een haatdragend uur
Met mijn vuist tegen de muur
En mijn ogen van vocht
Ik heb mijn toevlucht gezocht
Maar die vrouwen in mijn armen
Mijn opgesneden charme
Heb ik net zo goed vergokt
En hoe de straten gingen praten
De nachten gingen braken
De stegen gingen zingen
Over de klappen die ik ving
Maar dan een schorre saxofoon
Bracht die boeren tot zwijgen
Het zou de bloeddorst verdrijven
Met een kluisterende toon
En het ritme in mijn maag
De zoen in mijn kraag
De hypnose in mijn kop
En een band die nooit stopt
Ik heb mijn toevlucht gezocht
Maar het wilde niet baten
De winter in de straten
Het slapen op mos
Maar ik vond plots mijn heil
Bij een meisje met ogen
Die nog niet waren gebroken
Zonder weerhaken en kloven
Ze was mooi als een lied
Ik was verloren, verliefd
De messen gingen slapen
In haar nakende bries
Maar de stilte verweerde
Tot woorden en drank
En noem het onrust van een man
Maar ik werd er krankzinnig van
Dus zoek ik weer mijn toevlucht
En al maakt het me gek
De ware waarde vind je
Waar de weerzin wordt gerekt
De waanzin die het waard is
Om als doel door te gaan
Totdat dat luchtkasteel instort
En het van voren af aan
In het werk, in de liefde
Terug naar de bron
Onder de toonbank
En achter de zon
Ach joh, waar je ook zoekt
De wereld blijft bizar
Maar wie niet in de war is
Is pas echt in de war
Ik heb mijn toevlucht gezocht
Mijn toevlucht gezocht

View File

@ -0,0 +1,31 @@
De een zijn uitschot is de ander zijn adel
De een zijn hoon, andermans zegepraal
De een zijn kerk is de ander zijn Babel
Elk gevolg is ook een einde verhaal
De een zijn kastijder, de ander zijn bevrijder
De een zijn ketterij, de ander zijn lust
De een zijn maniak is de ander zijn leider
De een zijn paranoia is de ander zijn rust
De een zijn keuze is de ander zijn lot
De een zijn duivel, de ander zijn God
Moge de almachtige onze pogingen ondersteunen
Leve onze zanger. Hoera! Hoera! Hoera!
De een zijn waan is de ander zijn ervaring
Elke meesterstrategie is ook een laaghartige list
Elke vredesmissie is een oorlogsverklaring
De een zijn vrijheidsstrijder, andermans terrorist
De een zijn smaad is de ander zijn ode
De een zijn heiligheid is de ander zijn grap
De een zijn kracht, de ander zijn dode
En elke wijsheid is ook een rode lap
De een zijn keuze is de ander zijn lot
De een zijn duivel, de ander zijn God
Moge de almachtige onze pogingen ondersteunen
Leve onze zanger. Hoera! Hoera! Hoera
Moge de almachtige onze pogingen ondersteunen
Leve onze zanger. Hoera! Hoera! Hoera!

View File

@ -0,0 +1,92 @@
Vandaag zullen we bidden voor de dolende zielen
Die zich nederig smekend in het vagevuur bevinden
En hun harten hebben uitgesneden en ze dragen het in hun handen En met hun ogen het kloppen van hun sterfelijkheid aanschouwen Het kloppen van het hart, het hart klopt in hun handen
Hun tongen proeven of het zoet is
Maar ze proeven alleen bitter
En ze zien de grauwe wachter met de sleutels van de afgrond
Ze vragen aan die schaduw:
“Hoe verdwijnt het bitter?”
En ze vragen aan de schaduw:
“Hoe maak ik mijn hart lichter?
Want straks komt de weegschaal
Met enerzijds mijn zondes
En anderzijds een veer van licht
Hoe kunnen ondermaanse daden
Minder wegen dan een veer?”
En ze vragen aan de schaduw:
“Maak mijn hart toch minder bitter
Want dit kloppende orgaan is veel te zwaar, is veel te zwaar” Vandaag zullen we bidden voor de dolende zielen
Vandaag zullen we bidden voor de dolende zielen Die tussen gerechtigheid en mededogen
Een touw zien gespannen
Met de gouden poort aan de overzijde
En de vlammen beneden
Een naamloze massa die wacht hoe zij de oversteek gaan nemen
En bovenzijds een loopbrug waar duur geklede zondaars met ongewogen harten hun vrije oversteek mogen nemen
Zichtbaar voor het oog, te ver om de sprong te wagen
Vandaag zullen we bidden voor de dolende zielenVandaag zullen we bidden voor de dolende zielen Hun hart huilt in hun handen
Hun hart vraagt: “Was ik zo slecht
Wie zegt me wat ik verkeerd heb gedaan?” Vandaag zullen we bidden voor de dolende zielen
Vandaag zullen we bidden voor de dolende zielen
Wanneer aarde aan het barsten is
En de schuldvraag gonst in een storm van wilde krekels
De donder en de bliksem en natuurlijk is er regen
De grauwe wachter met de sleutels van de afgrond buldert:
“Schuldig!”
De grauwe wachter met de sleutels van de afgrond buldert:
“Schuldig, schuldig, schuldig!”
En de huilende harten smeken:
“Schuldig dan van wat?
Wat hebben wij misdaan..? Wat hebben wij misdaan?”
De grauwe wachter buldert:
“Schuldig zijn de melaatsen
Uw sombere hart heeft uw lichaam verzwakt
U bent onrein, u bent walgelijk
Schuldig zijn de ongelovigen en de afgodenaanbidders
God verplettert de hoofden van zijn vijanden
De harige kruinen van wie met schuld zijn beladen, jullie voeten zullen waden in jullie eigen bloed, met hun tongen zullen jullie honden ervan likken Schuldig zijn de vrouwen, gij koeien van Basal
Die zich in de nachtmerrie der verlichting aan de man gelijk wanen
Schuldig zijn de mannen die met mannen liggen
U begaat een gruwel
Uw bloed is op u en u zult zeker ter dood worden gebracht
Schuldig zijn de ontslagen slaven die hun vrouw en kind niet willen verlaten U zult worden verminkt door een priem die door uw oor worde geslagen Schuldig is hij die zijn eerst geboren zoon niet aan de Heer offert
Schuldig is hij die overspel pleegt
Zijn bloed is op hem
Dieven, hebzuchtigen, dronkaards en afpersers
U zult allen Gods Koninkrijk niet erven”
Vandaag zullen we bidden voor de dolende zielen
De dag van de HEER breekt aan, meedogenloos, grimmig, in brandende toorn Het land zal in een woestenij veranderen
De zondaars die er wonen verdelgt hij
Wie gegrepen wordt, zal doorstoken worden, wie weggevoerd wordt
zal omkomen door het zwaard
Hun kinderen worden voor hun ogen doodgeslagen,
hun huizen geplunderd, hun vrouwen verkracht
En hij die zich opstandig weet zal omkomen in de strijd, zijn kleine kinderen zullen worden doodgeslagen, zijn zwangere vrouw opengereten
De dag van de Heer breekt aan meedogenloos, grimmig, in brandende toorn En daar zien wij de doden...
Door de zeeën opgebraakt uit de graven gebarsten
Staande voor een troon en er worden boeken geopend
En de doden worden geoordeeld
En ze kijken in de afgrond
En de brandende toorn kolkt als lava in de diepte
En de zondaars kijken angstig in de diepte
En wij kunnen wel bidden voor de dolende zielen Maar zijn wij zelf niet even zondig?
Zijn wij zelf niet even schuldig?
Is ons bloed niet op ons?
Staan wij daar zelf niet voor de afgrond?
Angstig op het touw met de brandende toorn onder ons?
Kunnen wij onze ogen wel afhouden van de weerzinwekkende diepte? De schaduw met de sleutels heeft onze hel geopend
Wij zijn schuldig, schuldig, schuldig!
En u kunt niet langer wegkijken voor het vuur
U kunt niet langer wegkijken voor het vuur
U kunt niet langer wegkijken voor het vuur
En we worden allen in de poel des vuurs geworpen
Hooghartig hebben we gebeden voor de dolende zielen Maar niemand zal nog bidden voor onze grote schuld
En we worden gewogen en onze harten te zwaar bevonden En we worden door de brandende toorn des almachts
In de poel des vuurs geworpen
We worden door de almacht
In de poel des vuurs geworpen
In de poel des vuurs geworpen
In de poel des vuurs geworpen
Ga heen in de vrede van De Big On

View File

@ -0,0 +1,6 @@
{
"links": {
"itunes": "https://music.apple.com/nl/album/de-big-one/1436687871",
"spotify": "https://open.spotify.com/album/2NwvZ1rxeSqzTArutucUNP"
}
}

105
data/cohen_tour.csv Normal file
View File

@ -0,0 +1,105 @@
date;city;venue;link;flags
2019-08-30;Ede;Cultura;;PREVIEW
2019-09-06;Alkmaar;TAQA Theater De Vest;;PREVIEW
2019-09-07;Naaldwijk;WestlandTheater De Naald;;PREVIEW
2019-09-27;Naaldwijk;WestlandTheater De Naald;https://www.westlandtheater.nl/programma/3429/Flip_en_De_Noormannen/Flip_Noorman_zingt_Leonard_Cohen_try_out_/;TRYOUT
2019-09-28;Den Haag;PEPER festival;https://denhaag.com/nl/event/109470/peper;SOLO
2019-10-04;Gorinchem;'t Pand;http://theaterpand.nl/2019-2020/voorstellingen_okt.php;TRYOUT,UITVERKOCHT
2019-10-05;Enschede;De Kleine Willem;https://www.wilminktheater.nl/programma/!/4971/flip-noorman/flip-noorman-zingt-leonard-cohen/;TRYOUT
2019-10-12;Almelo;Theater HOF;https://www.hof88.nl/theater/flip-noorman-zingt-leonard-cohen-flip-noorman/12-10-2019-20-15/;TRYOUT,XL
2019-10-19;Alkmaar;TAQA Theater De Vest;https://theaterdevest.nl/tickets/seizoen-2019-2020/flip-noorman-flip-noorman-zingt-leonard-cohen/;TRYOUT,XL,UITVERKOCHT
2019-10-20;Rotterdam;Kantine Walhalla;https://walhalla.stager.nl/web/tickets/274249;PREMIERE,XL
2019-10-27;Oosterhout;Theater de Bussel;https://www.theaterdebussel.nl/programma/2319/Zingt_Leonard_Cohen/Flip_Noorman/;
2019-11-02;Oisterwijk;Cultuurcentrum de Tiliander;https://getaticket.nl/tiliander/bestellen/s2045;
2019-11-03;Alkmaar;Vest in de stad festival;https://theaterdevest.nl;SOLO
2019-11-07;Meppel;Schouwburg Ogterop;https://www.schouwburgogterop.nl/bestel/3185;UITVERKOCHT
2019-11-08;Enkhuizen;De Drommedaris;https://tickets.drom.nl/shop/tickets.php?showid=544;UITVERKOCHT
2019-11-16;Amsterdam;De Meervaart;https://www.meervaart.nl/theater/programma/details/611/flip-noorman-flip-noorman-zingt-leonard-cohen;UITVERKOCHT
2019-11-23;Weesp;City of Wesopa;https://wesopa.nl/city/agenda/;UITVERKOCHT
2019-11-30;Houten;Theater Aan De Slinger;;UITVERKOCHT
2019-12-07;Ede;Cultura;https://www.cultura-ede.nl/theater/agenda/flip-noorman--leonard-cohen.aspx;XL, UITVERKOCHT
2019-12-13;Diemen;Theater De Omval;https://www.theaterdeomval.nl/voorstellingen/?id=1220;UITVERKOCHT
2019-12-18;Zoetermeer;Stadstheater;https://www.stadstheater.nl/s73964/Flip_Noorman_Flip_Noorman_zingt_Leonard_Cohen;UITVERKOCHT
2019-12-19;Hoofddorp;Het Oude Raadhuis;https://hetcultuurgebouw.ticketmatic.com/addevent.php?a=cvdbQmUEQ3U&e=RH26sUZzeik&s=80cswBbInpo&l=nl&_ga=2.6726582.546457680.1559242849-850583459.1523895503;UITVERKOCHT
2019-12-20;Nieuwegein;DE KOM;https://www.dekom.nl/agenda/3661/Flip_Noorman/Flip_Noorman_zingt_Leonard_Cohen/;UITVERKOCHT
2019-12-28;Veghel;De Blauwe Kei;https://www.blauwekei.nl/programma/4443/Zingt_Leonard_Cohen/Flip_Noorman/?type=show;UITVERKOCHT
2020-01-10;Alphen aan den Rijn ;Theater Castellum;https://theatercastellum.nl/s72834/Flip_Noorman_Zingt_Leonard_Cohen;UITVERKOCHT
2020-01-11;Gouda;De Goudse Schouwburg;;UITVERKOCHT
2020-01-12;Ritthem;Theater de Verwachting;https://tickets.theatersaanzee.com/nl-NL/Show/Details/Flip-Noorman-Flip-Noorman-zingt-Leonard-Cohen-12-jan-24163;UITVERKOCHT
2020-01-17;Deventer;Deventer Schouwburg;https://apps.ticketmatic.com/widgets/deventer_schouwburg/addtickets?edit=yes&event=14523&extraevents=14521&flow=basketwithcheckout&l=nl&oncompletion=orderdetail&panels=customer,delivery,payment,voucher&reservemoretickets=yes&returnurl=https://deventerschouwburg.nl&saleschannelid=2&skinid=1&withauthentication=no&accesskey=315dbd6be362a7ea0d5bd731&signature=d32b335aee3726b15f88cf80c5cf8342e83fd8bb58db59a3eb2c6b82de82807f&_ga=2.214948382.86549655.1559243304-1344454272.1559243304#!/addtickets;UITVERKOCHT
2020-01-23;Gouda;De Goudse Schouwburg;https://www.goudseschouwburg.nl/voorstellingen/3958//Flip_Noorman_zingt_Leonard_Cohen/;UITVERKOCHT
2020-01-25;Vianen;Theater Vianen;https://www.theatervianen.nl/seizoen-2019-2020/flip-noorman-zingt-leonard-cohen/;UITVERKOCHT
2020-01-29;Beusichem;Het Heerenlogement;https://theaterheerenlogement.nl/voorstellingen/?hilite=%27flip%27%2C%27noorman%27;UITVERKOCHT
2020-02-01;Waalwijk;Theater de Leest;https://www.deleest.nl/bestel/6227;UITVERKOCHT
2020-02-06;Emmeloord;Theater 't Voorhuys;https://www.theater-voorhuys.nl/agenda/4944/zingt_Leonard_Cohen/Flip_Noorman/?type=show;UITVERKOCHT
2020-02-08;Utrecht;Stadsschouwburg;https://tickets.stadsschouwburg-utrecht.nl/nl/perf/2019-0208B1;XL,UITVERKOCHT
2020-02-13;Leeuwarden;De Harmonie;https://apps.ticketmatic.com/widgets/de_harmonie/addtickets?event=26655&skinid=10000&returnurl=https%3A%2F%2Fharmonie.nl%2Fn%2Fagenda_return_tm&edit=yes&l=nl&extraevents=26921&reservemoretickets=yes&withauthentication=no&oncompletion=orderdetail&flow=basketwithcheckout&accesskey=2ea02106e4411f55e0e2e681&signature=dd3929be39d8cb47cb53d76a4d376424951322baf3981963cb263a83568d244c&_ga=2.138838516.672648337.1568033858-1929889804.1568033858#!/addtickets;XL,UITVERKOCHT
2020-02-21;Dordrecht;Energiehuis, Machine;https://apps.ticketmatic.com/widgets/kunstmin/addtickets?event=12495&flow=basketwithcheckout&l=nl&oncompletion=orderdetail&returnurl=https%3A%2F%2Fwww.kunstmin.nl%2Fprogramma%2Fflip-noorman%2F&saleschannelid=10000&skinid=1&accesskey=a03da7ecff7ea4ac81408d6b&signature=f8c5f334acdfe6a6e037711569fc24617d558fefdfc919f900bd2bab0ccfe674#!/addtickets;UITVERKOCHT
2020-03-09;Amsterdam;De Kleine Komedie;https://www.dekleinekomedie.nl/mijntheater/winkelmandje/;XL,UITVERKOCHT
2020-09-03;Rotterdam;Batavierhuis;https://www.batavierhuis.nl/concerten/;
2020-09-12;Borne;Kulturhus De Bijenkorf;https://www.kulturhusborne.nl/;
2020-09-12;Borne;Kulturhus De Bijenkorf;https://www.kulturhusborne.nl/;
2020-09-24;Apeldoorn;Theater Orpheus;https://www.orpheus.nl;
2020-10-01;Schiedam;Theater aan de Schie;https://www.theateraandeschie.nl;
2020-10-02;Barendrecht;Theater Het Kruispunt;https://www.theaterhetkruispunt.nl;
2020-10-04;Zeist;Oosterkerk;;
2020-10-09;Almere;Kunstlinie Almere Flevoland;https://www.kaf.nl;
2020-10-09;Almere;Kunstlinie Almere Flevoland;https://www.kaf.nl;
2020-10-10;Coevorden;Theater Hofpoort;https://www.theaterhofpoort.nl;
2020-10-10;Coevorden;Theater Hofpoort;https://www.theaterhofpoort.nl;
2020-10-11;Den Bosch;Verkadefabriek;https://www.verkadefabriek.nl;
2020-10-11;Den Bosch;Verkadefabriek;https://www.verkadefabriek.nl;
2020-10-16;Breda;Chassé Theater;https://www.chasse.nl;
2020-10-17;Hoofddorp;Schouwburg De Meerse;https://www.demeerse.nl;
2020-10-17;Hoofddorp;Schouwburg De Meerse;https://www.demeerse.nl;
2020-10-22;Capelle a/d IJssel;Isala Theater;https://www.isalatheater.nl;
2020-10-24;Purmerend;Theater de Purmaryn;https://www.depurmaryn.nl;
2020-10-24;Purmerend;Theater de Purmaryn;https://www.depurmaryn.nl;
2020-10-25;Zeist;Oosterkerk;;
2020-10-31;Roosendaal;De Kring;https://www.dekringroosendaal.nl;
2020-11-01;Haarlem;Philharmonie;https://www.theater-haarlem.nl;
2020-11-05;Oss;De Lievekamp;https://www.lievekamp.nl;
2020-11-07;Eindhoven;MG Frits Philips;https://www.muziekgebouweindhoven.nl;
2020-11-07;Eindhoven;MG Frits Philips;https://www.muziekgebouweindhoven.nl;
2020-11-08;Zwolle;Odeon, Hanzestrohmzaal;https://www.zwolsetheaters.nl;
2020-11-13;Woerden;Het Klooster Theater;https://www.kloosterwoerden.nl;
2020-11-14;Brielle;BREStheater;https://www.brestheater.nl;
2020-11-14;Brielle;BREStheater;https://www.brestheater.nl;
2020-11-19;Amersfoort;Theater De Lieve Vrouw;https://www.lievevrouw.nl;
2020-11-19;Amersfoort;Theater De Lieve Vrouw;https://www.lievevrouw.nl;
2020-11-20;Noordwijk;De Muze;https://www.demuzenoordwijk.nl;
2020-11-20;Noordwijk;De Muze;https://www.demuzenoordwijk.nl;
2020-11-28;Amsterdam;De Kleine Komedie;https://www.dekleinekomedie.nl;
2020-11-28;Amsterdam;De Kleine Komedie;https://www.dekleinekomedie.nl;
2021-07-02;Heeswijk Dinther;De Kersouwe;https://kersouwe.nl/agenda/flip-noorman-zingt-leonard-cohen;XL
2021-07-10;Sommelsdijk;Hofstede Lust en Last;http://lustenlast.nl;DUO
2021-07-23;Waalwijk;Stadstuinsessies;https://www.deleest.nl/theater/stadstuin-sessies/23-07-2021-20-30/;DUO
2021-07-24;Alkmaar;Theater de Vest;https://theaterdevest.nl/tickets/seizoen-2020-2021/zomer-op-het-plein-flip-noorman-zingt-leonard-cohen/;XL
2021-09-09;Breda;Chassé Theater;https://www.chasse.nl/programma/974/Flip_Noorman/zingt_Leonard_Cohen;
2021-09-11;Zeist;Oosterkerk;https://podium-beaufort.nl/evenementen/flip-noorman-11-sep/;UITVERKOCHT
2021-09-17;Hoofddorp;Schouwburg de Meerse;https://www.demeerse.nl/agenda/flip-noorman/;
2021-09-18;Oss;De Lievekamp;https://www.lievekamp.nl;
2021-09-23;Amersfoort;De Lieve Vrouw;https://lievevrouw.nl/producties/theater/nov-2021/flip-noorman-zingt-leonard-cohen/;
2021-09-24;Gramsbergen;Bostheater;https://www.voorveghter.nl/programma/zingt-leonard-cohen;
2021-10-01;Roosendaal;De Kring;https://www.dekringroosendaal.nl/agenda/97/Flip_Noorman/zingt_Leonard_Cohen/;
2021-10-02;Capelle aan den Ijssel;Isala;https://www.isalatheater.nl/agenda;
2021-10-07;Noordwijk;De Muze;https://theaterdemuze.nl;
2021-10-08;Heerenveen;Posthuis Theater;https://www.posthuistheater.nl/agenda/1641/Flip_Noorman_en_De_Noormannen/Flip_Noorman_zingt_Cohen;
2021-10-09;Abcoude;Theater Piet Mondriaan;https://theaterpietmondriaan.nl/voorstelling/?id=3305;
2021-10-10;Zwolle;Schouwburg Odeon;https://zwolsetheaters.nl/programma/flip-noorman-zingt-leonard-cohen;
2021-10-13;Winschoten;Cultuurhuis de Klinker;https://www.indeklinker.nl;
2021-10-15;Amstelveen;Cultuurcentrum Griffioen;https://griffioen.vu.nl/voorstellingen/;
2021-10-22;Nijkerk;Theater de Breede Beek;;
2021-10-28;Raalte;Hoftheater;https://www.hoftheater.nl/programma/performance?performanceId=601&Flip-Noorman-Zingt-Leonard-Cohen;UITVERKOCHT
2021-10-29;Amerongen;Cultuurhuis;;
2021-10-30;Brielle;BREStheater;https://www.brestheater.nl/voorstelling/seizoen-20202021.html;
2021-10-31;Haarlem;Philharmonie;https://www.theater-haarlem.nl/programma/17737//Flip_Noorman_zingt_Leonard_Cohen;UITVERKOCHT
2021-11-01;Lisse;Theater Floralis;https://www.floralislisse.nl/movies/692/17/flip_noorman_-_flip_noorman_zingt_leonard_cohen;
2021-11-05;Woerden;Het Kloostertheater;https://www.kloosterwoerden.nl;
2021-11-06;Eindhoven ;muziekgebouw;https://www.muziekgebouweindhoven.nl/nl/agenda/3029/Hommage_aan_de_grootheid/_Flip_Noorman_zingt_Leonard_Cohen_/;
2021-11-10;Den Haag;Theater Diligentia;https://www.diligentia-pepijn.nl;
2021-11-13;Amersfoort;Theater de Lieve Vrouw; https://lievevrouw.nl/producties/theater/nov-2021/flip-noorman-zingt-leonard-cohen/;
2021-11-19;Voorburg;Theater Ludens;https://theaterludens.nl/voorstellingen/flip-noorman-zingt-leonard-cohen/;
2021-11-20;Leiden;Leidse Schouwburg;https://leidseschouwburg-stadsgehoorzaal.nl/voorstelling/flip-noorman-zingt-leonard-cohen;
2021-11-26;Purmerend;Theater de Purmaryn;https://depurmaryn.nl/programma-2122/flip-noorman-zingt-leonard-cohen/;
2021-11-28;Amsterdam;De Kleine Komedie;https://www.dekleinekomedie.nl/agenda/1829/Flip_Noorman_zingt_Cohen_reprise_/FLIP_NOORMAN;
1 date city venue link flags
2 2019-08-30 Ede Cultura PREVIEW
3 2019-09-06 Alkmaar TAQA Theater De Vest PREVIEW
4 2019-09-07 Naaldwijk WestlandTheater De Naald PREVIEW
5 2019-09-27 Naaldwijk WestlandTheater De Naald https://www.westlandtheater.nl/programma/3429/Flip_en_De_Noormannen/Flip_Noorman_zingt_Leonard_Cohen_try_out_/ TRYOUT
6 2019-09-28 Den Haag PEPER festival https://denhaag.com/nl/event/109470/peper SOLO
7 2019-10-04 Gorinchem 't Pand http://theaterpand.nl/2019-2020/voorstellingen_okt.php TRYOUT,UITVERKOCHT
8 2019-10-05 Enschede De Kleine Willem https://www.wilminktheater.nl/programma/!/4971/flip-noorman/flip-noorman-zingt-leonard-cohen/ TRYOUT
9 2019-10-12 Almelo Theater HOF https://www.hof88.nl/theater/flip-noorman-zingt-leonard-cohen-flip-noorman/12-10-2019-20-15/ TRYOUT,XL
10 2019-10-19 Alkmaar TAQA Theater De Vest https://theaterdevest.nl/tickets/seizoen-2019-2020/flip-noorman-flip-noorman-zingt-leonard-cohen/ TRYOUT,XL,UITVERKOCHT
11 2019-10-20 Rotterdam Kantine Walhalla https://walhalla.stager.nl/web/tickets/274249 PREMIERE,XL
12 2019-10-27 Oosterhout Theater de Bussel https://www.theaterdebussel.nl/programma/2319/Zingt_Leonard_Cohen/Flip_Noorman/
13 2019-11-02 Oisterwijk Cultuurcentrum de Tiliander https://getaticket.nl/tiliander/bestellen/s2045
14 2019-11-03 Alkmaar Vest in de stad festival https://theaterdevest.nl SOLO
15 2019-11-07 Meppel Schouwburg Ogterop https://www.schouwburgogterop.nl/bestel/3185 UITVERKOCHT
16 2019-11-08 Enkhuizen De Drommedaris https://tickets.drom.nl/shop/tickets.php?showid=544 UITVERKOCHT
17 2019-11-16 Amsterdam De Meervaart https://www.meervaart.nl/theater/programma/details/611/flip-noorman-flip-noorman-zingt-leonard-cohen UITVERKOCHT
18 2019-11-23 Weesp City of Wesopa https://wesopa.nl/city/agenda/ UITVERKOCHT
19 2019-11-30 Houten Theater Aan De Slinger UITVERKOCHT
20 2019-12-07 Ede Cultura https://www.cultura-ede.nl/theater/agenda/flip-noorman--leonard-cohen.aspx XL, UITVERKOCHT
21 2019-12-13 Diemen Theater De Omval https://www.theaterdeomval.nl/voorstellingen/?id=1220 UITVERKOCHT
22 2019-12-18 Zoetermeer Stadstheater https://www.stadstheater.nl/s73964/Flip_Noorman_Flip_Noorman_zingt_Leonard_Cohen UITVERKOCHT
23 2019-12-19 Hoofddorp Het Oude Raadhuis https://hetcultuurgebouw.ticketmatic.com/addevent.php?a=cvdbQmUEQ3U&e=RH26sUZzeik&s=80cswBbInpo&l=nl&_ga=2.6726582.546457680.1559242849-850583459.1523895503 UITVERKOCHT
24 2019-12-20 Nieuwegein DE KOM https://www.dekom.nl/agenda/3661/Flip_Noorman/Flip_Noorman_zingt_Leonard_Cohen/ UITVERKOCHT
25 2019-12-28 Veghel De Blauwe Kei https://www.blauwekei.nl/programma/4443/Zingt_Leonard_Cohen/Flip_Noorman/?type=show UITVERKOCHT
26 2020-01-10 Alphen aan den Rijn Theater Castellum https://theatercastellum.nl/s72834/Flip_Noorman_Zingt_Leonard_Cohen UITVERKOCHT
27 2020-01-11 Gouda De Goudse Schouwburg UITVERKOCHT
28 2020-01-12 Ritthem Theater de Verwachting https://tickets.theatersaanzee.com/nl-NL/Show/Details/Flip-Noorman-Flip-Noorman-zingt-Leonard-Cohen-12-jan-24163 UITVERKOCHT
29 2020-01-17 Deventer Deventer Schouwburg https://apps.ticketmatic.com/widgets/deventer_schouwburg/addtickets?edit=yes&event=14523&extraevents=14521&flow=basketwithcheckout&l=nl&oncompletion=orderdetail&panels=customer,delivery,payment,voucher&reservemoretickets=yes&returnurl=https://deventerschouwburg.nl&saleschannelid=2&skinid=1&withauthentication=no&accesskey=315dbd6be362a7ea0d5bd731&signature=d32b335aee3726b15f88cf80c5cf8342e83fd8bb58db59a3eb2c6b82de82807f&_ga=2.214948382.86549655.1559243304-1344454272.1559243304#!/addtickets UITVERKOCHT
30 2020-01-23 Gouda De Goudse Schouwburg https://www.goudseschouwburg.nl/voorstellingen/3958//Flip_Noorman_zingt_Leonard_Cohen/ UITVERKOCHT
31 2020-01-25 Vianen Theater Vianen https://www.theatervianen.nl/seizoen-2019-2020/flip-noorman-zingt-leonard-cohen/ UITVERKOCHT
32 2020-01-29 Beusichem Het Heerenlogement https://theaterheerenlogement.nl/voorstellingen/?hilite=%27flip%27%2C%27noorman%27 UITVERKOCHT
33 2020-02-01 Waalwijk Theater de Leest https://www.deleest.nl/bestel/6227 UITVERKOCHT
34 2020-02-06 Emmeloord Theater 't Voorhuys https://www.theater-voorhuys.nl/agenda/4944/zingt_Leonard_Cohen/Flip_Noorman/?type=show UITVERKOCHT
35 2020-02-08 Utrecht Stadsschouwburg https://tickets.stadsschouwburg-utrecht.nl/nl/perf/2019-0208B1 XL,UITVERKOCHT
36 2020-02-13 Leeuwarden De Harmonie https://apps.ticketmatic.com/widgets/de_harmonie/addtickets?event=26655&skinid=10000&returnurl=https%3A%2F%2Fharmonie.nl%2Fn%2Fagenda_return_tm&edit=yes&l=nl&extraevents=26921&reservemoretickets=yes&withauthentication=no&oncompletion=orderdetail&flow=basketwithcheckout&accesskey=2ea02106e4411f55e0e2e681&signature=dd3929be39d8cb47cb53d76a4d376424951322baf3981963cb263a83568d244c&_ga=2.138838516.672648337.1568033858-1929889804.1568033858#!/addtickets XL,UITVERKOCHT
37 2020-02-21 Dordrecht Energiehuis, Machine https://apps.ticketmatic.com/widgets/kunstmin/addtickets?event=12495&flow=basketwithcheckout&l=nl&oncompletion=orderdetail&returnurl=https%3A%2F%2Fwww.kunstmin.nl%2Fprogramma%2Fflip-noorman%2F&saleschannelid=10000&skinid=1&accesskey=a03da7ecff7ea4ac81408d6b&signature=f8c5f334acdfe6a6e037711569fc24617d558fefdfc919f900bd2bab0ccfe674#!/addtickets UITVERKOCHT
38 2020-03-09 Amsterdam De Kleine Komedie https://www.dekleinekomedie.nl/mijntheater/winkelmandje/ XL,UITVERKOCHT
39 2020-09-03 Rotterdam Batavierhuis https://www.batavierhuis.nl/concerten/
40 2020-09-12 Borne Kulturhus De Bijenkorf https://www.kulturhusborne.nl/
41 2020-09-12 Borne Kulturhus De Bijenkorf https://www.kulturhusborne.nl/
42 2020-09-24 Apeldoorn Theater Orpheus https://www.orpheus.nl
43 2020-10-01 Schiedam Theater aan de Schie https://www.theateraandeschie.nl
44 2020-10-02 Barendrecht Theater Het Kruispunt https://www.theaterhetkruispunt.nl
45 2020-10-04 Zeist Oosterkerk
46 2020-10-09 Almere Kunstlinie Almere Flevoland https://www.kaf.nl
47 2020-10-09 Almere Kunstlinie Almere Flevoland https://www.kaf.nl
48 2020-10-10 Coevorden Theater Hofpoort https://www.theaterhofpoort.nl
49 2020-10-10 Coevorden Theater Hofpoort https://www.theaterhofpoort.nl
50 2020-10-11 Den Bosch Verkadefabriek https://www.verkadefabriek.nl
51 2020-10-11 Den Bosch Verkadefabriek https://www.verkadefabriek.nl
52 2020-10-16 Breda Chassé Theater https://www.chasse.nl
53 2020-10-17 Hoofddorp Schouwburg De Meerse https://www.demeerse.nl
54 2020-10-17 Hoofddorp Schouwburg De Meerse https://www.demeerse.nl
55 2020-10-22 Capelle a/d IJssel Isala Theater https://www.isalatheater.nl
56 2020-10-24 Purmerend Theater de Purmaryn https://www.depurmaryn.nl
57 2020-10-24 Purmerend Theater de Purmaryn https://www.depurmaryn.nl
58 2020-10-25 Zeist Oosterkerk
59 2020-10-31 Roosendaal De Kring https://www.dekringroosendaal.nl
60 2020-11-01 Haarlem Philharmonie https://www.theater-haarlem.nl
61 2020-11-05 Oss De Lievekamp https://www.lievekamp.nl
62 2020-11-07 Eindhoven MG Frits Philips https://www.muziekgebouweindhoven.nl
63 2020-11-07 Eindhoven MG Frits Philips https://www.muziekgebouweindhoven.nl
64 2020-11-08 Zwolle Odeon, Hanzestrohmzaal https://www.zwolsetheaters.nl
65 2020-11-13 Woerden Het Klooster Theater https://www.kloosterwoerden.nl
66 2020-11-14 Brielle BREStheater https://www.brestheater.nl
67 2020-11-14 Brielle BREStheater https://www.brestheater.nl
68 2020-11-19 Amersfoort Theater De Lieve Vrouw https://www.lievevrouw.nl
69 2020-11-19 Amersfoort Theater De Lieve Vrouw https://www.lievevrouw.nl
70 2020-11-20 Noordwijk De Muze https://www.demuzenoordwijk.nl
71 2020-11-20 Noordwijk De Muze https://www.demuzenoordwijk.nl
72 2020-11-28 Amsterdam De Kleine Komedie https://www.dekleinekomedie.nl
73 2020-11-28 Amsterdam De Kleine Komedie https://www.dekleinekomedie.nl
74 2021-07-02 Heeswijk Dinther De Kersouwe https://kersouwe.nl/agenda/flip-noorman-zingt-leonard-cohen XL
75 2021-07-10 Sommelsdijk Hofstede Lust en Last http://lustenlast.nl DUO
76 2021-07-23 Waalwijk Stadstuinsessies https://www.deleest.nl/theater/stadstuin-sessies/23-07-2021-20-30/ DUO
77 2021-07-24 Alkmaar Theater de Vest https://theaterdevest.nl/tickets/seizoen-2020-2021/zomer-op-het-plein-flip-noorman-zingt-leonard-cohen/ XL
78 2021-09-09 Breda Chassé Theater https://www.chasse.nl/programma/974/Flip_Noorman/zingt_Leonard_Cohen
79 2021-09-11 Zeist Oosterkerk https://podium-beaufort.nl/evenementen/flip-noorman-11-sep/ UITVERKOCHT
80 2021-09-17 Hoofddorp Schouwburg de Meerse https://www.demeerse.nl/agenda/flip-noorman/
81 2021-09-18 Oss De Lievekamp https://www.lievekamp.nl
82 2021-09-23 Amersfoort De Lieve Vrouw https://lievevrouw.nl/producties/theater/nov-2021/flip-noorman-zingt-leonard-cohen/
83 2021-09-24 Gramsbergen Bostheater https://www.voorveghter.nl/programma/zingt-leonard-cohen
84 2021-10-01 Roosendaal De Kring https://www.dekringroosendaal.nl/agenda/97/Flip_Noorman/zingt_Leonard_Cohen/
85 2021-10-02 Capelle aan den Ijssel Isala https://www.isalatheater.nl/agenda
86 2021-10-07 Noordwijk De Muze https://theaterdemuze.nl
87 2021-10-08 Heerenveen Posthuis Theater https://www.posthuistheater.nl/agenda/1641/Flip_Noorman_en_De_Noormannen/Flip_Noorman_zingt_Cohen
88 2021-10-09 Abcoude Theater Piet Mondriaan https://theaterpietmondriaan.nl/voorstelling/?id=3305
89 2021-10-10 Zwolle Schouwburg Odeon https://zwolsetheaters.nl/programma/flip-noorman-zingt-leonard-cohen
90 2021-10-13 Winschoten Cultuurhuis de Klinker https://www.indeklinker.nl
91 2021-10-15 Amstelveen Cultuurcentrum Griffioen https://griffioen.vu.nl/voorstellingen/
92 2021-10-22 Nijkerk Theater de Breede Beek
93 2021-10-28 Raalte Hoftheater https://www.hoftheater.nl/programma/performance?performanceId=601&Flip-Noorman-Zingt-Leonard-Cohen UITVERKOCHT
94 2021-10-29 Amerongen Cultuurhuis
95 2021-10-30 Brielle BREStheater https://www.brestheater.nl/voorstelling/seizoen-20202021.html
96 2021-10-31 Haarlem Philharmonie https://www.theater-haarlem.nl/programma/17737//Flip_Noorman_zingt_Leonard_Cohen UITVERKOCHT
97 2021-11-01 Lisse Theater Floralis https://www.floralislisse.nl/movies/692/17/flip_noorman_-_flip_noorman_zingt_leonard_cohen
98 2021-11-05 Woerden Het Kloostertheater https://www.kloosterwoerden.nl
99 2021-11-06 Eindhoven muziekgebouw https://www.muziekgebouweindhoven.nl/nl/agenda/3029/Hommage_aan_de_grootheid/_Flip_Noorman_zingt_Leonard_Cohen_/
100 2021-11-10 Den Haag Theater Diligentia https://www.diligentia-pepijn.nl
101 2021-11-13 Amersfoort Theater de Lieve Vrouw https://lievevrouw.nl/producties/theater/nov-2021/flip-noorman-zingt-leonard-cohen/
102 2021-11-19 Voorburg Theater Ludens https://theaterludens.nl/voorstellingen/flip-noorman-zingt-leonard-cohen/
103 2021-11-20 Leiden Leidse Schouwburg https://leidseschouwburg-stadsgehoorzaal.nl/voorstelling/flip-noorman-zingt-leonard-cohen
104 2021-11-26 Purmerend Theater de Purmaryn https://depurmaryn.nl/programma-2122/flip-noorman-zingt-leonard-cohen/
105 2021-11-28 Amsterdam De Kleine Komedie https://www.dekleinekomedie.nl/agenda/1829/Flip_Noorman_zingt_Cohen_reprise_/FLIP_NOORMAN

0
data/config/.keep Normal file
View File

0
data/db/.keep Normal file
View File

18
data/loveit_tour.csv Normal file
View File

@ -0,0 +1,18 @@
date;city;venue;link;flags
2022-04-02;Rotterdam;Batavierhuis 2 to 2 fest (duo show met Vera van der Bie);https://www.batavierhuis.nl/2-to-2-fest/;
2022-04-03;Rotterdam;Heerenhuys (duo show met Vera van der Bie);https://www.heerenhuyskamerconcerten.nl/voorstelling/love-it-door-flip-noorman/;
2022-04-30;Amsterdam;Mascini (duo show met Vera van der Bie);https://www.theatermascini.nl/theater/126-flip-noorman?datum=20220430;
2022-05-06;Spijkenisse;Theater de Stoep;https://theaterdestoep.nl/voorstelling/flip-noorman-2122;
2022-05-11;Deventer;Deventer Schouwburg;https://deventerschouwburg.nl/programma/flip-noorman-love-it;
2022-05-13;Meppel;Schouwburg Ogterop;https://www.schouwburgogterop.nl/programma/flip-noorman-love-it/13-05-2022-20-15;
2022-05-20;Wageningen;Junushoff Theater;https://www.junushoff.nl/programma/7074/Flip_Noorman/Love_it_;
2022-05-21;Naarden Vesting;Cultuurcentrum deMess;;
2022-05-26;Amsterdam;Theater Bellevue;https://www.theaterbellevue.nl/agenda/3639/Flip_Noorman/Love_it_;
2022-05-27;Amsterdam;Theater Bellevue;https://www.theaterbellevue.nl/agenda/3639/Flip_Noorman/Love_it_;
2022-05-28;Amsterdam;Theater Bellevue;https://www.theaterbellevue.nl/agenda/3639/Flip_Noorman/Love_it_;
2022-06-01;Zoetermeer;Stadstheater;https://stadstheater.nl/s81105/Flip_Noorman_Love_it;
2022-06-02;Amsterdam;De Meervaart;https://www.meervaart.nl/theater/programma/details/1987;
2022-06-03;Den Haag;Theater Pepijn;https://www.diligentia-pepijn.nl/agenda/3785/Love_It_/Flip_Noorman;
2022-06-15;Nijmegen;Concertgebouw;https://www.stadsschouwburgendevereeniging.nl/programma/5854/Flip_Noorman/Love_it_;
2022-06-17;Oosterhout;De Bussel;;
2022-06-18;Rotterdam;Kantine Walhalla (première);https://www.theaterwalhalla.nl/voorstelling/flip-noorman-love-it/;
1 date city venue link flags
2 2022-04-02 Rotterdam Batavierhuis 2 to 2 fest (duo show met Vera van der Bie) https://www.batavierhuis.nl/2-to-2-fest/
3 2022-04-03 Rotterdam Heerenhuys (duo show met Vera van der Bie) https://www.heerenhuyskamerconcerten.nl/voorstelling/love-it-door-flip-noorman/
4 2022-04-30 Amsterdam Mascini (duo show met Vera van der Bie) https://www.theatermascini.nl/theater/126-flip-noorman?datum=20220430
5 2022-05-06 Spijkenisse Theater de Stoep https://theaterdestoep.nl/voorstelling/flip-noorman-2122
6 2022-05-11 Deventer Deventer Schouwburg https://deventerschouwburg.nl/programma/flip-noorman-love-it
7 2022-05-13 Meppel Schouwburg Ogterop https://www.schouwburgogterop.nl/programma/flip-noorman-love-it/13-05-2022-20-15
8 2022-05-20 Wageningen Junushoff Theater https://www.junushoff.nl/programma/7074/Flip_Noorman/Love_it_
9 2022-05-21 Naarden Vesting Cultuurcentrum deMess
10 2022-05-26 Amsterdam Theater Bellevue https://www.theaterbellevue.nl/agenda/3639/Flip_Noorman/Love_it_
11 2022-05-27 Amsterdam Theater Bellevue https://www.theaterbellevue.nl/agenda/3639/Flip_Noorman/Love_it_
12 2022-05-28 Amsterdam Theater Bellevue https://www.theaterbellevue.nl/agenda/3639/Flip_Noorman/Love_it_
13 2022-06-01 Zoetermeer Stadstheater https://stadstheater.nl/s81105/Flip_Noorman_Love_it
14 2022-06-02 Amsterdam De Meervaart https://www.meervaart.nl/theater/programma/details/1987
15 2022-06-03 Den Haag Theater Pepijn https://www.diligentia-pepijn.nl/agenda/3785/Love_It_/Flip_Noorman
16 2022-06-15 Nijmegen Concertgebouw https://www.stadsschouwburgendevereeniging.nl/programma/5854/Flip_Noorman/Love_it_
17 2022-06-17 Oosterhout De Bussel
18 2022-06-18 Rotterdam Kantine Walhalla (première) https://www.theaterwalhalla.nl/voorstelling/flip-noorman-love-it/

99
db.go Normal file
View File

@ -0,0 +1,99 @@
package main
import (
"log"
"path"
"time"
"github.com/gofrs/uuid"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
const (
PRE_ORDER_STATE_CREATED = "CREATED"
)
func initDB() (*gorm.DB, error) {
log.Printf("Connect to DB on path: %v", path.Join(ROOT_DIR, "data/db/data.db"))
db, err := gorm.Open("sqlite3", path.Join(ROOT_DIR, "data/db/data.db"))
// Enable Logger, show detailed log
db.LogMode(true)
return db, err
}
type Product struct {
gorm.Model
Name string
Image string
Description string
Price int
}
type Item struct {
gorm.Model
ProductID uint
Product Product
PreOrderID uuid.UUID
PreOrder PreOrder
}
type MolliePayment struct {
gorm.Model
MolliePaymentID string
Amount int
Status string
PreOrderID uuid.UUID
PreOrder PreOrder
}
type PreOrder struct {
ID uuid.UUID `sql:"type:string;primary_key;"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time `sql:"index"`
Name string
Email string
Items []Item
Address string
Postcode string
City string
Status string
MolliePayments []MolliePayment
}
func (base *PreOrder) BeforeCreate(scope *gorm.Scope) error {
uuid, err := uuid.NewV4()
if err != nil {
return err
}
return scope.SetColumn("ID", uuid.String())
}
func (po *PreOrder) CalcTotal() int {
total := 0
for _, i := range po.Items {
total += i.Product.Price
}
return total
}
func GetDB() *gorm.DB {
db, err := initDB()
if err != nil {
panic("failed to connect database")
}
// Migrate the schema
db.AutoMigrate(
&Product{},
&Item{},
&PreOrder{},
&MolliePayment{},
)
return db
}

0
dist/.keep vendored Normal file
View File

196
events.go Normal file
View File

@ -0,0 +1,196 @@
package main
import (
"bufio"
"encoding/csv"
"encoding/json"
"fmt"
"io"
"log"
"os"
"path"
"strings"
"time"
)
type MyTime time.Time
func (mt *MyTime) UnmarshalJSON(b []byte) error {
s := strings.Trim(string(b), "\"")
t, err := time.Parse("2006-01-02", s)
if err != nil {
return err
}
*mt = MyTime(t)
return nil
}
func ParseDate(b string) MyTime {
s := strings.Trim(b, "\"")
t, err := time.Parse("2006-01-02", s)
if err != nil {
return MyTime{}
}
return MyTime(t)
}
func (mt *MyTime) ParseDate(b []byte) error {
s := strings.Trim(string(b), "\"")
t, err := time.Parse("2006-01-02", s)
if err != nil {
return err
}
*mt = MyTime(t)
return nil
}
func (mt MyTime) MarshalJSON() ([]byte, error) {
return json.Marshal(mt)
}
var months = map[string]string{
"1": "Jan",
"2": "Feb",
"3": "Mrt",
"4": "Apr",
"5": "Mei",
"6": "Jun",
"7": "Jul",
"8": "Aug",
"9": "Sept",
"10": "Okt",
"11": "Nov",
"12": "Dec",
}
var monthsLong = map[string]string{
"1": "Januari",
"2": "Februari",
"3": "Maart",
"4": "April",
"5": "Mei",
"6": "Juni",
"7": "July",
"8": "Augustus",
"9": "September",
"10": "Oktober",
"11": "November",
"12": "December",
}
func (mt MyTime) Format() string {
t := time.Time(mt)
return fmt.Sprintf("%v %v %v", t.Format("02"), months[t.Format("1")], t.Format("2006"))
}
func (mt MyTime) Title() string {
t := time.Time(mt)
return fmt.Sprintf("%v %v", monthsLong[t.Format("1")], t.Format("2006"))
}
type EventFlags struct {
Soldout bool
Tryout bool
Premiere bool
Preview bool
XL bool
Solo bool
Duo bool
}
type Event struct {
Date MyTime `json:"date"`
Venue string `json:"venue"`
City string `json:"city"`
Link string `json:"link"`
Flags EventFlags `json:"flags"`
}
func (e *Event) SetFlags(flags string) {
for _, flag := range strings.Split(flags, ",") {
switch strings.Trim(strings.ToLower(flag), " \t") {
case "uitverkocht":
e.Flags.Soldout = true
case "tryout":
e.Flags.Tryout = true
case "preview":
e.Flags.Preview = true
case "premiere":
e.Flags.Premiere = true
case "solo":
e.Flags.Solo = true
case "xl":
e.Flags.XL = true
case "duo":
e.Flags.Duo = true
}
}
}
func getEvents(tour string) *[][]Event {
var events [][]Event
f, err := os.Open(path.Join(ROOT_DIR, fmt.Sprintf("data/%s_tour.csv", tour)))
if err != nil {
log.Fatal(err)
}
defer f.Close()
eventsAll := []Event{}
reader := csv.NewReader(bufio.NewReader(f))
reader.Comma = ';'
now := time.Now()
for {
line, error := reader.Read()
if error == io.EOF {
break
} else if error != nil {
log.Fatal(error)
}
if line[0] == "date" {
continue
}
if now.After(
(time.Time(ParseDate(line[0]))).Local().Add(time.Hour * time.Duration(24)),
) {
continue
}
event := Event{
Date: ParseDate(line[0]),
Venue: line[2],
City: line[1],
Link: line[3],
}
event.SetFlags(line[4])
eventsAll = append(eventsAll, event)
}
months := []string{}
eventsByMonth := map[string][]Event{}
for _, event := range eventsAll {
m := time.Time(event.Date).Format("01")
if _, ok := eventsByMonth[m]; ok {
eventsByMonth[m] = append(eventsByMonth[m], event)
} else {
months = append(months, m)
eventsByMonth[m] = []Event{event}
}
}
for _, m := range months {
events = append(events, eventsByMonth[m])
}
return &events
}

BIN
flipnew Executable file

Binary file not shown.

13
go.mod Normal file
View File

@ -0,0 +1,13 @@
module flipnoorman.nl/cohen
go 1.16
require (
github.com/VictorAvelar/mollie-api-go v1.6.6
github.com/gin-gonic/gin v1.7.7 // indirect
github.com/gofrs/uuid v4.0.0+incompatible
github.com/jinzhu/gorm v1.9.16
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/yaml.v2 v2.4.0
)

422
go.sum Normal file
View File

@ -0,0 +1,422 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/VictorAvelar/mollie-api-go v1.6.6 h1:VWP+k0PRt6esWO8qbCMO/ZvIRDrhBonkt0kxYEnGugk=
github.com/VictorAvelar/mollie-api-go v1.6.6/go.mod h1:ndE8MbwgUZoq827yh0ppyYncii5jZLa0acL6j5iqZyk=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA=
github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs=
github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o=
github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA=
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201002202402-0a1ea396d57c/go.mod h1:iQL9McJNjoIa5mjH6nYTCTZXUN6RP+XW3eib7Ya3XcI=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

58
gulpfile.js Normal file
View File

@ -0,0 +1,58 @@
const gulp = require('gulp');
const sass = require('gulp-sass');
const webpack = require('webpack');
const webpackStream = require('webpack-stream');
const config = require('./webpack.config');
const cleanCSS = require('gulp-clean-css');
const autoprefixer = require('gulp-autoprefixer');
const newer = require('gulp-newer');
const fontsSrc = './src/fonts'
const fontsDest = './dist/fonts'
const imgSrc = './src/img'
const imgDest = './dist/img'
const sassTask = () => {
return gulp.src('./src/sass/**/*.scss')
.pipe(sass().on('error', sass.logError))
.pipe(autoprefixer({
browsers: ['last 2 versions', 'ie > 8'],
cascade: false
}))
.pipe(cleanCSS({compatibility: 'ie8'}))
.pipe(gulp.dest('./dist/css'));
}
const jsTask =() => {
return gulp.src('./src/js/shared.js')
.pipe(webpackStream(config, webpack))
.pipe(gulp.dest('./dist/js/'));
}
const fontsTask = () => {
return gulp.src(`./${fontsSrc}/**`)
.pipe(newer(fontsDest))
.pipe(gulp.dest(fontsDest));
}
const imgTask = () => {
return gulp.src(`./${imgSrc}/**`)
// .pipe(newer(imgDest))
.pipe(gulp.dest(imgDest));
}
const watch = () => {
gulp.watch('./src/sass/**/*.scss', sassTask);
gulp.watch('./src/fonts/**', fontsTask);
gulp.watch('./src/img/**', imgTask);
}
const build = gulp.parallel(jsTask, gulp.series(sassTask, fontsTask, imgTask));
module.exports = {
default: gulp.parallel(jsTask, gulp.series(sassTask, fontsTask, imgTask, watch)),
build
}

7
init.sh Executable file
View File

@ -0,0 +1,7 @@
#! /bin/sh
echo "Enter fqdn:"
read host_name
sed "s#{{root_dir}}#$1#g;s#{{host_name}}#$2#g" nginx/template.conf > nginx/flip_cohen.conf

206
main.go Normal file
View File

@ -0,0 +1,206 @@
package main
import (
"fmt"
"html/template"
"io/ioutil"
"log"
"net"
"net/http"
"os"
"os/signal"
"path"
"time"
"github.com/VictorAvelar/mollie-api-go/mollie"
"gopkg.in/yaml.v2"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
)
type Config struct {
MollieToken string `yaml:"mollie_token"`
MollieTesting bool `yaml:"mollie_testing"`
MollieWebhook string `yaml:"mollie_webhook"`
MollieRedirectURL string `yaml:"mollie_redirect_url"`
MailServer string `yaml:"mail_server"`
MailPort int `yaml:"mail_port"`
MailUser string `yaml:"mail_user"`
MailPass string `yaml:"mail_pass"`
FromAddr string `yaml:"from_addr"`
BCC string `yaml:"bcc"`
}
var config Config
var mollieClient *mollie.Client
var ROOT_DIR string
func notFound(w http.ResponseWriter, r *http.Request) error {
w.WriteHeader(http.StatusNotFound)
t, err := template.ParseFiles(path.Join(ROOT_DIR, "templates/404.html"))
if err != nil {
return err
}
return t.Execute(w, nil)
}
func index(c *gin.Context) {
events := getEvents("loveit")
c.HTML(http.StatusOK, "index.html", map[string]interface{}{
"events": events,
"nowYear": time.Now().Format("2006"),
})
}
func loveIt(c *gin.Context) {
c.Redirect(http.StatusFound, "/")
}
func albumsHandler(c *gin.Context) {
albums := getAlbums()
c.HTML(http.StatusOK, "albums.html", map[string]interface{}{
"nowYear": time.Now().Format("2006"),
"albums": albums,
})
}
func handle404(c *gin.Context) {
c.HTML(http.StatusOK, "404.html", map[string]interface{}{})
}
func songsHandler(c *gin.Context) {
albums := getAlbums()
fmt.Println(albums)
albumTitle := c.Param("album")
songTitle := c.Param("song")
album, err := getAlbum(albums, albumTitle)
if err != nil {
c.HTML(http.StatusNotFound, "404.html", map[string]interface{}{})
return
}
song, err := getSong(album, songTitle)
if err != nil {
c.HTML(http.StatusNotFound, "404.html", map[string]interface{}{})
return
}
c.HTML(http.StatusOK, "song.html", map[string]interface{}{
"nowYear": time.Now().Format("2006"),
"album": album,
"song": song,
"albumTitle": albumTitle,
})
}
func createSocket(s string) net.Listener {
os.Remove(s)
log.Println("Creating UNIX socket:", s)
sock, err := net.Listen("unix", s)
if err != nil {
panic(err)
}
err = os.Chmod(s, 0777)
if err != nil {
panic(err)
}
return sock
}
func getDB(c *gin.Context) *gorm.DB {
item, _ := c.Get("db")
db := item.(*gorm.DB)
return db
}
func main() {
if len(os.Args) > 1 {
ROOT_DIR = os.Args[1]
} else {
ROOT_DIR = "/var/www/flipnew"
}
r := gin.New()
r.SetFuncMap(template.FuncMap{
"formatMoney": func(cents int) string {
return fmt.Sprintf("€%.2f", float64(float64(cents)/100))
},
})
log.Printf("Running from with app root dir: %s\n", ROOT_DIR)
db := GetDB()
defer db.Close()
configPath := path.Join(ROOT_DIR, "data/config/config.yaml")
configBytes, err := ioutil.ReadFile(configPath)
if err != nil {
panic(fmt.Sprintf("Can't open config file at %s; %v", configPath, err))
}
if err := yaml.Unmarshal([]byte(configBytes), &config); err != nil {
panic(fmt.Sprintf("Can't parse config file at %s; %v", configPath, err))
}
if mollieClient, err = initMollie(); err != nil {
panic(err)
}
r.LoadHTMLGlob(path.Join(ROOT_DIR, "templates/*.html"))
r.Use(func(c *gin.Context) {
c.Set("db", db)
c.Next()
})
r.GET("/", index)
r.GET("/albums", albumsHandler)
r.GET("/albums/:album/:song", songsHandler)
r.GET("/love-it", loveIt)
r.GET("/preorder", preorderIndex)
r.POST("/preorder", postCreateOrder)
r.POST("/preorder/bestellen", postGetOrderInfo)
r.POST("/preorder/webhook", postMollieWebhook)
r.GET("/preorder/bedankt", getPreOrderThankYou)
r.POST("/preorder/retry/:orderid", postOrderRetry)
r.GET("/preorder/pending/:orderid", getPendingOrder)
r.NoRoute(handle404)
sockPath := path.Join(ROOT_DIR, "run/flip.sock")
sock := createSocket(sockPath)
server := http.Server{
Handler: r,
}
fmt.Println("Running...")
go func() {
log.Fatal(server.Serve(sock))
}()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
// Block until a signal is received.
<-c
fmt.Println("Stopping...")
os.Remove(path.Join(ROOT_DIR, "run/flip.sock"))
}

42
mollie.go Normal file
View File

@ -0,0 +1,42 @@
package main
import (
"fmt"
"os"
"github.com/VictorAvelar/mollie-api-go/mollie"
)
var ideal = mollie.PaymentMethod("ideal")
func createMolliePayment(preOrder PreOrder) (mollie.Payment, error) {
amount := preOrder.CalcTotal() + SHIPPING
return mollieClient.Payments.Create(mollie.Payment{
Amount: &mollie.Amount{
Currency: "EUR",
Value: fmt.Sprintf("%.2f", float64(amount)/float64(100)),
},
Description: fmt.Sprintf("Flip Noorman - Love It! | CD x %v + verzendkosten", len(preOrder.Items)),
Method: &ideal,
Metadata: map[string]interface{}{
"preorderID": preOrder.ID,
},
RedirectURL: fmt.Sprintf("%s/%v", config.MollieRedirectURL, preOrder.ID),
WebhookURL: config.MollieWebhook,
})
}
func initMollie() (*mollie.Client, error) {
// API token (`MOLLIE_API_TOKEN`) and the Organization token (`MOLLIE_ORG_TOKEN`)
os.Setenv("MOLLIE_API_TOKEN", config.MollieToken)
apiTokenClient, err := mollie.NewClient(nil, mollie.NewConfig(
config.MollieTesting,
config.MollieToken,
))
if err != nil {
return nil, err
}
return apiTokenClient, nil
}

37
nginx/template.conf Normal file
View File

@ -0,0 +1,37 @@
server {
listen 80;
listen [::]:80;
server_name {{host_name}};
client_max_body_size 20M;
#charset koi8-r;
# access_log /usr/local/var/log/nginx/{{host_name}}.access.log;
# error_log /usr/local/var/log/nginx/{{host_name}}.error.log;
location /static {
alias {{root_dir}}/dist;
gzip_static on;
expires max;
add_header Cache-Control public;
}
location /favicon {
return 404 "Not Found";
}
location /robots.txt {
return 404 "Not Found";
}
location / {
proxy_pass http://unix:/{{root_dir}}/run/flip.sock;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 5m;
}
}

25
package.json Normal file
View File

@ -0,0 +1,25 @@
{
"name": "cohen_site",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {},
"devDependencies": {
"babel-core": "^6.26.0",
"babel-loader": "^7.1.4",
"babel-preset-es2015": "^6.24.1",
"gulp": "^4.0.2",
"gulp-autoprefixer": "^6.1.0",
"gulp-clean-css": "^4.2.0",
"gulp-newer": "^1.4.0",
"gulp-sass": "^4.0.2",
"webpack": "^4.1.1",
"webpack-stream": "^4.0.2"
}
}

253
preorder.go Normal file
View File

@ -0,0 +1,253 @@
package main
import (
"bytes"
"fmt"
"html/template"
"log"
"net/http"
"path"
"time"
"github.com/gin-gonic/gin"
"gopkg.in/gomail.v2"
)
const SHIPPING = 250
func sendMail(preOrder PreOrder, config Config) {
tpl, err := template.ParseFiles(path.Join(ROOT_DIR, "templates/preorder.email"))
if err != nil {
panic(err)
}
m := gomail.NewMessage()
var w bytes.Buffer
data := map[string]interface{}{
"preOrder": preOrder,
}
tpl.Execute(&w, data)
m.SetHeader("From", config.FromAddr)
m.SetHeader("To", preOrder.Email)
m.SetAddressHeader("Bcc", config.BCC, "admin")
m.SetHeader("Subject", "Flip Noorman bestelling | Flip speelt cohen")
m.SetBody("text/html", w.String())
d := gomail.NewDialer(config.MailServer, config.MailPort, config.MailUser, config.MailPass)
// Send the email to Bob, Cora and Dan.
if err := d.DialAndSend(m); err != nil {
panic(err)
}
}
func preorderIndex(c *gin.Context) {
db := getDB(c)
products := []Product{}
db.Where("id = 2").Find(&products)
c.HTML(http.StatusOK, "preorder_index.html", map[string]interface{}{
"products": products,
"nowYear": time.Now().Format("2006"),
})
}
func postGetOrderInfo(c *gin.Context) {
db := getDB(c)
var order struct {
CD int `form:"product[2]"`
}
c.Bind(&order)
product := Product{}
db.Where("id = 2").Find(&product)
subtotal := product.Price * order.CD
shipping := SHIPPING
total := subtotal + shipping
c.HTML(http.StatusOK, "preorder_info.html", map[string]interface{}{
"orderCount": order.CD,
"product": product,
"subtotal": subtotal,
"shipping": shipping,
"total": total,
"error_": "",
})
}
func renderGetOrderInfoError(error_ string, count int, c *gin.Context) {
db := getDB(c)
product := Product{}
db.Where("id = 2").Find(&product)
subtotal := product.Price * count
shipping := SHIPPING
total := subtotal + shipping
c.HTML(http.StatusOK, "preorder_info.html", map[string]interface{}{
"orderCount": count,
"product": product,
"subtotal": subtotal,
"shipping": shipping,
"total": total,
"error_": error_,
})
}
func postCreateOrder(c *gin.Context) {
db := getDB(c)
products := []Product{}
db.Find(&products)
var order struct {
DVD int `form:"product_count"`
Name string `form:"name"`
Email string `form:"email"`
Address string `form:"address"`
Postcode string `form:"postcode"`
City string `form:"city"`
}
c.Bind(&order)
if order.Name == "" || order.Email == "" || order.Address == "" || order.Postcode == "" || order.City == "" || order.DVD < 0 {
renderGetOrderInfoError("Alle velden zijn verplicht", order.DVD, c)
return
}
preOrder := PreOrder{
Name: order.Name,
Email: order.Email,
Address: order.Address,
Postcode: order.Postcode,
City: order.City,
Status: PRE_ORDER_STATE_CREATED,
}
db.Create(&preOrder)
for i := 0; i < order.DVD; i++ {
db.Create(&Item{
ProductID: 2,
PreOrderID: preOrder.ID,
})
}
db.Preload("Items").Preload("Items.Product").Find(&preOrder)
payment, err := createMolliePayment(preOrder)
if err != nil {
log.Printf("[err] createMolliePayment: %v", err)
c.AbortWithError(500, fmt.Errorf("Er is iets fout gegaan..."))
return
}
molliePayment := MolliePayment{
MolliePaymentID: payment.ID,
Amount: preOrder.CalcTotal() + SHIPPING,
Status: payment.Status,
PreOrderID: preOrder.ID,
}
db.Create(&molliePayment)
c.Redirect(http.StatusFound, payment.Links.Checkout.Href)
}
func postMollieWebhook(c *gin.Context) {
db := getDB(c)
paymentID := c.Request.FormValue("id")
payment, err := mollieClient.Payments.Get(paymentID, nil)
if err != nil {
log.Printf("Error get payment from mollie; %v; %s", err, paymentID)
c.AbortWithError(500, fmt.Errorf("Deze bestelling is onbekend"))
return
}
molliePayment := &MolliePayment{}
if err := db.Preload("PreOrder").Where("mollie_payment_id = ?", paymentID).Find(&molliePayment).Error; err != nil {
log.Printf("Error get payment from db; %v; %s", err, paymentID)
c.AbortWithError(500, fmt.Errorf("Deze bestelling is onbekend"))
return
}
if payment.Status != molliePayment.Status {
molliePayment.Status = payment.Status
db.Save(&molliePayment)
if molliePayment.Status == "paid" {
sendMail(molliePayment.PreOrder, config)
}
}
c.Status(200)
}
func postOrderRetry(c *gin.Context) {
orderID := c.Param("orderid")
db := getDB(c)
preOrder := &PreOrder{}
if err := db.Preload("Items").Preload("Items.Product").Where("id = ?", orderID).Find(&preOrder).Error; err != nil {
c.AbortWithError(500, fmt.Errorf("Deze bestelling is onbekend"))
return
}
db.Find(&preOrder)
payment, err := createMolliePayment(*preOrder)
if err != nil {
c.AbortWithError(500, fmt.Errorf("Er is iets fout gegaan..."))
return
}
molliePayment := MolliePayment{
MolliePaymentID: payment.ID,
Amount: preOrder.CalcTotal() + SHIPPING,
Status: payment.Status,
PreOrderID: preOrder.ID,
}
db.Create(&molliePayment)
c.Redirect(http.StatusFound, payment.Links.Checkout.Href)
}
func getPendingOrder(c *gin.Context) {
orderID := c.Param("orderid")
db := getDB(c)
payments := []*MolliePayment{}
if err := db.Where("pre_order_id = ?", orderID).Order("created_at desc").Find(&payments).Error; err != nil {
c.AbortWithError(500, fmt.Errorf("Deze bestelling is onbekend"))
return
}
payment := payments[0]
if payment.Status == "paid" {
c.Redirect(http.StatusFound, "/preorder/bedankt")
return
}
c.HTML(http.StatusOK, "preorder_pending.html", map[string]interface{}{"payment": payment, "orderID": orderID})
}
func getPreOrderThankYou(c *gin.Context) {
c.HTML(http.StatusOK, "preorder_thankyou.html", nil)
}

16
preorder_test.go Normal file
View File

@ -0,0 +1,16 @@
package main
import "testing"
func TestSendMail(t *testing.T) {
config := Config{
MailServer: "smtp.transip.email",
MailPort: 465,
MailUser: "info@flipnoorman.nl",
MailPass: "XXXXX",
FromAddr: "info@flipnoorman.nl",
BCC: "bas@baskloosterman.nl",
}
sendMail(PreOrder{Name: "Bas Test", Email: "baskloosterman@gmail.com"}, config)
}

0
run/.keep Normal file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 KiB

BIN
src/img/albums/make-up.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

BIN
src/img/albums_main.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
src/img/cohen_main.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

BIN
src/img/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/img/logo_gvp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
src/img/loveit_main.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 KiB

80
src/js/scroll.js Normal file
View File

@ -0,0 +1,80 @@
function scrollIt(destination, duration , easing, callback) {
const easings = {
linear(t) {
return t;
},
easeInQuad(t) {
return t * t;
},
easeOutQuad(t) {
return t * (2 - t);
},
easeInOutQuad(t) {
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
},
easeInCubic(t) {
return t * t * t;
},
easeOutCubic(t) {
return (--t) * t * t + 1;
},
easeInOutCubic(t) {
return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
},
easeInQuart(t) {
return t * t * t * t;
},
easeOutQuart(t) {
return 1 - (--t) * t * t * t;
},
easeInOutQuart(t) {
return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t;
},
easeInQuint(t) {
return t * t * t * t * t;
},
easeOutQuint(t) {
return 1 + (--t) * t * t * t * t;
},
easeInOutQuint(t) {
return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t;
}
};
const start = window.pageYOffset;
const startTime = 'now' in window.performance ? performance.now() : new Date().getTime();
const documentHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);
const windowHeight = window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight;
const destinationOffset = typeof destination === 'number' ? destination : destination.offsetTop;
const destinationOffsetToScroll = Math.round(documentHeight - destinationOffset < windowHeight ? documentHeight - windowHeight : destinationOffset);
if ('requestAnimationFrame' in window === false) {
window.scroll(0, destinationOffsetToScroll);
if (callback) {
callback();
}
return;
}
function scroll() {
const now = 'now' in window.performance ? performance.now() : new Date().getTime();
const time = Math.min(1, ((now - startTime) / duration));
const timeFunction = easings[easing](time);
window.scroll(0, Math.ceil((timeFunction * (destinationOffsetToScroll - start)) + start));
if (window.pageYOffset === destinationOffsetToScroll) {
if (callback) {
callback();
}
return;
}
requestAnimationFrame(scroll);
}
scroll();
}
export default scrollIt

57
src/js/shared.js Normal file
View File

@ -0,0 +1,57 @@
import scroll from './scroll';
const anchors = Array.prototype.slice.call(document.querySelectorAll('a[href^="#"]'))
anchors.forEach((elem) => {
const href = elem.getAttribute('href')
if (href.length < 2) {
return
}
elem.addEventListener("click", (e) => {
e.preventDefault()
const target = document.getElementById(href.slice(1))
const viewportOffset = target.getBoundingClientRect();
scroll(viewportOffset.top, 1000, "easeOutQuart")
})
});
const nav = document.querySelector('.nav')
// Comment
document.addEventListener('scroll', () => {
const doc = document.documentElement;
const top = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);
top > (window.innerHeight / 2) ? nav.classList.add('open') : nav.classList.remove('open')
})
!function () {
let formEnabled = false
const submit = document.querySelector('.js-submit')
const form = document.querySelector('.js-require')
if (!form) {
return;
}
var inputs = Array.prototype.slice.call(form.querySelectorAll('.js-input'))
var check = (e) => {
if (inputs.filter(x => !x.value).length) {
formEnabled = false
submit.classList.add('disabled')
} else {
formEnabled = true
submit.classList.remove('disabled')
}
}
form.addEventListener('keyup', check)
form.addEventListener('submit', (e) => {
!formEnabled && e.preventDefault()
})
check()
}()

2
src/sass/_color.scss Normal file
View File

@ -0,0 +1,2 @@
$black:rgba(0,0,0,0.65);
$grey: #edddde;

4
src/sass/_mixins.scss Normal file
View File

@ -0,0 +1,4 @@
@mixin font-size($sizeValue) {
font-size: $sizeValue + px;
font-size: ($sizeValue / 16) + rem;
}

57
src/sass/_reset.scss Normal file
View File

@ -0,0 +1,57 @@
/* http://meyerweb.com/eric/tools/css/reset/
v2.0 | 20110126
License: none (public domain)
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
line-height: normal;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
img {
max-width: 100%;
}
html, html * {
box-sizing: border-box;
}

207
src/sass/_typography.scss Normal file
View File

@ -0,0 +1,207 @@
/*! Generated by Font Squirrel (https://www.fontsquirrel.com) on May 24, 2019 */
// @font-face {
// font-family: 'bebas_neue';
// src: url('../fonts/bebasneue-thin-webfont.woff2') format('woff2'),
// url('../fonts/bebasneue-thin-webfont.woff') format('woff');
// font-weight: 200;
// font-style: normal;
// }
// @font-face {
// font-family: 'bebas_neue';
// src: url('../fonts/bebasneue-light-webfont.woff2') format('woff2'),
// url('../fonts/bebasneue-light-webfont.woff') format('woff');
// font-weight: 300;
// font-style: normal;
// }
@font-face {
font-family: 'bebas_neue';
src: url('../fonts/bebasneue-regular-webfont.woff2') format('woff2'),
url('../fonts/bebasneue-regular-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
}
// @font-face {
// font-family: 'bebas_neue';
// src: url('../fonts/bebasneue-book-webfont.woff2') format('woff2'),
// url('../fonts/bebasneue-book-webfont.woff') format('woff');
// font-weight: 500;
// font-style: normal;
// }
@font-face {
font-family: 'bebas_neue';
src: url('../fonts/bebasneue-bold-webfont.woff2') format('woff2'),
url('../fonts/bebasneue-bold-webfont.woff') format('woff');
font-weight: bold;
font-style: normal;
}
i {
font-style: italic;
}
body {
font-family: 'bebas_neue';
}
.t-h1 {
@include font-size(70);
color: $grey;
background: $black;
padding: 0px 10px;
margin-bottom: 50px;
display: inline-block;
font-weight: bold;
@media (max-width: 600px) {
@include font-size(38);
margin-bottom: 25px;
}
}
.t-h2 {
@include font-size(36);
color: $grey;
background: $black;
padding: 0px 10px;
margin-bottom: 25px;
display: inline-block;
font-weight: bold;
@media (max-width: 600px) {
@include font-size(28);
margin-bottom: 15px;
}
}
.t-p1 {
@include font-size(30);
line-height: 1.4;
font-weight: normal;
text-decoration: none;
&--invert {
color: $grey;
background: $black;
padding: 0px 10px;
}
@media (max-width: 600px) {
@include font-size(22);
}
}
a.t-p1 {
color: $black!important;
&--invert {
color: $grey!important;
}
}
.t-p2 {
font-family: 'Noto Serif Display', serif;
@include font-size(24);
line-height: 1.8;
font-weight: normal;
text-decoration: none;
&--invert {
background-color: #698a81;
color: $grey;
text-decoration: none;
padding: 0px 10px;
}
@media (max-width: 600px) {
@include font-size(18);
}
}
a.t-p2 {
color: $black!important;
&--link {
text-decoration: underline;
font-weight: 900;
}
}
.t-h1-2 {
@include font-size(82);
text-transform: uppercase;
font-family: 'Noto Serif Display', serif;
margin-bottom: 15px;
font-weight: 400;
letter-spacing: -0.5px;
color: #d97575;
@media (max-width: 600px) {
@include font-size(64);
}
}
.t-h2-2 {
@include font-size(30);
font-family: 'Noto Serif Display', serif;
margin-bottom: 15px;
font-weight: 800;
letter-spacing: -0.5px;
color: $black;
}
.t-link {
@extend .t-p1;
color: $black!important;
text-decoration: underline;
font-weight: bold;
border:0;
display: inline-block;
padding: 0;
outline: 0;
background-color: transparent;
font-family: 'bebas_neue';
cursor: pointer;
}
.t-p-footer {
@include font-size(24);
line-height: 1.4;
font-weight: normal;
}
.o-margin-large {
margin-bottom: 50px;
@media (max-width: 600px) {
margin-bottom: 25px;
}
}
.o-margin-large {
margin-bottom: 25px;
}
.c-btn {
display: inline-block;
padding: 10px;
background-color: #698a81;
color: $grey;
text-decoration: none;
@media (max-width: 600px) {
width: 100%;
text-align: center;
}
&--l {
margin-top: 25px;
padding: 10px 15px;
font-family: 'Noto Serif Display', serif;
@include font-size(24);
}
}

544
src/sass/index.scss Normal file
View File

@ -0,0 +1,544 @@
@import "reset";
@import "mixins";
@import "color";
@import "typography";
body {
background-color: #CCC5C1;
color: $black;
background-size: cover;
}
pre {
white-space: pre-line;
}
.c-cohen-opening, .c-loveit-opening, .c-albums-opening {
background-size: cover;
background-repeat: none;
background-position: center;
height: 100vh;
padding: 50px;
@media (max-width: 600px) {
padding: 25px;
}
&__heading {
@include font-size(70);
color: $grey;
background: $black;
padding: 0px 10px;
margin-bottom: 20px;
display: inline-block;
font-weight: 600;
&--small {
@include font-size(36);
}
@media (max-width: 600px) {
@include font-size(36);
margin-bottom: 10px;
&--small {
@include font-size(24);
margin-bottom: 10px;
}
}
}
&__main {
position: absolute;
top: 50px;
left: 50px;
display: block;
@media (max-width: 600px) {
position: relative;
top: auto;
left: auto;
}
a {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: block;
}
}
&__other {
text-align: right;
position: absolute;
top: 50px;
right: 50px;
display: inline-block;
a {
text-decoration: none;
}
@media (max-width: 600px) {
position: static;
text-align: left;
margin-top: 25px;
}
}
}
.c-loveit-opening {
height: calc(100vh - 44.5px);
font-family: 'Noto Serif Display', serif;
background: black;
background-image: url('../img/loveit_main.jpg');
background-repeat: no-repeat;
background-size: contain;
background-position: center;
}
.c-tag {
@extend .t-p1;
font-weight: bold;
// @include font-size(18);
margin-left: 10px;
&:before {
content: "(";
}
&:after {
content: ")";
}
}
.c-auto-ratio {
margin-top: 50px;
&__inner {
padding-top: 56.25%;
position: relative;
iframe {
position: absolute;
top:0;
left: 0;
width: 100%;
height: 100%;
}
}
}
.c-loveit-opening {
background-image: url("/static/img/loveit_main.jpg");
}
.c-albums-opening {
background-image: url("/static/img/albums_main.jpg");
}
.c-cohen-opening {
background-image: url("/static/img/cohen_main.jpg");
@media (max-width: 600px) {
background-position: right 65% top;
}
}
.c-page-section {
padding: 50px 0;
&--full {
min-height: 100vh;
}
&__content {
max-width: 1024px;
margin: 0 auto;
padding: 0 25px;
}
@media (max-width: 600px) {
padding: 25px 0;
}
}
.c-footer {
width: 100%;
padding: 25px;
color: $grey;
@include font-size(24);
background-color: $black;
text-align: center;
span {
display: inline-block;
margin-right: 25px;
vertical-align: middle;
&:last-of-type {
margin-right: 0;
}
}
@media (max-width: 600px) {
@include font-size(18);
}
&--new {
@include font-size(18);
font-family: 'Noto Serif Display', serif;
@media (max-width: 600px) {
@include font-size(12);
}
}
}
.c-event {
// display: block;
@include font-size(24);
min-width: 100%;
vertical-align: top;
font-family: 'Noto Serif Display', serif;
li {
margin-bottom: 5px;
}
&__date {
font-weight: bold;
}
&-month-section {
margin-bottom: 35px;
@media (max-width: 600px) {
margin-bottom: 0px;
}
}
td {
padding: 0 25px 5px 0
}
td:nth-of-type(4n + 1) {
width: 200px;
text-align: left;
}
td:nth-of-type(4n + 2) {
width: 225px;
text-align: left;
}
td:nth-of-type(4n + 3) {
text-align: left;
}
td:nth-of-type(4n + 4) {
text-align: right;
width: 100px;
}
&__button {
@extend .c-btn;
padding: 5px 15px;
&--disabled {
cursor: default;
background-color: #8c8988;
opacity: 0.4;
}
}
// @media (max-width: 850px) {
// td:nth-of-type(4n + 4) {
// display: none;
// }
// }
&__title {
@extend .t-h2-2;
text-transform: uppercase;
}
@media (max-width: 600px) {
@include font-size(18);
td {
padding: 0 0 5px 0;
display: block;
width: auto!important;
text-align: left!important;
&:nth-of-type(4n + 1) {
display: inline-block;
&::after {
content: " / ";
}
}
&:nth-of-type(4n + 2) {
display: inline-block;
text-align: right!important;
}
}
tr {
display: block;
margin-bottom: 15px;
}
}
}
.nav {
position: fixed;
top: 0;
left: 0;
width: 100%;
padding: 15px 25px;
background-color: $black;
color: $grey;
display: table;
transform: translateY(-100%);
transition: all 200ms ease-out;
&.open {
transform: translateY(0);
}
&.always-open {
transform: translateY(0);
}
a {
text-decoration: none;
color: $grey!important;
@include font-size(28);
margin-right: 15px;
font-weight: bold;
&:last-of-type {
margin-right: 0;
}
@media (max-width: 600px) {
@include font-size(20);
}
&.c-nav-invert-button {
background: $grey;
color: $black!important;
display: inline-block;
padding-left: 5px;
padding-right: 5px;
@media(max-width: 600px) {
display: none;
}
}
}
&__section {
display: table-cell;
}
&__right {
text-align: right;
}
}
.c-album {
&__left {
display: inline-block;
vertical-align: top;
width: 49.5%;
padding-right: 25px;
@media (max-width: 600px) {
width: 100%;
padding-right: 0;
}
}
&__right {
display: inline-block;
vertical-align: top;
width: 49.5%;
@media (max-width: 600px) {
width: 100%;
padding-top: 25px;
}
}
}
#scroll {
position: absolute;
left: 50%;
bottom: 50px;
transform: translateX(-50%);
}
#scroll a {
padding-top: 70px;
position: relative;
color: $grey;
text-decoration: none;
font-size: 26px;
}
#scroll a span {
position: absolute;
top: 0;
left: 50%;
width: 24px;
height: 24px;
margin-left: -12px;
border-left: 1px solid $grey;
border-bottom: 1px solid $grey;
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg);
-webkit-animation: sdb05 1.5s infinite;
animation: sdb05 1.5s infinite;
box-sizing: border-box;
}
@-webkit-keyframes sdb05 {
0% {
-webkit-transform: rotate(-45deg) translate(0, 0);
opacity: 0;
}
50% {
opacity: 1;
}
100% {
-webkit-transform: rotate(-45deg) translate(-20px, 20px);
opacity: 0;
}
}
@keyframes sdb05 {
0% {
transform: rotate(-45deg) translate(0, 0);
opacity: 0;
}
50% {
opacity: 1;
}
100% {
transform: rotate(-45deg) translate(-20px, 20px);
opacity: 0;
}
}
.c-form-row {
margin-bottom: 25px;
}
.c-label {
@extend .t-p1;
margin-bottom: 5px;
}
.c-input {
font-family: 'bebas_neue';
font-size: 30px;
border: 0;
width: 100%;
border-bottom: 2px solid $black;
padding: 5px;
}
.c-number-input {
input {
width: 75px;
}
span {
display: inline-block;
@extend .t-p1;
margin-left: 10px;
}
}
.c-submit {
border: 0;
outline: 0;
@extend .t-p1;
@extend .t-p1--invert;
cursor: pointer;
font-weight: normal;
// padding: 5px 15px;
font-family: 'bebas_neue';
}
.c-table {
width: 100%;
margin-bottom: 50px;
td {
@extend .t-p1;
&:last-of-type {
text-align: right;
}
}
&__border {
border-top: 1px solid $black;
}
}
.o-full {
min-height: calc(100vh - 76px);
}
.disabled {
cursor: default;
opacity: 0.2;
}
.red {
color: red!important;
}
.c-new-nav {
width: 100%;
padding: 10px;
background-color: #b99970;
&__ul {
display: flex;
padding: 0 15px;
justify-content: center;
@media (max-width: 600px) {
justify-content: space-between;
}
}
&__li {
margin-right: 35px;
&:last-of-type {
margin-right: 0;
}
@media (max-width: 600px) {
margin-right: 0px;
}
}
&__a {
font-family: 'Noto Serif Display', serif;
text-transform: uppercase;
color: $black;
@include font-size(18);
font-weight: bold;
display: inline-block;
padding: 0;
text-decoration: none;
}
}

29
templates/404.html Normal file
View File

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flip Noorman | Zingt Leonard Cohen</title>
<link rel="stylesheet" href="/static/css/index.css?v4">
<link rel="icon" type="image/png" href="/static/img/favicon.png" />
</head>
<body>
<nav class="nav open">
<div class="nav__section nav__left">
<a href="/">Zingt Leonard Cohen</a>
</div>
<div class="nav__section nav__right">
<a href="/love-it">Love It!</a>
<a href="/albums">Albums</a>
</div>
</nav>
<div class="c-page-section">
<div class="c-page-section__content" style="text-align: center;">
<h1 style="font-size: 200px; font-weight: bold; margin-top: 100px;">404</h1>
<p class="t-p1">De pagina die je probeert te bezoeken bestaat niet (meer).</p>
<p class="t-p1"><a href="/" class="t-p1 t-p1--invert">Naar home</a></p>
</div>
</div>
</body>
</html>

72
templates/albums.html Normal file
View File

@ -0,0 +1,72 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flip Noorman | Albums</title>
<link rel="stylesheet" href="/static/css/index.css?v4">
<link rel="icon" type="image/png" href="/static/img/favicon.png" />
</head>
<body>
<nav class="nav">
<div class="nav__section nav__left">
<a href="/albums">Albums</a>
</div>
<div class="nav__section nav__right">
<a href="https://mailchi.mp/fa9b30c6bd38/flip-noorman-nieuwsbrief" class="c-nav-invert-button" target="_blank" ref="no-follow">Nieuwsbrief</a>
<a href="/">Love It</a>
</div>
</nav>
<div class="c-albums-opening">
<nav class="c-albums-opening__main">
<a href="#tour"></a>
<p class="c-albums-opening__heading">Flip Noorman</p>
<div></div>
<p class="c-albums-opening__heading">Albums</p>
</nav>
<nav class="c-albums-opening__other">
<a href="/" class="c-albums-opening__heading c-albums-opening__heading--small">Love It</a>
</nav>
<div id="scroll">
<a href="#de-big-one">
<span></span>
scroll
</a>
</div>
</div>
{{ range .albums }}
{{$album := .}}
<div class="c-page-section" id="{{.Path}}">
<div class="c-page-section__content">
<h1 class="t-h1">
{{.Name}} ({{.Release}})
</h1>
<div class="c-album">
<a class="t-p1 t-p1--invert" style="margin-bottom: 25px; display: inline-block; margin-right: 10px;" rel="noopener" href="{{.Links.itunes}}" target="_blank">Koop op iTunes</a>
<a class="t-p1 t-p1--invert" style="margin-bottom: 25px; display: inline-block;" rel="noopener" href="{{.Links.spotify}}" target="_blank">Luister op Spotify</a>
<div></div>
<div class="c-album__left">
<img src="/static/img/albums/{{.Path}}-BW.jpg" alt="">
</div>
<div class="c-album__right">
<ul>
{{range .Songs}}
<li><a class="t-p1 t-p1--invert" href="/albums/{{$album.Path}}/{{.Path}}">{{.NR}} {{.Title}}</a></li>
{{end}}
</ul>
</div>
</div>
</div>
</div>
{{ end }}
<footer class="c-footer">
<span>© {{.nowYear}} Flip Noorman </span>
<span>info@flipnoorman.nl</span>
</footer>
<script src="/static/js/shared.js"></script>
</body>
</html>

186
templates/index.html Normal file
View File

@ -0,0 +1,186 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flip Noorman | Love It</title>
<meta name="description" content="Na zijn succesvolle tournee met het werk van Leonard Cohen is Flip Noorman terug met een eigen avondvullende show. Love it">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+Display:wght@400;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/static/css/index.css?v4">
<link rel="icon" type="image/png" href="static/img/favicon.png" />
<style>
.t-quote {
margin-right: 5px;
font-style: italic;
}
.t-quote:before {
content: "“";
font-style: normal;
}
.t-quote:after {
content: "”";
font-style: normal;
margin-left: 7px;
}
</style>
</head>
<body>
<nav class="c-new-nav">
<ul class="c-new-nav__ul">
<li class="c-new-nav__li">
<a href="#loveit" class="c-new-nav__a">Love it</a>
</li>
<li class="c-new-nav__li">
<a href="#tour" class="c-new-nav__a">Tour</a>
</li>
<li class="c-new-nav__li">
<a href="#contact" class="c-new-nav__a">Contact</a>
</li>
<li class="c-new-nav__li">
<a href="/albums" class="c-new-nav__a">Albums</a>
</li>
</ul>
</nav>
<div class="c-loveit-opening">
</div>
<div class="c-page-section loveit" id="loveit">
<div class="c-page-section__content">
<h1 class="t-h1-2">
Love It
</h1>
<p class="t-p2 o-margin-large">
Na zijn succesvolle tournee met het werk van Leonard Cohen is Flip Noorman terug met een eigen avondvullende show.
</p>
<p class="t-p2 o-margin-large">
Wederom bijgestaan door zijn bejubelde band De Noormannen pakt Flip het meest uitgebuite thema in de kunst aan: de liefde.
</p>
<p class="t-p2 o-margin-large">
In Love it schetst Noorman in eerste instantie een wereldbeeld van love for sale perfectie. Maar vervolgens brengt hij juist een onversneden hommage aan het onvolmaakte.
</p>
<p class="t-p2 o-margin-large">
En laten we eerlijk zijn: u verdient het toch? Een voorstelling met een lach en een traan, een rilling van ontroering. Een diepe stem waarin u uw zorgen even kunt vergeten. Gitaren als warme baden. Een wervelend theatraal concert dat bovendien uw huid strakker, gladder en egaler maakt.
</p>
<p class="t-p2 o-margin-large">
Flip Noorman bood u nog nooit zoveel comfort en is dermatologisch getest en klinisch bewezen. U hoeft hem maar op te spuiten en mild-erotische fantasieën zullen als honing over u heen druipen.
</p>
<p class="t-p2 o-margin-large">
Heb jij Love it al gezien? 'Nee, hoe was het?'<br/>
'Oh… Love it!
</p>
</div>
</div>
<div class="c-page-section" id="tour">
<div class="c-page-section__content">
<h1 class="t-h1-2">
Pre-order
</h1>
<p class="t-p2">
Pre-order de Love it CD nu!<br>
En ontvang alvast een liedje in je mail.
<p>
<a href="/preorder" class="c-btn c-btn--l">Bestel nu!</a>
</div>
</div>
<div class="c-page-section" id="tour">
<div class="c-page-section__content">
<h1 class="t-h1-2">
Tour
</h1>
{{ if and (and .events (gt (len .events) 0) true) }}
<div class="c-event-container">
{{ range .events}}
{{$e := index . 0}}
<div class="c-event-month-section">
<table class="c-event">
{{range .}}
<tr>
<td class="c-event__date">{{.Date.Format}}</td>
<td>{{.City}}</td>
<td>
{{.Venue}}
{{if .Flags.Premiere}}
<span class="c-tag" >premiere</span>
{{else if .Flags.Tryout}}
<span class="c-tag" >try-out</span>
{{else if .Flags.Preview}}
<span class="c-tag" >preview</span>
{{end}}
{{if .Flags.Solo}}
<span class="c-tag" >solo</span>
{{end}}
{{if .Flags.XL}}
<span class="c-tag" >xl</span>
{{end}}
</td>
<td>
{{if .Flags.Soldout}}
<span class="c-event__button">Uitverkocht</span>
{{else if ne .Link ""}}
<a class="c-event__button" href="{{.Link}}">Tickets</a>
{{else if eq .Link ""}}
<a class="c-event__button c-event__button--disabled">Tickets</a>
{{end}}
</td>
</tr>
{{end}}
</table>
</div>
{{ end}}
</div>
{{ else }}
<p class="t-p2">Er staan momenteel geen shows geplanned.</p>
{{ end }}
</div>
</div>
<div class="c-page-section">
<div class="c-page-section__content" id="contact">
<h1 class="t-h1-2">
contact
</h1>
<div>
<h2 class="t-h2-2">Theaterboekingen</h2>
</div>
<ul>
<li class="t-p2">George Visser Productions b.v. / TriColour Productions b.v.</li>
<li class="t-p2">Postbus 18618</li>
<li class="t-p2">2502 EP Den Haag</li>
<li class="t-p2">+31 (070) 346 56 57</li>
<li class="t-p2">www.gvproductions.nl</li>
</ul>
<div style="margin-top: 50px;">
<h2 class="t-h2-2">Persoonlijke boodschappen</h2>
</div>
<ul>
<li class="t-p2">
info@flipnoorman.nl
</li>
</ul>
<div style="margin-top: 50px;">
<h2 class="t-h2-2">Nieuwsbrief</h2>
</div>
<ul>
<li class="t-p2">
<a class="c-btn" href="https://mailchi.mp/fa9b30c6bd38/flip-noorman-nieuwsbrief" target="_blank" ref="no-follow">Inschrijven</a>
</li>
</ul>
</div>
</div>
<footer class="c-footer c-footer--new">
<span>© {{.nowYear}} Flip Noorman </span>
<span>info@flipnoorman.nl</span>
</footer>
<script src="/static/js/shared.js"></script>
</body>
</html>

137
templates/loveit.html Normal file
View File

@ -0,0 +1,137 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flip Noorman | Love It!</title>
<meta name="description" content="Langzaam worden de principes waarvoor je voorheen nog als radicaal werd versleten deel van de populaire cultuur. Noorman ziet zichzelf steeds meer tot de mainstream behoren terwijl hij toch altijd dacht dat hij de verongelijkte kunstenaar zou blijven. Wat nu?">
<link rel="stylesheet" href="/static/css/index.css?v4">
<link rel="icon" type="image/png" href="/static/img/favicon.png" />
</head>
<body>
<nav class="nav">
<div class="nav__section nav__left">
<a href="/">Love It!</a>
</div>
<div class="nav__section nav__right">
<a href="https://mailchi.mp/fa9b30c6bd38/flip-noorman-nieuwsbrief" class="c-nav-invert-button" target="_blank" ref="no-follow">Nieuwsbrief</a>
<a href="/albums">Albums</a>
</div>
</nav>
<div class="c-loveit-opening">
<nav class="c-loveit-opening__main">
<a href="#tour"></a>
<p class="c-loveit-opening__heading">Love It</p>
</nav>
<nav class="c-loveit-opening__other">
<a href="/" class="c-loveit-opening__heading c-loveit-opening__heading--small">Zingt Leonard Cohen</a>
<div></div>
<a href="/albums" class="c-loveit-opening__heading c-loveit-opening__heading--small">Albums</a>
</nav>
<div id="scroll">
<a href="#tour">
<span></span>
scroll
</a>
</div>
</div>
<div class="c-page-section" id="tour">
<div class="c-page-section__content">
<h1 class="t-h1">
Tour
</h1>
{{ if and .events (gt (len .events) 0) }}
<div class="c-event-container">
{{ range .events}}
{{$e := index . 0}}
<div class="c-event-month-section">
<h2 class="c-event__title">{{$e.Date.Title}}</h2>
<table class="c-event">
{{range .}}
<tr>
<td class="c-event__date">{{.Date.Format}}</td>
<td>{{.City}}</td>
<td>{{.Venue}}</td>
<td>
{{if .Flags.Soldout}}
<span class="c-event__button">Uitverkocht</span>
{{else if ne .Link ""}}
<a class="c-event__button" href="{{.Link}}">Tickets</a>
{{end}}
</td>
</tr>
{{end}}
</table>
</div>
{{ end}}
</div>
{{ else }}
<p class="t-p1">Momenteel staan er geen shows meer geplanned.</p>
{{ end }}
</div>
</div>
<div class="c-page-section">
<div class="c-page-section__content">
<h1 class="t-h1" style="margin-bottom: 15px;">
Flip Noorman
</h1>
<div></div>
<h1 class="t-h1">
Love It
</h1>
<p class="t-p1">
“Ben je vegan?”
</p>
<p class="t-p1"> Vroeg de barista toen Noorman een soja-cappuccino bestelde.</p>
<p class="t-p1" style="font-weight: bold; margin-bottom: 35px;">“Ja? Love it!”</span> </p>
<p class="t-p1" style="margin-bottom: 15px;">Langzaam worden de principes waarvoor je voorheen nog als radicaal werd versleten deel van de populaire cultuur. Noorman ziet zichzelf steeds meer tot de mainstream behoren terwijl hij toch altijd dacht dat hij de verongelijkte kunstenaar zou blijven. Wat nu?</p>
<p class="t-p1">In Love it! onderzoekt hij of kan genieten van de acceptatie of dat hij het nodig heeft om af te wijken.</p>
</div>
</div>
<div class="c-page-section">
<div class="c-page-section__content">
<h1 class="t-h1">
contact
</h1>
<div>
<h2 class="t-h2">Theaterboekingen</h2>
</div>
<ul>
<li class="t-p1">George Visser Productions b.v. / TriColour Productions b.v.</li>
<li class="t-p1">Postbus 18618</li>
<li class="t-p1">2502 EP Den Haag</li>
<li class="t-p1">+31 (070) 346 56 57</li>
<li class="t-p1">www.gvproductions.nl</li>
</ul>
<div style="margin-top: 50px;">
<h2 class="t-h2">Persoonlijke boodschappen</h2>
</div>
<ul>
<li class="t-p1">
info@flipnoorman.nl
</li>
</ul>
<div style="margin-top: 50px;">
<h2 class="t-h2">Nieuwsbrief</h2>
</div>
<ul>
<li class="t-p1">
<a class="t-p1 t-p1--invert" href="https://mailchi.mp/fa9b30c6bd38/flip-noorman-nieuwsbrief" target="_blank" ref="no-follow">Inschrijven</a>
</li>
</ul>
</div>
</div>
<footer class="c-footer">
<span>© {{.nowYear}} Flip Noorman </span>
<span>info@flipnoorman.nl</span>
</footer>
<script src="/static/js/shared.js"></script>
</body>
</html>

11
templates/preorder.email Normal file
View File

@ -0,0 +1,11 @@
<p>Beste {{.preOrder.Name}},</p>
<p>&nbsp;</p>
<p>Bedankt voor je bestelling. Je krijgt hem zo snel mogelijk in de bus.</p>
<p>&nbsp;</p>
<p>
<a href="https://my.hidrive.com/share/l99eeijlka">Hier</a> kan je vast een duet tussen Vera van der Bie en mij downloaden (zowel als wave als mp3).
</p>
<p>Hopelijk tot ergens in het theater!</p>
<p>&nbsp;</p>
<p>Vriendelijke groeten,</p>
<p>Flip Noorman</p>

View File

@ -0,0 +1,63 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flip Noorman | Zingt Leonard Cohen | Preorder</title>
<meta name="description" content="Na het overlijden van Cohen in 2016 bracht Flip Noorman eenmalig een hommage aan zijn grootste inspiratiebron in Paradiso. Na vele verzoeken om het toch niet bij die ene keer te laten is hij gezwicht om het programma nu ook in het theater te brengen.">
<link rel="stylesheet" href="/static/css/index.css?v4">
<link rel="icon" type="image/png" href="static/img/favicon.png" />
</head>
<body>
<nav class="nav always-open">
<div class="nav__section nav__left">
<a href="/">Zingt Leonard Cohen</a>
</div>
<div class="nav__section nav__right">
<a href="https://mailchi.mp/fa9b30c6bd38/flip-noorman-nieuwsbrief" class="c-nav-invert-button" target="_blank" ref="no-follow">Nieuwsbrief</a>
<a href="/love-it">Love It!</a>
<a href="/albums">Albums</a>
</div>
</nav>
<div class="c-page-section" id="" style="padding-top: 150px">
<div class="c-page-section__content">
<h1 class="t-h1">
Bestel nu
</h1>
<p class="t-p1 o-margin-large">
De voorstelling is prachtig gedocumenteerd.
<p>
<p class="t-p1 o-margin-large">
<span class="t-quote">Flip Noorman evenaart Leonard Cohen</span> Trouw <span style="font-size: 21px;
line-height: -2;
display: inline-block;
margin-left: 5px;
position: relative;
top: -4px;">★★★★★</span>
<p>
<p class="t-p1 o-margin-large">
Hier zit tevens een boekje met alle vertalingen in.
<p>
<form action="/preorder/bestellen" method="POST">
{{range .products}}
<div class="c-form-row">
<div class="c-product">
<label class="c-label" for="product-{{.ID}}" style="display: block;">{{.Name}} | {{formatMoney .Price}} per stuk</label>
<div class="c-number-input"><input class="c-input" type="number" value="1" id="product-{{.ID}}" name="product[{{.ID}}]"> <span>Stuks</span></div>
</div>
</div>
{{end}}
<div class="c-form-row">
<button class="c-submit">BESTELLEN</button>
</div>
</form>
</div>
</div>
<footer class="c-footer">
<span>© {{.nowYear}} Flip Noorman </span>
<span>info@flipnoorman.nl</span>
</footer>
<script src="/static/js/shared.js"></script>
</body>
</html>

View File

@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flip Noorman | Love It | Preorder</title>
<meta name="description" content="Na zijn succesvolle tournee met het werk van Leonard Cohen is Flip Noorman terug met een eigen avondvullende show. Love it">
<link rel="stylesheet" href="/static/css/index.css?v4">
<link rel="icon" type="image/png" href="static/img/favicon.png" />
</head>
<body>
<nav class="nav always-open">
<div class="nav__section nav__left">
<a href="/">Love It!</a>
</div>
<div class="nav__section nav__right">
<a href="https://mailchi.mp/fa9b30c6bd38/flip-noorman-nieuwsbrief" class="c-nav-invert-button" target="_blank" ref="no-follow">Nieuwsbrief</a>
<a href="/albums">Albums</a>
</div>
</nav>
<div class="c-page-section" id="" style="padding-top: 150px; min-height: calc(100vh - 75px)">
<div class="c-page-section__content">
<h1 class="t-h1">
Bestel nu
</h1>
<p class="t-p1 o-margin-large">
Pre-order de Love it CD nu!<br>
En ontvang alvast een liedje in je mail.
<p>
<form action="/preorder/bestellen" method="POST">
{{range .products}}
<div class="c-form-row">
<div class="c-product">
<label class="c-label" for="product-{{.ID}}" style="display: block;">{{.Name}} | {{formatMoney .Price}} per stuk</label>
<div class="c-number-input"><input class="c-input" type="number" value="1" id="product-{{.ID}}" name="product[{{.ID}}]"> <span>Stuks</span></div>
</div>
</div>
{{end}}
<div class="c-form-row">
<button class="c-submit">BESTELLEN</button>
</div>
</form>
</div>
</div>
<footer class="c-footer">
<span>© {{.nowYear}} Flip Noorman </span>
<span>info@flipnoorman.nl</span>
</footer>
<script src="/static/js/shared.js"></script>
</body>
</html>

View File

@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flip Noorman | Love It! | Preorder</title>
<meta name="description" content="Na zijn succesvolle tournee met het werk van Leonard Cohen is Flip Noorman terug met een eigen avondvullende show. Love it">
<link rel="stylesheet" href="/static/css/index.css?v4">
<link rel="icon" type="image/png" href="static/img/favicon.png" />
</head>
<body>
<nav class="nav always-open">
<div class="nav__section nav__left">
<a href="/">Love It!</a>
</div>
<div class="nav__section nav__right">
<a href="https://mailchi.mp/fa9b30c6bd38/flip-noorman-nieuwsbrief" class="c-nav-invert-button" target="_blank" ref="no-follow">Nieuwsbrief</a>
<a href="/albums">Albums</a>
</div>
</nav>
<div class="c-page-section" id="" style="padding-top: 150px">
<div class="c-page-section__content">
<h1 class="t-h1">
Bestellen
</h1>
<table class="c-table">
<tr>
<td>{{.product.Name}}</td>
<td>{{.orderCount}} x</td>
<td>{{formatMoney .subtotal}}</td>
</tr>
<tr>
<td>Verzendkosten</td>
<td>1 x</td>
<td>{{formatMoney .shipping}}</td>
</tr>
<tr class="c-table__border">
<td>Totaal</td>
<td></td>
<td>{{formatMoney .total}}</td>
</tr>
</table>
{{if ne .error_ ""}}
<p class="t-p1 red">{{.error_}}</p>
{{end}}
<form action="/preorder" method="POST" class="js-require">
<input type="hidden" name="product_count" class="js-input" value="{{.orderCount}}">
<div class="c-form-row"><p class="t-p1">* = verplicht veld</p></div>
<div class="c-form-row">
<label class="c-label" for="name" style="display: block;">Naam (*)</label>
<input class="c-input js-input" type="text" name="name" id="name">
</div>
<div class="c-form-row">
<label class="c-label" for="email" style="display: block;">Emailadres (*)</label>
<input class="c-input js-input" type="text" name="email" id="email">
</div>
<div class="c-form-row">
<label class="c-label" for="address" style="display: block;">Adres (*)</label>
<input class="c-input js-input" type="text" name="address" id="address">
</div>
<div class="c-form-row">
<label class="c-label" for="postcode" style="display: block;">Postcode (*)</label>
<input class="c-input js-input" type="text" name="postcode" id="postcode">
</div>
<div class="c-form-row">
<label class="c-label" for="city" style="display: block;">Stad (*)</label>
<input class="c-input js-input" type="text" name="city" id="city">
</div>
<div class="c-form-row">
<button class="c-submit js-submit">Bestellen</button>
</div>
</form>
</div>
</div>
<footer class="c-footer">
<span>© {{.nowYear}} Flip Noorman </span>
<span>info@flipnoorman.nl</span>
</footer>
<script src="/static/js/shared.js"></script>
</body>
</html>

View File

@ -0,0 +1,58 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flip Noorman | Love It! | Preorder</title>
<meta name="description" content="Na het overlijden van Cohen in 2016 bracht Flip Noorman eenmalig een hommage aan zijn grootste inspiratiebron in Paradiso. Na vele verzoeken om het toch niet bij die ene keer te laten is hij gezwicht om het programma nu ook in het theater te brengen.">
<link rel="stylesheet" href="/static/css/index.css?v4">
<link rel="icon" type="image/png" href="static/img/favicon.png" />
</head>
<body>
<nav class="nav always-open">
<div class="nav__section nav__left">
<a href="/">Love It!</a>
</div>
<div class="nav__section nav__right">
<a href="https://mailchi.mp/fa9b30c6bd38/flip-noorman-nieuwsbrief" class="c-nav-invert-button" target="_blank" ref="no-follow">Nieuwsbrief</a>
<a href="/albums">Albums</a>
</div>
</nav>
<div class="c-page-section o-full" id="" style="padding-top: 150px">
<div class="c-page-section__content">
{{if eq .payment.Status "open"}}
<p class="t-p1">Betaling aan het verwerken <span class="js-loading"></span></p>
{{else}}
<form action="/preorder/retry/{{.orderID}}" method="POST">
<p class="t-p1">Je betaling is mislukt, probeer <button class="t-link">opnieuw</button></p>
</form>
{{end}}
</div>
</div>
<footer class="c-footer">
<span>© {{.nowYear}} Flip Noorman </span>
<span>info@flipnoorman.nl</span>
</footer>
<script>
{{if eq .payment.Status "open"}}
var loading = document.querySelector('.js-loading')
setInterval((function () {
var times = 0
return function () {
times++
var dots = ''
for (i = 0; i < times % 4; i++) {
dots += '.'
}
loading.textContent = dots
}
})(), 200)
setTimeout(function () {window.location.reload()}, 2000)
{{end}}
</script>
<script src="/static/js/shared.js"></script>
</body>
</html>

View File

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flip Noorman | Love It! | Preorder</title>
<meta name="description" content="Na zijn succesvolle tournee met het werk van Leonard Cohen is Flip Noorman terug met een eigen avondvullende show. Love it">
<link rel="stylesheet" href="/static/css/index.css?v4">
<link rel="icon" type="image/png" href="static/img/favicon.png" />
</head>
<body>
<nav class="nav always-open">
<div class="nav__section nav__left">
<a href="/">Love It!</a>
</div>
<div class="nav__section nav__right">
<a href="https://mailchi.mp/fa9b30c6bd38/flip-noorman-nieuwsbrief" class="c-nav-invert-button" target="_blank" ref="no-follow">Nieuwsbrief</a>
<a href="/albums">Albums</a>
</div>
</nav>
<div class="c-page-section o-full" id="" style="padding-top: 150px">
<div class="c-page-section__content">
<p class="t-p1">
Bedankt voor je bestelling.
</p>
</div>
</div>
<footer class="c-footer">
<span>© {{.nowYear}} Flip Noorman </span>
<span>info@flipnoorman.nl</span>
</footer>
<script src="/static/js/shared.js"></script>
</body>
</html>

48
templates/song.html Normal file
View File

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="/static/css/index.css?v4">
<link rel="icon" type="image/png" href="/static/img/favicon.png" />
</head>
<body>
<nav class="nav">
<div class="nav__section nav__left">
<a href="/albums#{{.album.Path}}">Terug</a>
</div>
<div class="nav__section nav__right">
<a href="/">Zingt Leonard Cohen</a>
<a href="/love-it">Love It!</a>
</div>
</nav>
<div class="c-page-section">
<div class="c-page-section__content">
<a class="t-h2" style="text-decoration: none; font-size: 26px; margin-bottom: 25px;" href="/albums#{{.album.Path}}">terug</a>
<div></div>
<h1 class="t-h1" style="margin-bottom: 15px;">
{{.album.Name}} ({{.album.Release}})
</h1>
<div></div>
<h1 class="t-h2">
{{.song.Title}}
</h1>
<div style="margin-bottom: 35px;"></div>
{{range .song.Lyrics}}
<pre class="t-p1" style="margin-bottom: 25px; font-size: 24px;">
{{- . -}}
</pre>
{{end}}
</div>
</div>
<footer class="c-footer">
<span>© {{.nowYear}} Flip Noorman </span>
<span>info@flipnoorman.nl</span>
</footer>
<script src="/static/js/shared.js"></script>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More