diff --git a/backend/main.py b/backend/main.py index fb99094..158c01e 100644 --- a/backend/main.py +++ b/backend/main.py @@ -68,6 +68,7 @@ SMTP_PORT = os.getenv("SMTP_PORT", "").strip() SMTP_USER = os.getenv("SMTP_USER", "").strip() SMTP_PASS = os.getenv("SMTP_PASS", "").strip() PUBLIC_FROM_EMAIL = os.getenv("PUBLIC_FROM_EMAIL", SMTP_USER).strip() +CONTACT_FORM_TO_EMAIL = os.getenv("CONTACT_FORM_TO_EMAIL", "teeoff@teeoff.no").strip() pwd_context = CryptContext(schemes=["pbkdf2_sha256"], deprecated="auto") @@ -84,6 +85,9 @@ ADMIN_SESSION_MAX_AGE_SECONDS = get_int_env("ADMIN_SESSION_MAX_AGE_SECONDS", 60 ADMIN_REMEMBER_ME_MAX_AGE_SECONDS = get_int_env("ADMIN_REMEMBER_ME_MAX_AGE_SECONDS", 60 * 60 * 24 * 30) PUBLIC_MAGIC_LINK_MAX_AGE_MINUTES = get_int_env("PUBLIC_MAGIC_LINK_MAX_AGE_MINUTES", 20) PUBLIC_MAGIC_LINK_REQUEST_COOLDOWN_SECONDS = get_int_env("PUBLIC_MAGIC_LINK_REQUEST_COOLDOWN_SECONDS", 60) +CONTACT_FORM_RATE_LIMIT_WINDOW_SECONDS = get_int_env("CONTACT_FORM_RATE_LIMIT_WINDOW_SECONDS", 60 * 60) +CONTACT_FORM_RATE_LIMIT_MAX_SUBMISSIONS = get_int_env("CONTACT_FORM_RATE_LIMIT_MAX_SUBMISSIONS", 3) +CONTACT_FORM_MIN_FILL_SECONDS = get_int_env("CONTACT_FORM_MIN_FILL_SECONDS", 5) def resolve_imported_meninger_path() -> Path: @@ -122,6 +126,10 @@ def is_magic_link_configured() -> bool: return bool(SMTP_SERVER and SMTP_PORT and SMTP_USER and SMTP_PASS and PUBLIC_FROM_EMAIL) +def is_contact_form_configured() -> bool: + return is_magic_link_configured() and bool(CONTACT_FORM_TO_EMAIL) + + def get_public_auth_config() -> dict[str, Any]: google_enabled = is_google_login_configured() magic_link_enabled = is_magic_link_configured() @@ -256,6 +264,40 @@ async def send_magic_link_email(email_address: str, login_url: str) -> None: await asyncio.to_thread(_send) +async def send_contact_form_email( + *, + sender_name: str, + sender_email: str, + topic: str, + message: str, + ip_hash: str | None, +) -> None: + subject = f"[TeeOff Kontakt] {topic}" + body = ( + "Ny melding fra kontaktskjemaet på TeeOff.no\n\n" + f"Navn: {sender_name}\n" + f"E-post: {sender_email}\n" + f"Emne: {topic}\n" + f"IP-hash: {ip_hash or 'ukjent'}\n\n" + "Melding:\n" + f"{message.strip()}\n" + ) + + def _send() -> None: + mail = EmailMessage() + mail["From"] = PUBLIC_FROM_EMAIL + mail["To"] = CONTACT_FORM_TO_EMAIL + mail["Reply-To"] = sender_email + mail["Subject"] = subject + mail.set_content(body) + + with smtplib.SMTP_SSL(SMTP_SERVER, int(SMTP_PORT)) as server: + server.login(SMTP_USER, SMTP_PASS) + server.send_message(mail) + + await asyncio.to_thread(_send) + + async def validate_admin_session_token(token: str) -> str: try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) @@ -338,6 +380,8 @@ class ArticleUpsertRequest(BaseModel): author_name: Optional[str] = None status: Optional[str] = "draft" hero_images: Optional[List[dict[str, Any]]] = [] + media_gallery: Optional[List[dict[str, Any]]] = [] + featured_media_id: Optional[str] = None content_html: Optional[str] = None source_url: Optional[str] = None source_label: Optional[str] = None @@ -352,6 +396,15 @@ class PublicCommentCreateRequest(BaseModel): class PublicMagicLinkRequest(BaseModel): email: str return_to: Optional[str] = "/" + + +class PublicContactFormRequest(BaseModel): + name: str + email: str + topic: str + message: str + website: Optional[str] = "" + started_at: Optional[int] = None # --- FUNKSJONER --- def format_row(row): """ @@ -527,6 +580,43 @@ def format_article_row(row): elif not isinstance(hero_images, list): data["hero_images"] = [] + media_gallery = data.get("media_gallery") + if media_gallery is None: + data["media_gallery"] = [] + elif isinstance(media_gallery, str): + try: + data["media_gallery"] = json.loads(media_gallery) + except Exception: + data["media_gallery"] = [] + elif not isinstance(media_gallery, list): + data["media_gallery"] = [] + + if not data["media_gallery"] and data["hero_images"]: + data["media_gallery"] = [ + { + "id": build_article_media_id("image", image.get("src") or ""), + "type": "image", + "src": image.get("src") or "", + "alt": image.get("alt") or "", + "caption": image.get("caption") or "", + "poster": "", + } + for image in data["hero_images"] + if isinstance(image, dict) and str(image.get("src") or "").strip() + ] + + if not data.get("featured_media_id") and data["media_gallery"]: + first_image = next( + ( + item + for item in data["media_gallery"] + if isinstance(item, dict) and str(item.get("type") or "image").strip().lower() == "image" + ), + None, + ) + if first_image: + data["featured_media_id"] = str(first_image.get("id") or "").strip() or None + return data @@ -575,7 +665,7 @@ def sanitize_hero_images(value: Any) -> list[dict[str, str]]: continue sanitized.append( { - "src": src, + "src": normalize_article_media_url(src), "alt": str(item.get("alt") or "").strip(), "caption": str(item.get("caption") or "").strip(), } @@ -583,6 +673,145 @@ def sanitize_hero_images(value: Any) -> list[dict[str, str]]: return sanitized +LEGACY_ARTICLE_MEDIA_PATTERN = re.compile( + r"^https?://(?:www\.)?(?:teeoff\.no|nye\.teeoff\.no|wp\.teeoff\.no)(?P/(?:wp-content/uploads|uploads/articles)/.+)$", + re.IGNORECASE, +) +YOUTUBE_THUMBNAIL_PATTERN = re.compile( + r"^https?://i\.ytimg\.com/vi(?:_webp)?/(?P[^/]+)/", + re.IGNORECASE, +) + + +def normalize_article_media_url(value: str | None) -> str: + trimmed = str(value or "").strip() + if not trimmed: + return "" + + legacy_match = LEGACY_ARTICLE_MEDIA_PATTERN.match(trimmed) + if legacy_match: + path = legacy_match.group("path") + if path.startswith("/wp-content/uploads/"): + return f"https://wp.teeoff.no{path}" + return path + + return trimmed + + +def build_article_media_id(media_type: str, src: str) -> str: + digest = hashlib.sha1(f"{media_type}:{src}".encode("utf-8")).hexdigest()[:12] + return f"{media_type}-{digest}" + + +def sanitize_article_media(value: Any, title: str | None = None) -> list[dict[str, str]]: + if not isinstance(value, list): + return [] + + sanitized: list[dict[str, str]] = [] + seen: set[tuple[str, str]] = set() + fallback_text = str(title or "").strip() + + for item in value: + if not isinstance(item, dict): + continue + + media_type = str(item.get("type") or "image").strip().lower() + if media_type not in {"image", "video"}: + continue + + src = normalize_article_media_url(item.get("src")) + if not src: + continue + + dedupe_key = (media_type, src) + if dedupe_key in seen: + continue + seen.add(dedupe_key) + + poster = normalize_article_media_url(item.get("poster")) + alt = str(item.get("alt") or "").strip() + caption = str(item.get("caption") or "").strip() + media_id = str(item.get("id") or "").strip() or build_article_media_id(media_type, src) + + sanitized.append( + { + "id": media_id, + "type": media_type, + "src": src, + "alt": alt or fallback_text, + "caption": caption or alt or fallback_text, + "poster": poster, + } + ) + + return sanitized + + +def build_media_gallery_from_hero_images(hero_images: list[dict[str, str]]) -> list[dict[str, str]]: + return [ + { + "id": build_article_media_id("image", image["src"]), + "type": "image", + "src": image["src"], + "alt": image.get("alt") or "", + "caption": image.get("caption") or "", + "poster": "", + } + for image in hero_images + if image.get("src") + ] + + +def sanitize_featured_media_id(featured_media_id: str | None, media_gallery: list[dict[str, str]]) -> str | None: + candidate = str(featured_media_id or "").strip() + if candidate and any(item.get("id") == candidate and item.get("type") == "image" for item in media_gallery): + return candidate + + for item in media_gallery: + if item.get("type") == "image": + return item.get("id") + + return None + + +def build_hero_images_from_media_gallery( + media_gallery: list[dict[str, str]], + fallback_hero_images: list[dict[str, str]], + featured_media_id: str | None, +) -> list[dict[str, str]]: + image_media = [ + { + "src": item["src"], + "alt": item.get("alt") or "", + "caption": item.get("caption") or item.get("alt") or "", + "id": item.get("id") or "", + } + for item in media_gallery + if item.get("type") == "image" and item.get("src") + ] + + if not image_media: + return fallback_hero_images + + if featured_media_id: + featured_index = next( + (index for index, item in enumerate(image_media) if item.get("id") == featured_media_id), + None, + ) + if featured_index is not None and featured_index > 0: + featured_item = image_media.pop(featured_index) + image_media.insert(0, featured_item) + + return [ + { + "src": item["src"], + "alt": item.get("alt") or "", + "caption": item.get("caption") or item.get("alt") or "", + } + for item in image_media + ] + + def humanize_slug(slug: str | None) -> str: if not slug: return "Ukjent bane" @@ -898,6 +1127,8 @@ async def ensure_articles_table(conn): author_name VARCHAR(255), status VARCHAR(32) NOT NULL DEFAULT 'draft', hero_images JSONB NOT NULL DEFAULT '[]'::jsonb, + media_gallery JSONB NOT NULL DEFAULT '[]'::jsonb, + featured_media_id VARCHAR(255), content_html TEXT, source_url TEXT, source_label VARCHAR(255), @@ -910,6 +1141,14 @@ async def ensure_articles_table(conn): ALTER TABLE articles ADD COLUMN IF NOT EXISTS section VARCHAR(32) NOT NULL DEFAULT 'banebesok' """) + await conn.execute(""" + ALTER TABLE articles + ADD COLUMN IF NOT EXISTS media_gallery JSONB NOT NULL DEFAULT '[]'::jsonb + """) + await conn.execute(""" + ALTER TABLE articles + ADD COLUMN IF NOT EXISTS featured_media_id VARCHAR(255) + """) await conn.execute(""" UPDATE articles SET section = 'banebesok' @@ -1017,6 +1256,7 @@ async def lifespan(app: FastAPI): await ensure_articles_table(conn) await ensure_public_user_tables(conn) await ensure_scrape_jobs_table(conn) + app.state.contact_submission_tracker = {} print("✅ Database tilkoblet og pool opprettet") except Exception as e: print(f"❌ Databasefeil under oppstart: {e}") @@ -1362,6 +1602,79 @@ async def request_magic_link(request: Request, payload: PublicMagicLinkRequest): } +@app.post("/api/public/contact") +async def submit_public_contact_form(request: Request, payload: PublicContactFormRequest): + if not is_contact_form_configured(): + raise HTTPException(status_code=503, detail="Kontaktskjema er ikke konfigurert ennå.") + + if str(payload.website or "").strip(): + return { + "status": "success", + "detail": "Takk for meldingen. Vi svarer så snart vi kan.", + } + + name = str(payload.name or "").strip() + email = normalize_public_email(payload.email) + topic = str(payload.topic or "").strip() + message = str(payload.message or "").strip() + + if len(name) < 2 or len(name) > 120: + raise HTTPException(status_code=400, detail="Oppgi et gyldig navn.") + if not email or "@" not in email or len(email) > 255: + raise HTTPException(status_code=400, detail="Oppgi en gyldig e-postadresse.") + if len(topic) < 2 or len(topic) > 140: + raise HTTPException(status_code=400, detail="Oppgi et gyldig emne.") + if len(message) < 20 or len(message) > 5000: + raise HTTPException(status_code=400, detail="Meldingen må være mellom 20 og 5000 tegn.") + + now_ts = int(datetime.utcnow().timestamp()) + if payload.started_at and now_ts - int(payload.started_at) < CONTACT_FORM_MIN_FILL_SECONDS: + return { + "status": "success", + "detail": "Takk for meldingen. Vi svarer så snart vi kan.", + } + + ip_hash = hash_request_ip(request) + tracker: dict[str, list[int]] = getattr(app.state, "contact_submission_tracker", {}) + cutoff = now_ts - CONTACT_FORM_RATE_LIMIT_WINDOW_SECONDS + + for key in list(tracker.keys()): + recent = [ts for ts in tracker.get(key, []) if ts >= cutoff] + if recent: + tracker[key] = recent + else: + tracker.pop(key, None) + + rate_keys = [f"email:{email}"] + if ip_hash: + rate_keys.append(f"ip:{ip_hash}") + + for key in rate_keys: + attempts = tracker.get(key, []) + if len(attempts) >= CONTACT_FORM_RATE_LIMIT_MAX_SUBMISSIONS: + raise HTTPException( + status_code=429, + detail="For mange meldinger på kort tid. Prøv igjen senere.", + ) + + await send_contact_form_email( + sender_name=name, + sender_email=email, + topic=topic, + message=message, + ip_hash=ip_hash, + ) + + for key in rate_keys: + tracker.setdefault(key, []).append(now_ts) + app.state.contact_submission_tracker = tracker + + return { + "status": "success", + "detail": "Takk for meldingen. Vi svarer så snart vi kan.", + } + + @app.get("/api/public/auth/magic-link/verify") async def verify_magic_link( request: Request, @@ -1720,18 +2033,23 @@ async def upsert_admin_article(request: ArticleUpsertRequest): if status == "published" and not published_at: published_at = datetime.utcnow() - hero_images = sanitize_hero_images(request.hero_images) + fallback_hero_images = sanitize_hero_images(request.hero_images) + media_gallery = sanitize_article_media(request.media_gallery, request.title.strip()) + if not media_gallery and fallback_hero_images: + media_gallery = build_media_gallery_from_hero_images(fallback_hero_images) + featured_media_id = sanitize_featured_media_id(request.featured_media_id, media_gallery) + hero_images = build_hero_images_from_media_gallery(media_gallery, fallback_hero_images, featured_media_id) async with app.state.pool.acquire() as conn: row = await conn.fetchrow(""" INSERT INTO articles ( section, slug, title, description, excerpt, eyebrow, location_label, facility_name, facility_slug, author_name, status, hero_images, - content_html, source_url, source_label, published_at, updated_at + media_gallery, featured_media_id, content_html, source_url, source_label, published_at, updated_at ) VALUES ( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12::jsonb, - $13, $14, $15, $16, $17 + $13::jsonb, $14, $15, $16, $17, $18, $19 ) ON CONFLICT (slug) DO UPDATE SET section = EXCLUDED.section, @@ -1745,6 +2063,8 @@ async def upsert_admin_article(request: ArticleUpsertRequest): author_name = EXCLUDED.author_name, status = EXCLUDED.status, hero_images = EXCLUDED.hero_images, + media_gallery = EXCLUDED.media_gallery, + featured_media_id = EXCLUDED.featured_media_id, content_html = EXCLUDED.content_html, source_url = EXCLUDED.source_url, source_label = EXCLUDED.source_label, @@ -1764,6 +2084,8 @@ async def upsert_admin_article(request: ArticleUpsertRequest): (request.author_name or "TeeOff").strip(), status, json.dumps(hero_images), + json.dumps(media_gallery), + featured_media_id, request.content_html or "", (request.source_url or "").strip() or None, (request.source_label or "").strip() or None, @@ -1810,28 +2132,45 @@ async def seed_admin_articles_from_imported_json(): featured_image = item.get("featuredImage") or {} section, eyebrow = resolve_imported_article_section(item) - hero_images: list[dict[str, str]] = [] + media_gallery: list[dict[str, str]] = [] featured_url = str(featured_image.get("url") or "").strip() if featured_url: - hero_images.append( + media_gallery.append( { + "id": build_article_media_id("image", featured_url), + "type": "image", "src": featured_url, "alt": str(featured_image.get("alt") or item.get("title") or "").strip(), "caption": str(featured_image.get("caption") or item.get("title") or "").strip(), + "poster": "", } ) for url in extract_html_image_urls(content_html)[:5]: - if any(existing["src"] == url for existing in hero_images): + if any(existing["src"] == url for existing in media_gallery): continue - hero_images.append( + media_gallery.append( { + "id": build_article_media_id("image", url), + "type": "image", "src": url, "alt": str(item.get("title") or "").strip(), "caption": str(item.get("title") or "").strip(), + "poster": "", } ) + sanitized_media_gallery = sanitize_article_media(media_gallery, str(item.get("title") or "").strip()) + featured_media_id = sanitize_featured_media_id( + sanitized_media_gallery[0]["id"] if sanitized_media_gallery else None, + sanitized_media_gallery, + ) + hero_images = build_hero_images_from_media_gallery( + sanitized_media_gallery, + [], + featured_media_id, + ) + published_at = parse_optional_datetime(item.get("publishedAt")) updated_at = parse_optional_datetime(item.get("updatedAt")) or published_at or datetime.utcnow() @@ -1839,11 +2178,11 @@ async def seed_admin_articles_from_imported_json(): INSERT INTO articles ( section, slug, title, description, excerpt, eyebrow, location_label, facility_name, facility_slug, author_name, status, hero_images, - content_html, source_url, source_label, published_at, updated_at + media_gallery, featured_media_id, content_html, source_url, source_label, published_at, updated_at ) VALUES ( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, 'published', $11::jsonb, - $12, $13, $14, $15, $16 + $12::jsonb, $13, $14, $15, $16, $17, $18 ) ON CONFLICT (slug) DO UPDATE SET section = EXCLUDED.section, @@ -1857,6 +2196,8 @@ async def seed_admin_articles_from_imported_json(): author_name = EXCLUDED.author_name, status = EXCLUDED.status, hero_images = EXCLUDED.hero_images, + media_gallery = EXCLUDED.media_gallery, + featured_media_id = EXCLUDED.featured_media_id, content_html = EXCLUDED.content_html, source_url = EXCLUDED.source_url, source_label = EXCLUDED.source_label, @@ -1874,6 +2215,8 @@ async def seed_admin_articles_from_imported_json(): str(facility_slug) if facility_slug else None, str(((item.get("author") or {}).get("name")) or "TeeOff"), json.dumps(hero_images), + json.dumps(sanitized_media_gallery), + featured_media_id, content_html, str(item.get("link") or "").strip() or None, "Importert fra gamle TeeOff", diff --git a/backend/scrape_vtg.py b/backend/scrape_vtg.py index 3c172c5..f6ac626 100644 --- a/backend/scrape_vtg.py +++ b/backend/scrape_vtg.py @@ -1,7 +1,7 @@ """ TEE OFF - VEIEN TIL GOLF (VTG) SKRAPER MED GEMINI AI --------------------------------------------------------------------------- -Henter pris, beskrivelse (inkl. lånekøller/medlemskap) og kursdatoer fra VTG-sider. +Henter pris, beskrivelse (inkl. lånekøller/medlemskap/pakker) og kursdatoer fra VTG-sider. Støtter kommaseparerte URL-er. --------------------------------------------------------------------------- """ @@ -58,9 +58,15 @@ Du er en ekspert på norske golfklubber. Din oppgave er å lese en lang tekst fr OPPGAVER: 1. Finn standardprisen for VTG-kurset for en vanlig voksen person. (Returner KUN tallet). + VIKTIG PRISLOGIKK: + - Hvis klubben tilbyr både "kun VTG-kurs" og en pakke som inkluderer medlemskap/spillerett, skal du velge prisen på KUN SELVE KURSET som foreslatt_vtg_pris. + - Hvis klubben tilbyr et rimeligere kurs uten medlemskap, men også en dyrere pakke med medlemskap, er det alltid kursprisen uten medlemskap som skal returneres. + - Hvis klubben BARE tilbyr en samlet pakke med VTG + medlemskap/spillerett, returnerer du pakkeprisen. + - Ignorer medlemskapstilbud som ikke faktisk er knyttet til VTG-kurset. + - Ignorer priser for barn, junior, student, familie eller andre spesialgrupper hvis det finnes en vanlig voksenpris. 2. Skriv en KOMPRIMERT, selgende beskrivelse (maks 3-4 setninger). Du MÅ inkludere informasjon om: - - Er lån av køller/utstyr inkludert i kurset? - Inkluderer prisen et medlemskap/spillerett i klubben (og ev. for hvor lenge)? + - Hvis klubben tilbyr både kurs uten medlemskap og en egen pakke med medlemskap, må du nevne dette eksplisitt og oppgi pakkeprisen hvis den finnes i teksten. - Hva er omfanget? (F.eks. "12 timer praksis pluss e-læring"). Ignorer uvesentlig støy og lange historiske utgreiinger. 3. Finn alle kommende kursdatoer. Finn startdato/sluttdato for hvert kurs, og noter status ("Ledig", "Fulltegnet", "Venteliste"). @@ -72,14 +78,17 @@ OPPGAVE: Returner KUN et gyldig JSON-objekt med nøyaktig følgende struktur: {{ "foreslatt_vtg_pris": 1990, - "foreslatt_vtg_beskrivelse": "Kurset går over 12 timer inkludert obligatorisk e-læring. Lån av golfkøller er inkludert under hele kurset, og prisen gir deg også fritt spill og medlemskap ut året.", + "foreslatt_vtg_beskrivelse": "Kurset går over 12 timer inkludert obligatorisk e-læring, og lån av golfkøller er inkludert. Selve VTG-kurset koster 1990 kroner. Klubben tilbyr også en pakke med kurs og medlemskap ut året til 3490 kroner.", "foreslatt_vtg_datoer": [ {{"dato": "12.-14. mai", "status": "Fulltegnet"}}, {{"dato": "5.-7. juni", "status": "Ledig"}} ], - "ai_begrunnelse": "Fant voksenpris på 1990,-. Teksten nevnte eksplisitt at medlemskap ut året er med i prisen, og at man får låne utstyr." + "ai_begrunnelse": "Fant voksenpris på 1990 kroner for selve VTG-kurset. Det stod også at klubben har en egen pakke med medlemskap til 3490 kroner, samt at lån av utstyr er inkludert." }} -Merk: Sett foreslatt_vtg_pris til null (null) hvis du ikke finner den. Hvis du ikke finner datoer, la listen være tom []. +Merk: +- Sett foreslatt_vtg_pris til null (null) hvis du ikke finner en tydelig voksenpris. +- Hvis du ikke finner datoer, la listen være tom []. +- Hvis prisen du returnerer faktisk er en pakkepris med medlemskap, må det sies tydelig i foreslatt_vtg_beskrivelse og ai_begrunnelse. """ try: diff --git a/bilde1.png b/bilde1.png deleted file mode 100644 index d8b43f8..0000000 Binary files a/bilde1.png and /dev/null differ diff --git a/frontend/public/wp-content/uploads/13-1.jpg b/frontend/public/wp-content/uploads/13-1.jpg new file mode 100644 index 0000000..25755eb Binary files /dev/null and b/frontend/public/wp-content/uploads/13-1.jpg differ diff --git a/frontend/public/wp-content/uploads/13-utslag-1.jpg b/frontend/public/wp-content/uploads/13-utslag-1.jpg new file mode 100644 index 0000000..b04c1cb Binary files /dev/null and b/frontend/public/wp-content/uploads/13-utslag-1.jpg differ diff --git a/frontend/public/wp-content/uploads/13green-1.jpg b/frontend/public/wp-content/uploads/13green-1.jpg new file mode 100644 index 0000000..b88bb5e Binary files /dev/null and b/frontend/public/wp-content/uploads/13green-1.jpg differ diff --git a/frontend/public/wp-content/uploads/15-1.jpg b/frontend/public/wp-content/uploads/15-1.jpg new file mode 100644 index 0000000..e2d9ea1 Binary files /dev/null and b/frontend/public/wp-content/uploads/15-1.jpg differ diff --git a/frontend/public/wp-content/uploads/15-3-1.jpg b/frontend/public/wp-content/uploads/15-3-1.jpg new file mode 100644 index 0000000..21e507b Binary files /dev/null and b/frontend/public/wp-content/uploads/15-3-1.jpg differ diff --git a/frontend/public/wp-content/uploads/15green-1.jpg b/frontend/public/wp-content/uploads/15green-1.jpg new file mode 100644 index 0000000..c43ed48 Binary files /dev/null and b/frontend/public/wp-content/uploads/15green-1.jpg differ diff --git a/frontend/public/wp-content/uploads/16-1-1.jpg b/frontend/public/wp-content/uploads/16-1-1.jpg new file mode 100644 index 0000000..e21568f Binary files /dev/null and b/frontend/public/wp-content/uploads/16-1-1.jpg differ diff --git a/frontend/public/wp-content/uploads/16-2-1.jpg b/frontend/public/wp-content/uploads/16-2-1.jpg new file mode 100644 index 0000000..039f806 Binary files /dev/null and b/frontend/public/wp-content/uploads/16-2-1.jpg differ diff --git a/frontend/public/wp-content/uploads/16-3-1.jpg b/frontend/public/wp-content/uploads/16-3-1.jpg new file mode 100644 index 0000000..841d641 Binary files /dev/null and b/frontend/public/wp-content/uploads/16-3-1.jpg differ diff --git a/frontend/public/wp-content/uploads/17-1.jpg b/frontend/public/wp-content/uploads/17-1.jpg new file mode 100644 index 0000000..3b2a116 Binary files /dev/null and b/frontend/public/wp-content/uploads/17-1.jpg differ diff --git a/frontend/public/wp-content/uploads/18-1-1.jpg b/frontend/public/wp-content/uploads/18-1-1.jpg new file mode 100644 index 0000000..b51df84 Binary files /dev/null and b/frontend/public/wp-content/uploads/18-1-1.jpg differ diff --git a/frontend/public/wp-content/uploads/18-green-1-1.jpg b/frontend/public/wp-content/uploads/18-green-1-1.jpg new file mode 100644 index 0000000..ac4b501 Binary files /dev/null and b/frontend/public/wp-content/uploads/18-green-1-1.jpg differ diff --git a/frontend/public/wp-content/uploads/2019-03-19-12.08.14-teeoff72b88afb7a22.jpg b/frontend/public/wp-content/uploads/2019-03-19-12.08.14-teeoff72b88afb7a22.jpg new file mode 100644 index 0000000..0e0bb46 Binary files /dev/null and b/frontend/public/wp-content/uploads/2019-03-19-12.08.14-teeoff72b88afb7a22.jpg differ diff --git a/frontend/public/wp-content/uploads/Aapne-baner169.png b/frontend/public/wp-content/uploads/Aapne-baner169.png new file mode 100644 index 0000000..62df68a Binary files /dev/null and b/frontend/public/wp-content/uploads/Aapne-baner169.png differ diff --git a/frontend/public/wp-content/uploads/AurskogGK1.jpg b/frontend/public/wp-content/uploads/AurskogGK1.jpg new file mode 100644 index 0000000..b2197f9 Binary files /dev/null and b/frontend/public/wp-content/uploads/AurskogGK1.jpg differ diff --git a/frontend/public/wp-content/uploads/Baneaapning.jpg b/frontend/public/wp-content/uploads/Baneaapning.jpg new file mode 100644 index 0000000..06bcec8 Binary files /dev/null and b/frontend/public/wp-content/uploads/Baneaapning.jpg differ diff --git a/frontend/public/wp-content/uploads/Bing-Kart-–-Veibeskrivelser-reiseplanlegging-trafikkameraer-med-mer.pdf b/frontend/public/wp-content/uploads/Bing-Kart-–-Veibeskrivelser-reiseplanlegging-trafikkameraer-med-mer.pdf new file mode 100644 index 0000000..dc688e3 Binary files /dev/null and b/frontend/public/wp-content/uploads/Bing-Kart-–-Veibeskrivelser-reiseplanlegging-trafikkameraer-med-mer.pdf differ diff --git a/frontend/public/wp-content/uploads/BjaavannBloggen.jpg b/frontend/public/wp-content/uploads/BjaavannBloggen.jpg new file mode 100644 index 0000000..fde2386 Binary files /dev/null and b/frontend/public/wp-content/uploads/BjaavannBloggen.jpg differ diff --git a/frontend/public/wp-content/uploads/Bjaavannbloggen2.jpg b/frontend/public/wp-content/uploads/Bjaavannbloggen2.jpg new file mode 100644 index 0000000..ce59fe7 Binary files /dev/null and b/frontend/public/wp-content/uploads/Bjaavannbloggen2.jpg differ diff --git a/frontend/public/wp-content/uploads/BodoGP_video.jpg b/frontend/public/wp-content/uploads/BodoGP_video.jpg new file mode 100644 index 0000000..b30e642 Binary files /dev/null and b/frontend/public/wp-content/uploads/BodoGP_video.jpg differ diff --git a/frontend/public/wp-content/uploads/Budersand-Sylt-DE.jpg b/frontend/public/wp-content/uploads/Budersand-Sylt-DE.jpg new file mode 100644 index 0000000..1d1f613 Binary files /dev/null and b/frontend/public/wp-content/uploads/Budersand-Sylt-DE.jpg differ diff --git a/frontend/public/wp-content/uploads/DSC_0706.jpg b/frontend/public/wp-content/uploads/DSC_0706.jpg new file mode 100644 index 0000000..fe697c6 Binary files /dev/null and b/frontend/public/wp-content/uploads/DSC_0706.jpg differ diff --git a/frontend/public/wp-content/uploads/DrammenGK-sommertilbud.jpg b/frontend/public/wp-content/uploads/DrammenGK-sommertilbud.jpg new file mode 100644 index 0000000..2528b90 Binary files /dev/null and b/frontend/public/wp-content/uploads/DrammenGK-sommertilbud.jpg differ diff --git a/frontend/public/wp-content/uploads/DrammenGK.jpg b/frontend/public/wp-content/uploads/DrammenGK.jpg new file mode 100644 index 0000000..7ddd3c2 Binary files /dev/null and b/frontend/public/wp-content/uploads/DrammenGK.jpg differ diff --git a/frontend/public/wp-content/uploads/DrammenGK1691.jpg b/frontend/public/wp-content/uploads/DrammenGK1691.jpg new file mode 100644 index 0000000..fe07757 Binary files /dev/null and b/frontend/public/wp-content/uploads/DrammenGK1691.jpg differ diff --git a/frontend/public/wp-content/uploads/DrammenGK1692.jpg b/frontend/public/wp-content/uploads/DrammenGK1692.jpg new file mode 100644 index 0000000..4af8bd7 Binary files /dev/null and b/frontend/public/wp-content/uploads/DrammenGK1692.jpg differ diff --git a/frontend/public/wp-content/uploads/DrammenGK1693.jpg b/frontend/public/wp-content/uploads/DrammenGK1693.jpg new file mode 100644 index 0000000..8a699ab Binary files /dev/null and b/frontend/public/wp-content/uploads/DrammenGK1693.jpg differ diff --git a/frontend/public/wp-content/uploads/DrammenGK1694.jpg b/frontend/public/wp-content/uploads/DrammenGK1694.jpg new file mode 100644 index 0000000..2c1b897 Binary files /dev/null and b/frontend/public/wp-content/uploads/DrammenGK1694.jpg differ diff --git a/frontend/public/wp-content/uploads/DroebakGK.jpg b/frontend/public/wp-content/uploads/DroebakGK.jpg new file mode 100644 index 0000000..d4f8463 Binary files /dev/null and b/frontend/public/wp-content/uploads/DroebakGK.jpg differ diff --git a/frontend/public/wp-content/uploads/EGA.jpg b/frontend/public/wp-content/uploads/EGA.jpg new file mode 100644 index 0000000..0488437 Binary files /dev/null and b/frontend/public/wp-content/uploads/EGA.jpg differ diff --git a/frontend/public/wp-content/uploads/EgersundTopp.jpg b/frontend/public/wp-content/uploads/EgersundTopp.jpg new file mode 100644 index 0000000..935b5dc Binary files /dev/null and b/frontend/public/wp-content/uploads/EgersundTopp.jpg differ diff --git a/frontend/public/wp-content/uploads/Falsterbo-Skaane-SE.jpg b/frontend/public/wp-content/uploads/Falsterbo-Skaane-SE.jpg new file mode 100644 index 0000000..3970659 Binary files /dev/null and b/frontend/public/wp-content/uploads/Falsterbo-Skaane-SE.jpg differ diff --git a/frontend/public/wp-content/uploads/FetGK-1.jpg b/frontend/public/wp-content/uploads/FetGK-1.jpg new file mode 100644 index 0000000..ad0d3c1 Binary files /dev/null and b/frontend/public/wp-content/uploads/FetGK-1.jpg differ diff --git a/frontend/public/wp-content/uploads/Funksjon_golfpakker1.jpg b/frontend/public/wp-content/uploads/Funksjon_golfpakker1.jpg new file mode 100644 index 0000000..d93e577 Binary files /dev/null and b/frontend/public/wp-content/uploads/Funksjon_golfpakker1.jpg differ diff --git a/frontend/public/wp-content/uploads/GjersjoenGK2-169.jpg b/frontend/public/wp-content/uploads/GjersjoenGK2-169.jpg new file mode 100644 index 0000000..e97515a Binary files /dev/null and b/frontend/public/wp-content/uploads/GjersjoenGK2-169.jpg differ diff --git a/frontend/public/wp-content/uploads/GjersjoenGK2.jpg b/frontend/public/wp-content/uploads/GjersjoenGK2.jpg new file mode 100644 index 0000000..bde24f4 Binary files /dev/null and b/frontend/public/wp-content/uploads/GjersjoenGK2.jpg differ diff --git a/frontend/public/wp-content/uploads/Golfbanefotografering.jpg b/frontend/public/wp-content/uploads/Golfbanefotografering.jpg new file mode 100644 index 0000000..21dedf8 Binary files /dev/null and b/frontend/public/wp-content/uploads/Golfbanefotografering.jpg differ diff --git a/frontend/public/wp-content/uploads/Golfbanen_Norge1.jpg b/frontend/public/wp-content/uploads/Golfbanen_Norge1.jpg new file mode 100644 index 0000000..07dc6fd Binary files /dev/null and b/frontend/public/wp-content/uploads/Golfbanen_Norge1.jpg differ diff --git a/frontend/public/wp-content/uploads/GriniGK-1.jpg b/frontend/public/wp-content/uploads/GriniGK-1.jpg new file mode 100644 index 0000000..1dc4bee Binary files /dev/null and b/frontend/public/wp-content/uploads/GriniGK-1.jpg differ diff --git a/frontend/public/wp-content/uploads/HakadalBloggen.jpg b/frontend/public/wp-content/uploads/HakadalBloggen.jpg new file mode 100644 index 0000000..d9107d7 Binary files /dev/null and b/frontend/public/wp-content/uploads/HakadalBloggen.jpg differ diff --git a/frontend/public/wp-content/uploads/HaugerGK1.jpg b/frontend/public/wp-content/uploads/HaugerGK1.jpg new file mode 100644 index 0000000..c2423df Binary files /dev/null and b/frontend/public/wp-content/uploads/HaugerGK1.jpg differ diff --git a/frontend/public/wp-content/uploads/HemsedalGK.jpg b/frontend/public/wp-content/uploads/HemsedalGK.jpg new file mode 100644 index 0000000..658fcc1 Binary files /dev/null and b/frontend/public/wp-content/uploads/HemsedalGK.jpg differ diff --git a/frontend/public/wp-content/uploads/Hjemmeside-velkomstbilde.jpg b/frontend/public/wp-content/uploads/Hjemmeside-velkomstbilde.jpg new file mode 100644 index 0000000..1fa8041 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hjemmeside-velkomstbilde.jpg differ diff --git a/frontend/public/wp-content/uploads/HoltsmarkGK.jpg b/frontend/public/wp-content/uploads/HoltsmarkGK.jpg new file mode 100644 index 0000000..d3848d7 Binary files /dev/null and b/frontend/public/wp-content/uploads/HoltsmarkGK.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-01.jpg b/frontend/public/wp-content/uploads/Hull-01.jpg new file mode 100644 index 0000000..ded2f2c Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-01.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-02.jpg b/frontend/public/wp-content/uploads/Hull-02.jpg new file mode 100644 index 0000000..2af33ef Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-02.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-03-green.jpg b/frontend/public/wp-content/uploads/Hull-03-green.jpg new file mode 100644 index 0000000..d339c56 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-03-green.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-03.jpg b/frontend/public/wp-content/uploads/Hull-03.jpg new file mode 100644 index 0000000..c3aa0f8 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-03.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-04-green.jpg b/frontend/public/wp-content/uploads/Hull-04-green.jpg new file mode 100644 index 0000000..56c8747 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-04-green.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-05-green.jpg b/frontend/public/wp-content/uploads/Hull-05-green.jpg new file mode 100644 index 0000000..018300a Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-05-green.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-07.jpg b/frontend/public/wp-content/uploads/Hull-07.jpg new file mode 100644 index 0000000..9e9e654 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-07.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-08.jpg b/frontend/public/wp-content/uploads/Hull-08.jpg new file mode 100644 index 0000000..b314326 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-08.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-09-green.jpg b/frontend/public/wp-content/uploads/Hull-09-green.jpg new file mode 100644 index 0000000..778fd51 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-09-green.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-09.jpg b/frontend/public/wp-content/uploads/Hull-09.jpg new file mode 100644 index 0000000..a86a1c0 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-09.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-1-Herdla.jpg b/frontend/public/wp-content/uploads/Hull-1-Herdla.jpg new file mode 100644 index 0000000..eb81478 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-1-Herdla.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-1-Ogna.jpg b/frontend/public/wp-content/uploads/Hull-1-Ogna.jpg new file mode 100644 index 0000000..28e7943 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-1-Ogna.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-10-Drammen.jpg b/frontend/public/wp-content/uploads/Hull-10-Drammen.jpg new file mode 100644 index 0000000..48d4b2f Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-10-Drammen.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-10-Nes-09.jpg b/frontend/public/wp-content/uploads/Hull-10-Nes-09.jpg new file mode 100644 index 0000000..ce68335 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-10-Nes-09.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-11-Sandefjord.jpg b/frontend/public/wp-content/uploads/Hull-11-Sandefjord.jpg new file mode 100644 index 0000000..1575415 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-11-Sandefjord.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-11-paavei.jpg b/frontend/public/wp-content/uploads/Hull-11-paavei.jpg new file mode 100644 index 0000000..e08278d Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-11-paavei.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-12-Fana.jpg b/frontend/public/wp-content/uploads/Hull-12-Fana.jpg new file mode 100644 index 0000000..bf9afe5 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-12-Fana.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-12.jpg b/frontend/public/wp-content/uploads/Hull-12.jpg new file mode 100644 index 0000000..055c25b Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-12.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-13-Sunnfjord.jpg b/frontend/public/wp-content/uploads/Hull-13-Sunnfjord.jpg new file mode 100644 index 0000000..8670475 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-13-Sunnfjord.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-14-Atlungstad.jpg b/frontend/public/wp-content/uploads/Hull-14-Atlungstad.jpg new file mode 100644 index 0000000..1914211 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-14-Atlungstad.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-15-Onsoey.jpg b/frontend/public/wp-content/uploads/Hull-15-Onsoey.jpg new file mode 100644 index 0000000..08bb490 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-15-Onsoey.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-15.jpg b/frontend/public/wp-content/uploads/Hull-15.jpg new file mode 100644 index 0000000..d4dd2d7 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-15.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-16-Trysil.jpg b/frontend/public/wp-content/uploads/Hull-16-Trysil.jpg new file mode 100644 index 0000000..74e2c20 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-16-Trysil.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-16.jpg b/frontend/public/wp-content/uploads/Hull-16.jpg new file mode 100644 index 0000000..33ba627 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-16.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-17-Haga.jpg b/frontend/public/wp-content/uploads/Hull-17-Haga.jpg new file mode 100644 index 0000000..30381f3 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-17-Haga.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-18-Bjaavann.jpg b/frontend/public/wp-content/uploads/Hull-18-Bjaavann.jpg new file mode 100644 index 0000000..a59d4c1 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-18-Bjaavann.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-18-Elverum.jpg b/frontend/public/wp-content/uploads/Hull-18-Elverum.jpg new file mode 100644 index 0000000..5810011 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-18-Elverum.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-18-green.jpg b/frontend/public/wp-content/uploads/Hull-18-green.jpg new file mode 100644 index 0000000..1f88c93 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-18-green.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-2-Steinkjer.jpg b/frontend/public/wp-content/uploads/Hull-2-Steinkjer.jpg new file mode 100644 index 0000000..c6af571 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-2-Steinkjer.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-3-Asker1.jpg b/frontend/public/wp-content/uploads/Hull-3-Asker1.jpg new file mode 100644 index 0000000..b8cb6fe Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-3-Asker1.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-4-Midt-Troms.jpg b/frontend/public/wp-content/uploads/Hull-4-Midt-Troms.jpg new file mode 100644 index 0000000..3c2e5eb Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-4-Midt-Troms.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-4-Molde.jpg b/frontend/public/wp-content/uploads/Hull-4-Molde.jpg new file mode 100644 index 0000000..ce99739 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-4-Molde.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-5-Hauger.jpg b/frontend/public/wp-content/uploads/Hull-5-Hauger.jpg new file mode 100644 index 0000000..a38ca33 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-5-Hauger.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-5-Kvinnherad.jpg b/frontend/public/wp-content/uploads/Hull-5-Kvinnherad.jpg new file mode 100644 index 0000000..5d48c72 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-5-Kvinnherad.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-6-Jaeren.jpg b/frontend/public/wp-content/uploads/Hull-6-Jaeren.jpg new file mode 100644 index 0000000..294c0d2 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-6-Jaeren.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-7-Egersund.jpg b/frontend/public/wp-content/uploads/Hull-7-Egersund.jpg new file mode 100644 index 0000000..c28ce4d Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-7-Egersund.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-7-Gjerdrum.jpg b/frontend/public/wp-content/uploads/Hull-7-Gjerdrum.jpg new file mode 100644 index 0000000..b830ccf Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-7-Gjerdrum.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-8-Lofoten-Links.jpg b/frontend/public/wp-content/uploads/Hull-8-Lofoten-Links.jpg new file mode 100644 index 0000000..285f873 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-8-Lofoten-Links.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-8-Trondheim.jpg b/frontend/public/wp-content/uploads/Hull-8-Trondheim.jpg new file mode 100644 index 0000000..19e42ff Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-8-Trondheim.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-9-Kongsberg.jpg b/frontend/public/wp-content/uploads/Hull-9-Kongsberg.jpg new file mode 100644 index 0000000..95f07d7 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-9-Kongsberg.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull-9-Noetteroey.jpg b/frontend/public/wp-content/uploads/Hull-9-Noetteroey.jpg new file mode 100644 index 0000000..11eeca5 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull-9-Noetteroey.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull11-GamleFredrikstadGK1.jpg b/frontend/public/wp-content/uploads/Hull11-GamleFredrikstadGK1.jpg new file mode 100644 index 0000000..f69a0d6 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull11-GamleFredrikstadGK1.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull18-BjaavannGK1.jpg b/frontend/public/wp-content/uploads/Hull18-BjaavannGK1.jpg new file mode 100644 index 0000000..5b5ec3f Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull18-BjaavannGK1.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull3-OsloGK1.jpg b/frontend/public/wp-content/uploads/Hull3-OsloGK1.jpg new file mode 100644 index 0000000..e8e064d Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull3-OsloGK1.jpg differ diff --git a/frontend/public/wp-content/uploads/Hull6.jpg b/frontend/public/wp-content/uploads/Hull6.jpg new file mode 100644 index 0000000..8b2e2f8 Binary files /dev/null and b/frontend/public/wp-content/uploads/Hull6.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_1036-450x300.jpg b/frontend/public/wp-content/uploads/IMG_1036-450x300.jpg new file mode 100644 index 0000000..d1caa45 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_1036-450x300.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_1036-970x647.jpg b/frontend/public/wp-content/uploads/IMG_1036-970x647.jpg new file mode 100644 index 0000000..84dacf9 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_1036-970x647.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_1036.jpg b/frontend/public/wp-content/uploads/IMG_1036.jpg new file mode 100644 index 0000000..512dfc7 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_1036.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_1390_1600.jpg b/frontend/public/wp-content/uploads/IMG_1390_1600.jpg new file mode 100644 index 0000000..e150677 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_1390_1600.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_123752.jpg b/frontend/public/wp-content/uploads/IMG_20161010_123752.jpg new file mode 100644 index 0000000..a68a985 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_123752.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_124430.jpg b/frontend/public/wp-content/uploads/IMG_20161010_124430.jpg new file mode 100644 index 0000000..5d82679 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_124430.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_130801.jpg b/frontend/public/wp-content/uploads/IMG_20161010_130801.jpg new file mode 100644 index 0000000..9db5fb8 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_130801.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_130840.jpg b/frontend/public/wp-content/uploads/IMG_20161010_130840.jpg new file mode 100644 index 0000000..0db8442 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_130840.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_132244.jpg b/frontend/public/wp-content/uploads/IMG_20161010_132244.jpg new file mode 100644 index 0000000..6cd1a3b Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_132244.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_132920.jpg b/frontend/public/wp-content/uploads/IMG_20161010_132920.jpg new file mode 100644 index 0000000..15bb169 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_132920.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_133614.jpg b/frontend/public/wp-content/uploads/IMG_20161010_133614.jpg new file mode 100644 index 0000000..a1d84bf Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_133614.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_134757.jpg b/frontend/public/wp-content/uploads/IMG_20161010_134757.jpg new file mode 100644 index 0000000..f0a8edb Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_134757.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_140229.jpg b/frontend/public/wp-content/uploads/IMG_20161010_140229.jpg new file mode 100644 index 0000000..6636335 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_140229.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_140623.jpg b/frontend/public/wp-content/uploads/IMG_20161010_140623.jpg new file mode 100644 index 0000000..41fe875 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_140623.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_142832.jpg b/frontend/public/wp-content/uploads/IMG_20161010_142832.jpg new file mode 100644 index 0000000..9f910fd Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_142832.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_150844.jpg b/frontend/public/wp-content/uploads/IMG_20161010_150844.jpg new file mode 100644 index 0000000..e11caca Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_150844.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_151204.jpg b/frontend/public/wp-content/uploads/IMG_20161010_151204.jpg new file mode 100644 index 0000000..112cb7c Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_151204.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_151340-1.jpg b/frontend/public/wp-content/uploads/IMG_20161010_151340-1.jpg new file mode 100644 index 0000000..26f79a0 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_151340-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_152138.jpg b/frontend/public/wp-content/uploads/IMG_20161010_152138.jpg new file mode 100644 index 0000000..cfc082e Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_152138.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_154244.jpg b/frontend/public/wp-content/uploads/IMG_20161010_154244.jpg new file mode 100644 index 0000000..a530406 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_154244.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_155424.jpg b/frontend/public/wp-content/uploads/IMG_20161010_155424.jpg new file mode 100644 index 0000000..34ff806 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_155424.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_160352.jpg b/frontend/public/wp-content/uploads/IMG_20161010_160352.jpg new file mode 100644 index 0000000..33e4ad1 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_160352.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_160804.jpg b/frontend/public/wp-content/uploads/IMG_20161010_160804.jpg new file mode 100644 index 0000000..56089f4 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_160804.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161010_160831.jpg b/frontend/public/wp-content/uploads/IMG_20161010_160831.jpg new file mode 100644 index 0000000..1610ea1 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161010_160831.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20161012_155811-1-1-.jpg b/frontend/public/wp-content/uploads/IMG_20161012_155811-1-1-.jpg new file mode 100644 index 0000000..6dc549e Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20161012_155811-1-1-.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170321_115423.jpg b/frontend/public/wp-content/uploads/IMG_20170321_115423.jpg new file mode 100644 index 0000000..4d09ffb Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170321_115423.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170321_122129.jpg b/frontend/public/wp-content/uploads/IMG_20170321_122129.jpg new file mode 100644 index 0000000..3a7adec Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170321_122129.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170321_124748.jpg b/frontend/public/wp-content/uploads/IMG_20170321_124748.jpg new file mode 100644 index 0000000..600be95 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170321_124748.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170321_125348.jpg b/frontend/public/wp-content/uploads/IMG_20170321_125348.jpg new file mode 100644 index 0000000..5c2af0c Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170321_125348.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170321_125848.jpg b/frontend/public/wp-content/uploads/IMG_20170321_125848.jpg new file mode 100644 index 0000000..4d1546c Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170321_125848.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170321_133317.jpg b/frontend/public/wp-content/uploads/IMG_20170321_133317.jpg new file mode 100644 index 0000000..0c004ed Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170321_133317.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170321_133822.jpg b/frontend/public/wp-content/uploads/IMG_20170321_133822.jpg new file mode 100644 index 0000000..3e94b5e Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170321_133822.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170321_145725.jpg b/frontend/public/wp-content/uploads/IMG_20170321_145725.jpg new file mode 100644 index 0000000..336bf4e Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170321_145725.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170321_150321.jpg b/frontend/public/wp-content/uploads/IMG_20170321_150321.jpg new file mode 100644 index 0000000..fb4c88e Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170321_150321.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_102806.jpg b/frontend/public/wp-content/uploads/IMG_20170322_102806.jpg new file mode 100644 index 0000000..fcaa231 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_102806.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_102811.jpg b/frontend/public/wp-content/uploads/IMG_20170322_102811.jpg new file mode 100644 index 0000000..dfdf475 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_102811.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_113825.jpg b/frontend/public/wp-content/uploads/IMG_20170322_113825.jpg new file mode 100644 index 0000000..fcdb227 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_113825.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_114817.jpg b/frontend/public/wp-content/uploads/IMG_20170322_114817.jpg new file mode 100644 index 0000000..59d9cb7 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_114817.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_115102-1.jpg b/frontend/public/wp-content/uploads/IMG_20170322_115102-1.jpg new file mode 100644 index 0000000..6b07c52 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_115102-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_115844-1.jpg b/frontend/public/wp-content/uploads/IMG_20170322_115844-1.jpg new file mode 100644 index 0000000..298a8c5 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_115844-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_120521.jpg b/frontend/public/wp-content/uploads/IMG_20170322_120521.jpg new file mode 100644 index 0000000..a3f095e Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_120521.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_133714-1.jpg b/frontend/public/wp-content/uploads/IMG_20170322_133714-1.jpg new file mode 100644 index 0000000..dbc6d15 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_133714-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_134847-1.jpg b/frontend/public/wp-content/uploads/IMG_20170322_134847-1.jpg new file mode 100644 index 0000000..a8611b8 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_134847-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_140324-1.jpg b/frontend/public/wp-content/uploads/IMG_20170322_140324-1.jpg new file mode 100644 index 0000000..b572465 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_140324-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_140400-1.jpg b/frontend/public/wp-content/uploads/IMG_20170322_140400-1.jpg new file mode 100644 index 0000000..3c34bce Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_140400-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_140400-3.jpg b/frontend/public/wp-content/uploads/IMG_20170322_140400-3.jpg new file mode 100644 index 0000000..741e076 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_140400-3.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_143017-1.jpg b/frontend/public/wp-content/uploads/IMG_20170322_143017-1.jpg new file mode 100644 index 0000000..e65577e Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_143017-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_143208-1.jpg b/frontend/public/wp-content/uploads/IMG_20170322_143208-1.jpg new file mode 100644 index 0000000..b711b21 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_143208-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_144042-1.jpg b/frontend/public/wp-content/uploads/IMG_20170322_144042-1.jpg new file mode 100644 index 0000000..333f36f Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_144042-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170322_153238.jpg b/frontend/public/wp-content/uploads/IMG_20170322_153238.jpg new file mode 100644 index 0000000..3c2bcca Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170322_153238.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170910_193037-min.jpg b/frontend/public/wp-content/uploads/IMG_20170910_193037-min.jpg new file mode 100644 index 0000000..23453f2 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170910_193037-min.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170918_172854-min.jpg b/frontend/public/wp-content/uploads/IMG_20170918_172854-min.jpg new file mode 100644 index 0000000..1a6d922 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170918_172854-min.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170923.jpg b/frontend/public/wp-content/uploads/IMG_20170923.jpg new file mode 100644 index 0000000..b0dafca Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170923.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20170930_104631.jpg b/frontend/public/wp-content/uploads/IMG_20170930_104631.jpg new file mode 100644 index 0000000..839e2f7 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20170930_104631.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_111653.jpg b/frontend/public/wp-content/uploads/IMG_20171013_111653.jpg new file mode 100644 index 0000000..420c02e Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_111653.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_121558.jpg b/frontend/public/wp-content/uploads/IMG_20171013_121558.jpg new file mode 100644 index 0000000..76a9e6a Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_121558.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_124955.jpg b/frontend/public/wp-content/uploads/IMG_20171013_124955.jpg new file mode 100644 index 0000000..a778470 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_124955.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_125431.jpg b/frontend/public/wp-content/uploads/IMG_20171013_125431.jpg new file mode 100644 index 0000000..92f9e1b Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_125431.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_131612.jpg b/frontend/public/wp-content/uploads/IMG_20171013_131612.jpg new file mode 100644 index 0000000..2fbacb2 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_131612.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_132443.jpg b/frontend/public/wp-content/uploads/IMG_20171013_132443.jpg new file mode 100644 index 0000000..b292760 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_132443.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_133008.jpg b/frontend/public/wp-content/uploads/IMG_20171013_133008.jpg new file mode 100644 index 0000000..cec1c4f Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_133008.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_133705.jpg b/frontend/public/wp-content/uploads/IMG_20171013_133705.jpg new file mode 100644 index 0000000..dec53ae Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_133705.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_141016.jpg b/frontend/public/wp-content/uploads/IMG_20171013_141016.jpg new file mode 100644 index 0000000..7e5fe56 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_141016.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_143147.jpg b/frontend/public/wp-content/uploads/IMG_20171013_143147.jpg new file mode 100644 index 0000000..2b9c29f Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_143147.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_143212.jpg b/frontend/public/wp-content/uploads/IMG_20171013_143212.jpg new file mode 100644 index 0000000..a85ecf1 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_143212.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_145005.jpg b/frontend/public/wp-content/uploads/IMG_20171013_145005.jpg new file mode 100644 index 0000000..8b2cc0a Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_145005.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_145238.jpg b/frontend/public/wp-content/uploads/IMG_20171013_145238.jpg new file mode 100644 index 0000000..e17645f Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_145238.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_151525.jpg b/frontend/public/wp-content/uploads/IMG_20171013_151525.jpg new file mode 100644 index 0000000..eeed17f Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_151525.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171013_154834.jpg b/frontend/public/wp-content/uploads/IMG_20171013_154834.jpg new file mode 100644 index 0000000..38189aa Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171013_154834.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_110533.jpg b/frontend/public/wp-content/uploads/IMG_20171109_110533.jpg new file mode 100644 index 0000000..285e714 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_110533.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_111422.jpg b/frontend/public/wp-content/uploads/IMG_20171109_111422.jpg new file mode 100644 index 0000000..b701add Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_111422.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_112720.jpg b/frontend/public/wp-content/uploads/IMG_20171109_112720.jpg new file mode 100644 index 0000000..b0de8c7 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_112720.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_114144.jpg b/frontend/public/wp-content/uploads/IMG_20171109_114144.jpg new file mode 100644 index 0000000..0cf5d50 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_114144.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_115840.jpg b/frontend/public/wp-content/uploads/IMG_20171109_115840.jpg new file mode 100644 index 0000000..1556d41 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_115840.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_121037.jpg b/frontend/public/wp-content/uploads/IMG_20171109_121037.jpg new file mode 100644 index 0000000..d90922a Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_121037.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_121631.jpg b/frontend/public/wp-content/uploads/IMG_20171109_121631.jpg new file mode 100644 index 0000000..0802307 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_121631.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_122222.jpg b/frontend/public/wp-content/uploads/IMG_20171109_122222.jpg new file mode 100644 index 0000000..eb8e427 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_122222.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_122614.jpg b/frontend/public/wp-content/uploads/IMG_20171109_122614.jpg new file mode 100644 index 0000000..2861dc3 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_122614.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_123710.jpg b/frontend/public/wp-content/uploads/IMG_20171109_123710.jpg new file mode 100644 index 0000000..c3b0518 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_123710.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_123901.jpg b/frontend/public/wp-content/uploads/IMG_20171109_123901.jpg new file mode 100644 index 0000000..82af693 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_123901.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_125623.jpg b/frontend/public/wp-content/uploads/IMG_20171109_125623.jpg new file mode 100644 index 0000000..e671575 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_125623.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_131703.jpg b/frontend/public/wp-content/uploads/IMG_20171109_131703.jpg new file mode 100644 index 0000000..0b833d9 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_131703.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_132445.jpg b/frontend/public/wp-content/uploads/IMG_20171109_132445.jpg new file mode 100644 index 0000000..26f7bf3 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_132445.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_133536.jpg b/frontend/public/wp-content/uploads/IMG_20171109_133536.jpg new file mode 100644 index 0000000..ceb9c55 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_133536.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_135730.jpg b/frontend/public/wp-content/uploads/IMG_20171109_135730.jpg new file mode 100644 index 0000000..f472a8d Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_135730.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_141849.jpg b/frontend/public/wp-content/uploads/IMG_20171109_141849.jpg new file mode 100644 index 0000000..70ca67d Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_141849.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20171109_143133.jpg b/frontend/public/wp-content/uploads/IMG_20171109_143133.jpg new file mode 100644 index 0000000..c3e552b Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20171109_143133.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20180421_153140-min.jpg b/frontend/public/wp-content/uploads/IMG_20180421_153140-min.jpg new file mode 100644 index 0000000..2b8c28f Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20180421_153140-min.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20180908_085514.jpg b/frontend/public/wp-content/uploads/IMG_20180908_085514.jpg new file mode 100644 index 0000000..084e599 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20180908_085514.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20180915_114009-1.jpg b/frontend/public/wp-content/uploads/IMG_20180915_114009-1.jpg new file mode 100644 index 0000000..49ced10 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20180915_114009-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20181017_142832.jpg b/frontend/public/wp-content/uploads/IMG_20181017_142832.jpg new file mode 100644 index 0000000..63f82c5 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20181017_142832.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20190331_132122.jpg b/frontend/public/wp-content/uploads/IMG_20190331_132122.jpg new file mode 100644 index 0000000..0304076 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20190331_132122.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200626_082335-2-1.jpg b/frontend/public/wp-content/uploads/IMG_20200626_082335-2-1.jpg new file mode 100644 index 0000000..370bc52 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200626_082335-2-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200626_084301762-1-1.jpg b/frontend/public/wp-content/uploads/IMG_20200626_084301762-1-1.jpg new file mode 100644 index 0000000..17cdf0f Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200626_084301762-1-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200626_115126-1-1.jpg b/frontend/public/wp-content/uploads/IMG_20200626_115126-1-1.jpg new file mode 100644 index 0000000..6d2d77c Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200626_115126-1-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200627_052333-1-1.jpg b/frontend/public/wp-content/uploads/IMG_20200627_052333-1-1.jpg new file mode 100644 index 0000000..536b6ee Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200627_052333-1-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200627_105607956_HDR-2.jpg b/frontend/public/wp-content/uploads/IMG_20200627_105607956_HDR-2.jpg new file mode 100644 index 0000000..79e7a11 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200627_105607956_HDR-2.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200627_122453-1.jpg b/frontend/public/wp-content/uploads/IMG_20200627_122453-1.jpg new file mode 100644 index 0000000..605e10c Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200627_122453-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200627_160446-1.jpg b/frontend/public/wp-content/uploads/IMG_20200627_160446-1.jpg new file mode 100644 index 0000000..1a05847 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200627_160446-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200627_160627-1.jpg b/frontend/public/wp-content/uploads/IMG_20200627_160627-1.jpg new file mode 100644 index 0000000..12d0a14 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200627_160627-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200627_220124844_HDR-1.jpg b/frontend/public/wp-content/uploads/IMG_20200627_220124844_HDR-1.jpg new file mode 100644 index 0000000..dc50530 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200627_220124844_HDR-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_100951742_HDR-1-min.jpg b/frontend/public/wp-content/uploads/IMG_20200628_100951742_HDR-1-min.jpg new file mode 100644 index 0000000..acbdd4f Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_100951742_HDR-1-min.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_110631-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_110631-1.jpg new file mode 100644 index 0000000..aa4605d Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_110631-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_113104__-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_113104__-1.jpg new file mode 100644 index 0000000..cf3049b Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_113104__-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_120440_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_120440_-1.jpg new file mode 100644 index 0000000..6757274 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_120440_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_123407_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_123407_-1.jpg new file mode 100644 index 0000000..0820a82 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_123407_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_125116_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_125116_-1.jpg new file mode 100644 index 0000000..17ec7d4 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_125116_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_182651-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_182651-1.jpg new file mode 100644 index 0000000..ca01aef Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_182651-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_225340-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_225340-1.jpg new file mode 100644 index 0000000..850b50b Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_225340-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_230223-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_230223-1.jpg new file mode 100644 index 0000000..76e8b9c Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_230223-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_231019-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_231019-1.jpg new file mode 100644 index 0000000..5e114f5 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_231019-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_232341-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_232341-1.jpg new file mode 100644 index 0000000..e737fda Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_232341-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_232822-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_232822-1.jpg new file mode 100644 index 0000000..220592b Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_232822-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_234346-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_234346-1.jpg new file mode 100644 index 0000000..832a7d7 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_234346-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_234845-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_234845-1.jpg new file mode 100644 index 0000000..cb67a91 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_234845-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_235312-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_235312-1.jpg new file mode 100644 index 0000000..37cf118 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_235312-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200628_235607-1.jpg b/frontend/public/wp-content/uploads/IMG_20200628_235607-1.jpg new file mode 100644 index 0000000..bd20a8b Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200628_235607-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_000938-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_000938-1.jpg new file mode 100644 index 0000000..5aaa536 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_000938-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_001112-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_001112-1.jpg new file mode 100644 index 0000000..910fc13 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_001112-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_004220_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_004220_-1.jpg new file mode 100644 index 0000000..baa581d Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_004220_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_005205_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_005205_-1.jpg new file mode 100644 index 0000000..6edd053 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_005205_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_005708_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_005708_-1.jpg new file mode 100644 index 0000000..e896569 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_005708_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_010016_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_010016_-1.jpg new file mode 100644 index 0000000..6b182b9 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_010016_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_011612_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_011612_-1.jpg new file mode 100644 index 0000000..e0bcd3d Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_011612_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_011651_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_011651_-1.jpg new file mode 100644 index 0000000..b1da5ff Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_011651_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_012044_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_012044_-1.jpg new file mode 100644 index 0000000..6b3f6f9 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_012044_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_015416_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_015416_-1.jpg new file mode 100644 index 0000000..09a56ce Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_015416_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_021257-1-1-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_021257-1-1-1.jpg new file mode 100644 index 0000000..9de1c31 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_021257-1-1-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_021749-1-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_021749-1-1.jpg new file mode 100644 index 0000000..33c3a73 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_021749-1-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_022253-1-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_022253-1-1.jpg new file mode 100644 index 0000000..51d5c71 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_022253-1-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_034323_-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_034323_-1.jpg new file mode 100644 index 0000000..4376d06 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_034323_-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_105841138-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_105841138-1.jpg new file mode 100644 index 0000000..8338e6d Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_105841138-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_20200629_112301-1.jpg b/frontend/public/wp-content/uploads/IMG_20200629_112301-1.jpg new file mode 100644 index 0000000..00b1b38 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_20200629_112301-1.jpg differ diff --git a/frontend/public/wp-content/uploads/IMG_Hull12-bakover.jpg b/frontend/public/wp-content/uploads/IMG_Hull12-bakover.jpg new file mode 100644 index 0000000..87e41d7 Binary files /dev/null and b/frontend/public/wp-content/uploads/IMG_Hull12-bakover.jpg differ diff --git a/frontend/public/wp-content/uploads/InstaAtTeeOff.jpg b/frontend/public/wp-content/uploads/InstaAtTeeOff.jpg new file mode 100644 index 0000000..a3a09b3 Binary files /dev/null and b/frontend/public/wp-content/uploads/InstaAtTeeOff.jpg differ diff --git a/frontend/public/wp-content/uploads/Klubbhus-1-1-scaled.jpg b/frontend/public/wp-content/uploads/Klubbhus-1-1-scaled.jpg new file mode 100644 index 0000000..4bbcd30 Binary files /dev/null and b/frontend/public/wp-content/uploads/Klubbhus-1-1-scaled.jpg differ diff --git a/frontend/public/wp-content/uploads/KrageroGK-1.jpg b/frontend/public/wp-content/uploads/KrageroGK-1.jpg new file mode 100644 index 0000000..7cdf51d Binary files /dev/null and b/frontend/public/wp-content/uploads/KrageroGK-1.jpg differ diff --git a/frontend/public/wp-content/uploads/KrageroGK-2.jpg b/frontend/public/wp-content/uploads/KrageroGK-2.jpg new file mode 100644 index 0000000..bb27278 Binary files /dev/null and b/frontend/public/wp-content/uploads/KrageroGK-2.jpg differ diff --git a/frontend/public/wp-content/uploads/LarvikGK.jpg b/frontend/public/wp-content/uploads/LarvikGK.jpg new file mode 100644 index 0000000..2638d97 Binary files /dev/null and b/frontend/public/wp-content/uploads/LarvikGK.jpg differ diff --git a/frontend/public/wp-content/uploads/LifeProTip.jpg b/frontend/public/wp-content/uploads/LifeProTip.jpg new file mode 100644 index 0000000..4143ccb Binary files /dev/null and b/frontend/public/wp-content/uploads/LifeProTip.jpg differ diff --git a/frontend/public/wp-content/uploads/LosbyGK.jpg b/frontend/public/wp-content/uploads/LosbyGK.jpg new file mode 100644 index 0000000..0fe9069 Binary files /dev/null and b/frontend/public/wp-content/uploads/LosbyGK.jpg differ diff --git a/frontend/public/wp-content/uploads/LosbyGK16-9.jpg b/frontend/public/wp-content/uploads/LosbyGK16-9.jpg new file mode 100644 index 0000000..505ee43 Binary files /dev/null and b/frontend/public/wp-content/uploads/LosbyGK16-9.jpg differ diff --git a/frontend/public/wp-content/uploads/Lubker-DK.jpg b/frontend/public/wp-content/uploads/Lubker-DK.jpg new file mode 100644 index 0000000..6dd8237 Binary files /dev/null and b/frontend/public/wp-content/uploads/Lubker-DK.jpg differ diff --git a/frontend/public/wp-content/uploads/Medlemskap-Bleik-Hoeken.jpg b/frontend/public/wp-content/uploads/Medlemskap-Bleik-Hoeken.jpg new file mode 100644 index 0000000..bba1f78 Binary files /dev/null and b/frontend/public/wp-content/uploads/Medlemskap-Bleik-Hoeken.jpg differ diff --git a/frontend/public/wp-content/uploads/Mental-breakdown.jpeg b/frontend/public/wp-content/uploads/Mental-breakdown.jpeg new file mode 100644 index 0000000..837e734 Binary files /dev/null and b/frontend/public/wp-content/uploads/Mental-breakdown.jpeg differ diff --git a/frontend/public/wp-content/uploads/Midt-TromsBloggen.jpg b/frontend/public/wp-content/uploads/Midt-TromsBloggen.jpg new file mode 100644 index 0000000..7e869f5 Binary files /dev/null and b/frontend/public/wp-content/uploads/Midt-TromsBloggen.jpg differ diff --git a/frontend/public/wp-content/uploads/Miklagard-169.jpg b/frontend/public/wp-content/uploads/Miklagard-169.jpg new file mode 100644 index 0000000..68f25c8 Binary files /dev/null and b/frontend/public/wp-content/uploads/Miklagard-169.jpg differ diff --git a/frontend/public/wp-content/uploads/MiklagardGK.jpg b/frontend/public/wp-content/uploads/MiklagardGK.jpg new file mode 100644 index 0000000..93eaee7 Binary files /dev/null and b/frontend/public/wp-content/uploads/MiklagardGK.jpg differ diff --git a/frontend/public/wp-content/uploads/Min-beste-runde.jpg b/frontend/public/wp-content/uploads/Min-beste-runde.jpg new file mode 100644 index 0000000..f4ee117 Binary files /dev/null and b/frontend/public/wp-content/uploads/Min-beste-runde.jpg differ diff --git a/frontend/public/wp-content/uploads/MoerkGK.jpg b/frontend/public/wp-content/uploads/MoerkGK.jpg new file mode 100644 index 0000000..a0489e3 Binary files /dev/null and b/frontend/public/wp-content/uploads/MoerkGK.jpg differ diff --git a/frontend/public/wp-content/uploads/MorkGK2.jpg b/frontend/public/wp-content/uploads/MorkGK2.jpg new file mode 100644 index 0000000..1a6a6c0 Binary files /dev/null and b/frontend/public/wp-content/uploads/MorkGK2.jpg differ diff --git a/frontend/public/wp-content/uploads/MossRyggeGK.jpg b/frontend/public/wp-content/uploads/MossRyggeGK.jpg new file mode 100644 index 0000000..eb7f94a Binary files /dev/null and b/frontend/public/wp-content/uploads/MossRyggeGK.jpg differ diff --git a/frontend/public/wp-content/uploads/Nedslagsmerke.jpg b/frontend/public/wp-content/uploads/Nedslagsmerke.jpg new file mode 100644 index 0000000..56fad25 Binary files /dev/null and b/frontend/public/wp-content/uploads/Nedslagsmerke.jpg differ diff --git a/frontend/public/wp-content/uploads/NesbyenGK2.jpg b/frontend/public/wp-content/uploads/NesbyenGK2.jpg new file mode 100644 index 0000000..6e38f79 Binary files /dev/null and b/frontend/public/wp-content/uploads/NesbyenGK2.jpg differ diff --git a/frontend/public/wp-content/uploads/NettsideSteinkjerGK.jpg b/frontend/public/wp-content/uploads/NettsideSteinkjerGK.jpg new file mode 100644 index 0000000..6fb924f Binary files /dev/null and b/frontend/public/wp-content/uploads/NettsideSteinkjerGK.jpg differ diff --git a/frontend/public/wp-content/uploads/Nordgeven-1920x1080.jpg b/frontend/public/wp-content/uploads/Nordgeven-1920x1080.jpg new file mode 100644 index 0000000..93fd2a0 Binary files /dev/null and b/frontend/public/wp-content/uploads/Nordgeven-1920x1080.jpg differ diff --git a/frontend/public/wp-content/uploads/Norges-vanskeligste1.jpg b/frontend/public/wp-content/uploads/Norges-vanskeligste1.jpg new file mode 100644 index 0000000..c30b8ab Binary files /dev/null and b/frontend/public/wp-content/uploads/Norges-vanskeligste1.jpg differ diff --git a/frontend/public/wp-content/uploads/Norges_gjennomsnittshull.jpg b/frontend/public/wp-content/uploads/Norges_gjennomsnittshull.jpg new file mode 100644 index 0000000..a444439 Binary files /dev/null and b/frontend/public/wp-content/uploads/Norges_gjennomsnittshull.jpg differ diff --git a/frontend/public/wp-content/uploads/Notteroy-169-1.jpg b/frontend/public/wp-content/uploads/Notteroy-169-1.jpg new file mode 100644 index 0000000..7205d2a Binary files /dev/null and b/frontend/public/wp-content/uploads/Notteroy-169-1.jpg differ diff --git a/frontend/public/wp-content/uploads/NotteroyGK-artikkelbilde.jpg b/frontend/public/wp-content/uploads/NotteroyGK-artikkelbilde.jpg new file mode 100644 index 0000000..c8a71e9 Binary files /dev/null and b/frontend/public/wp-content/uploads/NotteroyGK-artikkelbilde.jpg differ diff --git a/frontend/public/wp-content/uploads/NyFunksjonTeeOff.jpg b/frontend/public/wp-content/uploads/NyFunksjonTeeOff.jpg new file mode 100644 index 0000000..f57ced4 Binary files /dev/null and b/frontend/public/wp-content/uploads/NyFunksjonTeeOff.jpg differ diff --git a/frontend/public/wp-content/uploads/Odense.jpg b/frontend/public/wp-content/uploads/Odense.jpg new file mode 100644 index 0000000..df99c3f Binary files /dev/null and b/frontend/public/wp-content/uploads/Odense.jpg differ diff --git a/frontend/public/wp-content/uploads/OsloGk-169-1.jpg b/frontend/public/wp-content/uploads/OsloGk-169-1.jpg new file mode 100644 index 0000000..793fd78 Binary files /dev/null and b/frontend/public/wp-content/uploads/OsloGk-169-1.jpg differ diff --git a/frontend/public/wp-content/uploads/Randaberg1920.jpg b/frontend/public/wp-content/uploads/Randaberg1920.jpg new file mode 100644 index 0000000..731155d Binary files /dev/null and b/frontend/public/wp-content/uploads/Randaberg1920.jpg differ diff --git a/frontend/public/wp-content/uploads/Regelrytter.jpg b/frontend/public/wp-content/uploads/Regelrytter.jpg new file mode 100644 index 0000000..329a0a2 Binary files /dev/null and b/frontend/public/wp-content/uploads/Regelrytter.jpg differ diff --git a/frontend/public/wp-content/uploads/RoyalOak-DK.jpg b/frontend/public/wp-content/uploads/RoyalOak-DK.jpg new file mode 100644 index 0000000..96a1c63 Binary files /dev/null and b/frontend/public/wp-content/uploads/RoyalOak-DK.jpg differ diff --git a/frontend/public/wp-content/uploads/SaltenBlogg3.jpg b/frontend/public/wp-content/uploads/SaltenBlogg3.jpg new file mode 100644 index 0000000..a6137e5 Binary files /dev/null and b/frontend/public/wp-content/uploads/SaltenBlogg3.jpg differ diff --git a/frontend/public/wp-content/uploads/Sand-SE.jpg b/frontend/public/wp-content/uploads/Sand-SE.jpg new file mode 100644 index 0000000..1492810 Binary files /dev/null and b/frontend/public/wp-content/uploads/Sand-SE.jpg differ diff --git a/frontend/public/wp-content/uploads/Sinnagolfer.jpg b/frontend/public/wp-content/uploads/Sinnagolfer.jpg new file mode 100644 index 0000000..cad7355 Binary files /dev/null and b/frontend/public/wp-content/uploads/Sinnagolfer.jpg differ diff --git a/frontend/public/wp-content/uploads/SkiGK.jpg b/frontend/public/wp-content/uploads/SkiGK.jpg new file mode 100644 index 0000000..58ac644 Binary files /dev/null and b/frontend/public/wp-content/uploads/SkiGK.jpg differ diff --git a/frontend/public/wp-content/uploads/Skjermbilde-fra-2015-03-16-193059.png b/frontend/public/wp-content/uploads/Skjermbilde-fra-2015-03-16-193059.png new file mode 100644 index 0000000..78734f6 Binary files /dev/null and b/frontend/public/wp-content/uploads/Skjermbilde-fra-2015-03-16-193059.png differ diff --git a/frontend/public/wp-content/uploads/Skjermbilde-fra-2015-03-18-091010.png b/frontend/public/wp-content/uploads/Skjermbilde-fra-2015-03-18-091010.png new file mode 100644 index 0000000..fd4555f Binary files /dev/null and b/frontend/public/wp-content/uploads/Skjermbilde-fra-2015-03-18-091010.png differ diff --git a/frontend/public/wp-content/uploads/SotraGolfklubb1.jpg b/frontend/public/wp-content/uploads/SotraGolfklubb1.jpg new file mode 100644 index 0000000..58aee38 Binary files /dev/null and b/frontend/public/wp-content/uploads/SotraGolfklubb1.jpg differ diff --git a/frontend/public/wp-content/uploads/TGK-DR-1.jpg b/frontend/public/wp-content/uploads/TGK-DR-1.jpg new file mode 100644 index 0000000..9b0f08c Binary files /dev/null and b/frontend/public/wp-content/uploads/TGK-DR-1.jpg differ diff --git a/frontend/public/wp-content/uploads/TeeOff-Multilanguage1600.jpg b/frontend/public/wp-content/uploads/TeeOff-Multilanguage1600.jpg new file mode 100644 index 0000000..cada3e2 Binary files /dev/null and b/frontend/public/wp-content/uploads/TeeOff-Multilanguage1600.jpg differ diff --git a/frontend/public/wp-content/uploads/TeeOffEttAar.jpg b/frontend/public/wp-content/uploads/TeeOffEttAar.jpg new file mode 100644 index 0000000..dbe5f8e Binary files /dev/null and b/frontend/public/wp-content/uploads/TeeOffEttAar.jpg differ diff --git a/frontend/public/wp-content/uploads/TeeOffLokalisering.jpg b/frontend/public/wp-content/uploads/TeeOffLokalisering.jpg new file mode 100644 index 0000000..823e2a1 Binary files /dev/null and b/frontend/public/wp-content/uploads/TeeOffLokalisering.jpg differ diff --git a/frontend/public/wp-content/uploads/TeeOffNyLayout.jpg b/frontend/public/wp-content/uploads/TeeOffNyLayout.jpg new file mode 100644 index 0000000..45cfef9 Binary files /dev/null and b/frontend/public/wp-content/uploads/TeeOffNyLayout.jpg differ diff --git a/frontend/public/wp-content/uploads/The-Scandinavium-Old-Course-Farum-DK.jpg b/frontend/public/wp-content/uploads/The-Scandinavium-Old-Course-Farum-DK.jpg new file mode 100644 index 0000000..3009635 Binary files /dev/null and b/frontend/public/wp-content/uploads/The-Scandinavium-Old-Course-Farum-DK.jpg differ diff --git a/frontend/public/wp-content/uploads/Tingvoll-1920-1080-edt.jpg b/frontend/public/wp-content/uploads/Tingvoll-1920-1080-edt.jpg new file mode 100644 index 0000000..87b6075 Binary files /dev/null and b/frontend/public/wp-content/uploads/Tingvoll-1920-1080-edt.jpg differ diff --git a/frontend/public/wp-content/uploads/TjoemeGK-DrivingRange-Gina-Gisholt.jpg b/frontend/public/wp-content/uploads/TjoemeGK-DrivingRange-Gina-Gisholt.jpg new file mode 100644 index 0000000..e6f9f9c Binary files /dev/null and b/frontend/public/wp-content/uploads/TjoemeGK-DrivingRange-Gina-Gisholt.jpg differ diff --git a/frontend/public/wp-content/uploads/Toppbilde-default.jpg b/frontend/public/wp-content/uploads/Toppbilde-default.jpg new file mode 100644 index 0000000..5b2f282 Binary files /dev/null and b/frontend/public/wp-content/uploads/Toppbilde-default.jpg differ diff --git a/frontend/public/wp-content/uploads/Turneringsanarki-foto-gina-gisholt.jpg b/frontend/public/wp-content/uploads/Turneringsanarki-foto-gina-gisholt.jpg new file mode 100644 index 0000000..12fe8c5 Binary files /dev/null and b/frontend/public/wp-content/uploads/Turneringsanarki-foto-gina-gisholt.jpg differ diff --git a/frontend/public/wp-content/uploads/UllensakerGK.jpg b/frontend/public/wp-content/uploads/UllensakerGK.jpg new file mode 100644 index 0000000..00ef6c2 Binary files /dev/null and b/frontend/public/wp-content/uploads/UllensakerGK.jpg differ diff --git a/frontend/public/wp-content/uploads/Vasatorp-Classic-course-SE.jpg b/frontend/public/wp-content/uploads/Vasatorp-Classic-course-SE.jpg new file mode 100644 index 0000000..02d1aee Binary files /dev/null and b/frontend/public/wp-content/uploads/Vasatorp-Classic-course-SE.jpg differ diff --git a/frontend/public/wp-content/uploads/VelkommenKracht.jpg b/frontend/public/wp-content/uploads/VelkommenKracht.jpg new file mode 100644 index 0000000..c254362 Binary files /dev/null and b/frontend/public/wp-content/uploads/VelkommenKracht.jpg differ diff --git a/frontend/public/wp-content/uploads/ViljeEvne-1-1.jpg b/frontend/public/wp-content/uploads/ViljeEvne-1-1.jpg new file mode 100644 index 0000000..0e09eea Binary files /dev/null and b/frontend/public/wp-content/uploads/ViljeEvne-1-1.jpg differ diff --git a/frontend/public/wp-content/uploads/Vradal.jpg b/frontend/public/wp-content/uploads/Vradal.jpg new file mode 100644 index 0000000..1941e02 Binary files /dev/null and b/frontend/public/wp-content/uploads/Vradal.jpg differ diff --git a/frontend/public/wp-content/uploads/brick-2646694_1920-1.jpg b/frontend/public/wp-content/uploads/brick-2646694_1920-1.jpg new file mode 100644 index 0000000..9dfe59b Binary files /dev/null and b/frontend/public/wp-content/uploads/brick-2646694_1920-1.jpg differ diff --git a/frontend/public/wp-content/uploads/bug-169.jpg b/frontend/public/wp-content/uploads/bug-169.jpg new file mode 100644 index 0000000..4686902 Binary files /dev/null and b/frontend/public/wp-content/uploads/bug-169.jpg differ diff --git a/frontend/public/wp-content/uploads/close-soon.png b/frontend/public/wp-content/uploads/close-soon.png new file mode 100644 index 0000000..e8f32a7 Binary files /dev/null and b/frontend/public/wp-content/uploads/close-soon.png differ diff --git a/frontend/public/wp-content/uploads/closed.png b/frontend/public/wp-content/uploads/closed.png new file mode 100644 index 0000000..9692f66 Binary files /dev/null and b/frontend/public/wp-content/uploads/closed.png differ diff --git a/frontend/public/wp-content/uploads/discontinued-.png b/frontend/public/wp-content/uploads/discontinued-.png new file mode 100644 index 0000000..9bd92f3 Binary files /dev/null and b/frontend/public/wp-content/uploads/discontinued-.png differ diff --git a/frontend/public/wp-content/uploads/egersund2017.jpg b/frontend/public/wp-content/uploads/egersund2017.jpg new file mode 100644 index 0000000..6497668 Binary files /dev/null and b/frontend/public/wp-content/uploads/egersund2017.jpg differ diff --git a/frontend/public/wp-content/uploads/evjegkfinside-450x300.jpg b/frontend/public/wp-content/uploads/evjegkfinside-450x300.jpg new file mode 100644 index 0000000..13ef74d Binary files /dev/null and b/frontend/public/wp-content/uploads/evjegkfinside-450x300.jpg differ diff --git a/frontend/public/wp-content/uploads/evjegkfinside-970x647.jpg b/frontend/public/wp-content/uploads/evjegkfinside-970x647.jpg new file mode 100644 index 0000000..2f1dd70 Binary files /dev/null and b/frontend/public/wp-content/uploads/evjegkfinside-970x647.jpg differ diff --git a/frontend/public/wp-content/uploads/evjegkfinside.jpg b/frontend/public/wp-content/uploads/evjegkfinside.jpg new file mode 100644 index 0000000..b3e33d1 Binary files /dev/null and b/frontend/public/wp-content/uploads/evjegkfinside.jpg differ diff --git a/frontend/public/wp-content/uploads/golfbilde.jpg b/frontend/public/wp-content/uploads/golfbilde.jpg new file mode 100644 index 0000000..81c6a3f Binary files /dev/null and b/frontend/public/wp-content/uploads/golfbilde.jpg differ diff --git a/frontend/public/wp-content/uploads/golfcentertrening.jpg b/frontend/public/wp-content/uploads/golfcentertrening.jpg new file mode 100644 index 0000000..da6ad17 Binary files /dev/null and b/frontend/public/wp-content/uploads/golfcentertrening.jpg differ diff --git a/frontend/public/wp-content/uploads/golfgamebook-403x300.jpg b/frontend/public/wp-content/uploads/golfgamebook-403x300.jpg new file mode 100644 index 0000000..bd9c051 Binary files /dev/null and b/frontend/public/wp-content/uploads/golfgamebook-403x300.jpg differ diff --git a/frontend/public/wp-content/uploads/golfgamebook-970x722.jpg b/frontend/public/wp-content/uploads/golfgamebook-970x722.jpg new file mode 100644 index 0000000..abc0b25 Binary files /dev/null and b/frontend/public/wp-content/uploads/golfgamebook-970x722.jpg differ diff --git a/frontend/public/wp-content/uploads/golfgamebook.jpg b/frontend/public/wp-content/uploads/golfgamebook.jpg new file mode 100644 index 0000000..d9cfdbd Binary files /dev/null and b/frontend/public/wp-content/uploads/golfgamebook.jpg differ diff --git a/frontend/public/wp-content/uploads/holtsmarkgkfinside-450x300.jpg b/frontend/public/wp-content/uploads/holtsmarkgkfinside-450x300.jpg new file mode 100644 index 0000000..8083ea6 Binary files /dev/null and b/frontend/public/wp-content/uploads/holtsmarkgkfinside-450x300.jpg differ diff --git a/frontend/public/wp-content/uploads/holtsmarkgkfinside-970x647.jpg b/frontend/public/wp-content/uploads/holtsmarkgkfinside-970x647.jpg new file mode 100644 index 0000000..47ccf06 Binary files /dev/null and b/frontend/public/wp-content/uploads/holtsmarkgkfinside-970x647.jpg differ diff --git a/frontend/public/wp-content/uploads/holtsmarkgkfinside.jpg b/frontend/public/wp-content/uploads/holtsmarkgkfinside.jpg new file mode 100644 index 0000000..f2b7a9a Binary files /dev/null and b/frontend/public/wp-content/uploads/holtsmarkgkfinside.jpg differ diff --git a/frontend/public/wp-content/uploads/krokholGK13.jpg b/frontend/public/wp-content/uploads/krokholGK13.jpg new file mode 100644 index 0000000..7f2cf2e Binary files /dev/null and b/frontend/public/wp-content/uploads/krokholGK13.jpg differ diff --git a/frontend/public/wp-content/uploads/kvinnedagen.jpg b/frontend/public/wp-content/uploads/kvinnedagen.jpg new file mode 100644 index 0000000..4eeab57 Binary files /dev/null and b/frontend/public/wp-content/uploads/kvinnedagen.jpg differ diff --git a/frontend/public/wp-content/uploads/livescore.jpg b/frontend/public/wp-content/uploads/livescore.jpg new file mode 100644 index 0000000..31ba155 Binary files /dev/null and b/frontend/public/wp-content/uploads/livescore.jpg differ diff --git a/frontend/public/wp-content/uploads/lofotenlinksfinside-450x300.jpg b/frontend/public/wp-content/uploads/lofotenlinksfinside-450x300.jpg new file mode 100644 index 0000000..8fe1569 Binary files /dev/null and b/frontend/public/wp-content/uploads/lofotenlinksfinside-450x300.jpg differ diff --git a/frontend/public/wp-content/uploads/lofotenlinksfinside-970x646.jpg b/frontend/public/wp-content/uploads/lofotenlinksfinside-970x646.jpg new file mode 100644 index 0000000..582b6d4 Binary files /dev/null and b/frontend/public/wp-content/uploads/lofotenlinksfinside-970x646.jpg differ diff --git a/frontend/public/wp-content/uploads/lofotenlinksfinside.jpg b/frontend/public/wp-content/uploads/lofotenlinksfinside.jpg new file mode 100644 index 0000000..45afcad Binary files /dev/null and b/frontend/public/wp-content/uploads/lofotenlinksfinside.jpg differ diff --git a/frontend/public/wp-content/uploads/norske-golfbaner-nord-syd.kmz b/frontend/public/wp-content/uploads/norske-golfbaner-nord-syd.kmz new file mode 100644 index 0000000..cad7458 Binary files /dev/null and b/frontend/public/wp-content/uploads/norske-golfbaner-nord-syd.kmz differ diff --git a/frontend/public/wp-content/uploads/norskegolfbanernordsyd.jpg b/frontend/public/wp-content/uploads/norskegolfbanernordsyd.jpg new file mode 100644 index 0000000..febbb5b Binary files /dev/null and b/frontend/public/wp-content/uploads/norskegolfbanernordsyd.jpg differ diff --git a/frontend/public/wp-content/uploads/open-soon.png b/frontend/public/wp-content/uploads/open-soon.png new file mode 100644 index 0000000..d26a81d Binary files /dev/null and b/frontend/public/wp-content/uploads/open-soon.png differ diff --git a/frontend/public/wp-content/uploads/open-winter.png b/frontend/public/wp-content/uploads/open-winter.png new file mode 100644 index 0000000..93151ae Binary files /dev/null and b/frontend/public/wp-content/uploads/open-winter.png differ diff --git a/frontend/public/wp-content/uploads/open.png b/frontend/public/wp-content/uploads/open.png new file mode 100644 index 0000000..6634316 Binary files /dev/null and b/frontend/public/wp-content/uploads/open.png differ diff --git a/frontend/public/wp-content/uploads/regelquiz-2.jpg b/frontend/public/wp-content/uploads/regelquiz-2.jpg new file mode 100644 index 0000000..7ca27fe Binary files /dev/null and b/frontend/public/wp-content/uploads/regelquiz-2.jpg differ diff --git a/frontend/public/wp-content/uploads/rjukangkfinside-450x300.jpg b/frontend/public/wp-content/uploads/rjukangkfinside-450x300.jpg new file mode 100644 index 0000000..f790836 Binary files /dev/null and b/frontend/public/wp-content/uploads/rjukangkfinside-450x300.jpg differ diff --git a/frontend/public/wp-content/uploads/rjukangkfinside-970x647.jpg b/frontend/public/wp-content/uploads/rjukangkfinside-970x647.jpg new file mode 100644 index 0000000..02ec08f Binary files /dev/null and b/frontend/public/wp-content/uploads/rjukangkfinside-970x647.jpg differ diff --git a/frontend/public/wp-content/uploads/rjukangkfinside.jpg b/frontend/public/wp-content/uploads/rjukangkfinside.jpg new file mode 100644 index 0000000..2382476 Binary files /dev/null and b/frontend/public/wp-content/uploads/rjukangkfinside.jpg differ diff --git a/frontend/public/wp-content/uploads/sandaneGK_ettAar.jpg b/frontend/public/wp-content/uploads/sandaneGK_ettAar.jpg new file mode 100644 index 0000000..b08ce37 Binary files /dev/null and b/frontend/public/wp-content/uploads/sandaneGK_ettAar.jpg differ diff --git a/frontend/public/wp-content/uploads/scrolf-403x300.jpg b/frontend/public/wp-content/uploads/scrolf-403x300.jpg new file mode 100644 index 0000000..59ebb11 Binary files /dev/null and b/frontend/public/wp-content/uploads/scrolf-403x300.jpg differ diff --git a/frontend/public/wp-content/uploads/scrolf-970x722.jpg b/frontend/public/wp-content/uploads/scrolf-970x722.jpg new file mode 100644 index 0000000..950e17c Binary files /dev/null and b/frontend/public/wp-content/uploads/scrolf-970x722.jpg differ diff --git a/frontend/public/wp-content/uploads/scrolf.jpg b/frontend/public/wp-content/uploads/scrolf.jpg new file mode 100644 index 0000000..b615da7 Binary files /dev/null and b/frontend/public/wp-content/uploads/scrolf.jpg differ diff --git a/frontend/public/wp-content/uploads/sisteNytt.jpg b/frontend/public/wp-content/uploads/sisteNytt.jpg new file mode 100644 index 0000000..f7c92a2 Binary files /dev/null and b/frontend/public/wp-content/uploads/sisteNytt.jpg differ diff --git a/frontend/public/wp-content/uploads/skjeberggkfinside-450x300.jpg b/frontend/public/wp-content/uploads/skjeberggkfinside-450x300.jpg new file mode 100644 index 0000000..acc318b Binary files /dev/null and b/frontend/public/wp-content/uploads/skjeberggkfinside-450x300.jpg differ diff --git a/frontend/public/wp-content/uploads/skjeberggkfinside-970x647.jpg b/frontend/public/wp-content/uploads/skjeberggkfinside-970x647.jpg new file mode 100644 index 0000000..eb40c3e Binary files /dev/null and b/frontend/public/wp-content/uploads/skjeberggkfinside-970x647.jpg differ diff --git a/frontend/public/wp-content/uploads/skjeberggkfinside.jpg b/frontend/public/wp-content/uploads/skjeberggkfinside.jpg new file mode 100644 index 0000000..3aa2200 Binary files /dev/null and b/frontend/public/wp-content/uploads/skjeberggkfinside.jpg differ diff --git a/frontend/public/wp-content/uploads/skjermbildeBaneDirekte.jpg b/frontend/public/wp-content/uploads/skjermbildeBaneDirekte.jpg new file mode 100644 index 0000000..9186700 Binary files /dev/null and b/frontend/public/wp-content/uploads/skjermbildeBaneDirekte.jpg differ diff --git a/frontend/public/wp-content/uploads/spillelister.jpg b/frontend/public/wp-content/uploads/spillelister.jpg new file mode 100644 index 0000000..0c251e6 Binary files /dev/null and b/frontend/public/wp-content/uploads/spillelister.jpg differ diff --git a/frontend/public/wp-content/uploads/teeoff-endringer.jpg b/frontend/public/wp-content/uploads/teeoff-endringer.jpg new file mode 100644 index 0000000..d8375af Binary files /dev/null and b/frontend/public/wp-content/uploads/teeoff-endringer.jpg differ diff --git a/frontend/public/wp-content/uploads/teeoff-kontor.jpg b/frontend/public/wp-content/uploads/teeoff-kontor.jpg new file mode 100644 index 0000000..1baea5e Binary files /dev/null and b/frontend/public/wp-content/uploads/teeoff-kontor.jpg differ diff --git a/frontend/public/wp-content/uploads/trash-3487009_1920-1.jpg b/frontend/public/wp-content/uploads/trash-3487009_1920-1.jpg new file mode 100644 index 0000000..84504cc Binary files /dev/null and b/frontend/public/wp-content/uploads/trash-3487009_1920-1.jpg differ diff --git a/frontend/public/wp-content/uploads/under-development.png b/frontend/public/wp-content/uploads/under-development.png new file mode 100644 index 0000000..f483edc Binary files /dev/null and b/frontend/public/wp-content/uploads/under-development.png differ diff --git a/frontend/public/wp-content/uploads/unknown.png b/frontend/public/wp-content/uploads/unknown.png new file mode 100644 index 0000000..18297f5 Binary files /dev/null and b/frontend/public/wp-content/uploads/unknown.png differ diff --git a/frontend/public/wp-content/uploads/vintertrening-min.jpg b/frontend/public/wp-content/uploads/vintertrening-min.jpg new file mode 100644 index 0000000..56a2938 Binary files /dev/null and b/frontend/public/wp-content/uploads/vintertrening-min.jpg differ diff --git a/frontend/public/wp-content/uploads/vtg123No.jpg b/frontend/public/wp-content/uploads/vtg123No.jpg new file mode 100644 index 0000000..31e4bc8 Binary files /dev/null and b/frontend/public/wp-content/uploads/vtg123No.jpg differ diff --git a/frontend/src/app/FacilitySearch.tsx b/frontend/src/app/FacilitySearch.tsx index bec11be..466ef69 100755 --- a/frontend/src/app/FacilitySearch.tsx +++ b/frontend/src/app/FacilitySearch.tsx @@ -128,6 +128,8 @@ const STATUS_CLASSES: Record = { ukjent: "bg-[#D9DED5] text-[#112015]", }; +const MONTH_LABELS = ["jan.", "feb.", "mars", "apr.", "mai", "juni", "juli", "aug.", "sep.", "okt.", "nov.", "des."]; + const normalizeText = (value: unknown) => String(value ?? "") .replace(/[æøå]/gi, (char) => { @@ -207,13 +209,24 @@ const getPrimaryStatus = (statuses: Array<{ status?: string }>) => { const formatUpdatedDate = (value: string | null | undefined) => { if (!value) return "Ukjent"; - const date = new Date(value); + const trimmed = String(value).trim(); + const isoDateMatch = trimmed.match(/^(\d{4})-(\d{2})-(\d{2})/); + + if (isoDateMatch) { + const [, year, month, day] = isoDateMatch; + const monthIndex = Number(month) - 1; + if (monthIndex >= 0 && monthIndex < MONTH_LABELS.length) { + return `${day}. ${MONTH_LABELS[monthIndex]} ${year}`; + } + } + + const date = new Date(trimmed); if (Number.isNaN(date.getTime())) return "Ukjent"; - return date.toLocaleDateString("nb-NO", { - day: "2-digit", - month: "short", - year: "numeric", - }); + + const day = String(date.getUTCDate()).padStart(2, "0"); + const monthLabel = MONTH_LABELS[date.getUTCMonth()]; + const year = date.getUTCFullYear(); + return `${day}. ${monthLabel} ${year}`; }; const getStatusLabel = (status: string) => STATUS_MAP[status] || "Ukjent"; diff --git a/frontend/src/app/HeroSlider.tsx b/frontend/src/app/HeroSlider.tsx index eb3f125..b3f823a 100755 --- a/frontend/src/app/HeroSlider.tsx +++ b/frontend/src/app/HeroSlider.tsx @@ -2,7 +2,7 @@ import Image from "next/image"; import Link from "next/link"; -import { useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo, useRef, useState, type TouchEvent } from "react"; const MANUAL_EXCLUSION_LIST = [ "alsten-golfklubb", @@ -51,8 +51,27 @@ type Facility = { course_statuses?: CourseStatus[] | null; }; -export default function HeroSlider({ facilities }: { facilities: Facility[] }) { +const hashString = (value: string) => { + let hash = 0; + for (let index = 0; index < value.length; index += 1) { + hash = (hash * 31 + value.charCodeAt(index)) >>> 0; + } + return hash; +}; + +const getSeededRank = (facility: Facility, rotationSeed: string) => + (hashString(`${rotationSeed}:${facility.slug}:${facility.id}`) + facility.id * 97) % 10007; + +export default function HeroSlider({ + facilities, + rotationSeed, +}: { + facilities: Facility[]; + rotationSeed: string; +}) { const [currentIndex, setCurrentIndex] = useState(0); + const touchStartXRef = useRef(null); + const touchStartYRef = useRef(null); const sliderItems = useMemo(() => { if (!Array.isArray(facilities) || facilities.length === 0) return []; @@ -77,15 +96,16 @@ export default function HeroSlider({ facilities }: { facilities: Facility[] }) { const fallback = validFacilities.filter((facility) => !priority.includes(facility)); - const now = new Date(); - const seed = Number(`${now.getFullYear()}${now.getMonth()}${now.getDate()}${now.getHours()}`); - const seededShuffle = (items: Facility[]) => - [...items].sort((a, b) => ((a.id * seed) % 101) - ((b.id * seed) % 101)); + [...items].sort((a, b) => { + const rankDiff = getSeededRank(a, rotationSeed) - getSeededRank(b, rotationSeed); + if (rankDiff !== 0) return rankDiff; + return a.name.localeCompare(b.name, "nb"); + }); const selected = [...seededShuffle(priority), ...seededShuffle(fallback)].slice(0, 5); return selected; - }, [facilities]); + }, [facilities, rotationSeed]); useEffect(() => { if (sliderItems.length <= 1) return; @@ -97,8 +117,57 @@ export default function HeroSlider({ facilities }: { facilities: Facility[] }) { if (sliderItems.length === 0) return null; + const goToPrevious = () => { + setCurrentIndex((previous) => (previous - 1 + sliderItems.length) % sliderItems.length); + }; + + const goToNext = () => { + setCurrentIndex((previous) => (previous + 1) % sliderItems.length); + }; + + const handleTouchStart = (event: TouchEvent) => { + const touch = event.touches[0]; + touchStartXRef.current = touch.clientX; + touchStartYRef.current = touch.clientY; + }; + + const resetTouch = () => { + touchStartXRef.current = null; + touchStartYRef.current = null; + }; + + const handleTouchEnd = (event: TouchEvent) => { + if (touchStartXRef.current === null || touchStartYRef.current === null) { + resetTouch(); + return; + } + + const touch = event.changedTouches[0]; + const deltaX = touch.clientX - touchStartXRef.current; + const deltaY = touch.clientY - touchStartYRef.current; + + resetTouch(); + + if (Math.abs(deltaX) < 40 || Math.abs(deltaX) <= Math.abs(deltaY)) { + return; + } + + if (deltaX > 0) { + goToPrevious(); + return; + } + + goToNext(); + }; + return ( -
+
{sliderItems.map((facility, index) => (
; +}; + +export default async function FacilityAliasPage({ params }: FacilityAliasPageProps) { + const { alias } = await params; + const facilitySlug = await resolveFacilityAlias(alias); + + if (!facilitySlug) { + notFound(); + } + + permanentRedirect(`/golfbaner/${facilitySlug}`); +} diff --git a/frontend/src/app/admin/artikler/page.tsx b/frontend/src/app/admin/artikler/page.tsx index 969113a..cb7c07b 100644 --- a/frontend/src/app/admin/artikler/page.tsx +++ b/frontend/src/app/admin/artikler/page.tsx @@ -6,6 +6,15 @@ import { API_URL } from "@/config/constants"; import { adminFetch } from "@/config/adminFetch"; import TiptapHtmlEditor from "@/components/TiptapHtmlEditor"; +type ArticleMediaItem = { + id: string; + type: "image" | "video"; + src: string; + alt: string; + caption: string; + poster?: string; +}; + type AdminArticle = { id: number; section?: "banebesok" | "meninger"; @@ -24,6 +33,8 @@ type AdminArticle = { alt?: string; caption?: string; }>; + media_gallery?: ArticleMediaItem[]; + featured_media_id?: string | null; content_html?: string | null; source_url?: string | null; source_label?: string | null; @@ -49,7 +60,8 @@ type ArticleFormState = { facility_slug: string; author_name: string; status: "draft" | "published"; - heroImageUrls: string; + media_gallery: ArticleMediaItem[]; + featured_media_id: string; content_html: string; source_url: string; source_label: string; @@ -74,9 +86,27 @@ function toDatetimeLocal(value?: string | null) { return local.toISOString().slice(0, 16); } -function heroImagesToText(images?: AdminArticle["hero_images"]) { - if (!Array.isArray(images)) return ""; - return images.map((image) => image.src).filter(Boolean).join("\n"); +function createMediaId(type: "image" | "video", src: string) { + const normalized = `${type}:${src.trim()}`; + let hash = 0; + for (let index = 0; index < normalized.length; index += 1) { + hash = (hash * 31 + normalized.charCodeAt(index)) >>> 0; + } + return `${type}-${hash.toString(16)}`; +} + +function heroImagesToMediaGallery(images?: AdminArticle["hero_images"]) { + if (!Array.isArray(images)) return []; + return images + .filter((image): image is NonNullable[number] => Boolean(image?.src)) + .map((image) => ({ + id: createMediaId("image", image.src), + type: "image" as const, + src: image.src, + alt: image.alt || "", + caption: image.caption || image.alt || "", + poster: "", + })); } function createEmptyForm(): ArticleFormState { @@ -92,7 +122,8 @@ function createEmptyForm(): ArticleFormState { facility_slug: "", author_name: "TeeOff", status: "draft", - heroImageUrls: "", + media_gallery: [], + featured_media_id: "", content_html: "", source_url: "", source_label: "", @@ -101,6 +132,14 @@ function createEmptyForm(): ArticleFormState { } function articleToForm(article: AdminArticle): ArticleFormState { + const mediaGallery = Array.isArray(article.media_gallery) && article.media_gallery.length > 0 + ? article.media_gallery + : heroImagesToMediaGallery(article.hero_images); + const featuredMediaId = + article.featured_media_id || + mediaGallery.find((item) => item.type === "image")?.id || + ""; + return { section: article.section || "banebesok", slug: article.slug || "", @@ -113,7 +152,8 @@ function articleToForm(article: AdminArticle): ArticleFormState { facility_slug: article.facility_slug || "", author_name: article.author_name || "TeeOff", status: article.status || "draft", - heroImageUrls: heroImagesToText(article.hero_images), + media_gallery: mediaGallery, + featured_media_id: featuredMediaId, content_html: article.content_html || "", source_url: article.source_url || "", source_label: article.source_label || "", @@ -121,18 +161,6 @@ function articleToForm(article: AdminArticle): ArticleFormState { }; } -function buildHeroImages(heroImageUrls: string, title: string) { - return heroImageUrls - .split("\n") - .map((line) => line.trim()) - .filter(Boolean) - .map((src) => ({ - src, - alt: title, - caption: title, - })); -} - export default function AdminArticlesPage() { const [articles, setArticles] = useState([]); const [facilities, setFacilities] = useState([]); @@ -145,6 +173,7 @@ export default function AdminArticlesPage() { const [isUploadingHeroImages, setIsUploadingHeroImages] = useState(false); const [feedback, setFeedback] = useState(""); const [slugTouched, setSlugTouched] = useState(false); + const [newVideoUrl, setNewVideoUrl] = useState(""); const heroImageInputRef = useRef(null); const loadArticles = async () => { @@ -184,6 +213,7 @@ export default function AdminArticlesPage() { setSelectedArticleId(article.id); setForm(articleToForm(article)); setSlugTouched(true); + setNewVideoUrl(""); setFeedback(""); }; @@ -191,6 +221,7 @@ export default function AdminArticlesPage() { setSelectedArticleId(null); setForm(createEmptyForm()); setSlugTouched(false); + setNewVideoUrl(""); setFeedback(""); }; @@ -198,6 +229,75 @@ export default function AdminArticlesPage() { setForm((current) => ({ ...current, [field]: value as ArticleFormState[keyof ArticleFormState] })); }; + const updateMediaItem = (mediaId: string, patch: Partial) => { + setForm((current) => ({ + ...current, + media_gallery: current.media_gallery.map((item) => + item.id === mediaId ? { ...item, ...patch } : item, + ), + })); + }; + + const removeMediaItem = (mediaId: string) => { + setForm((current) => { + const nextMedia = current.media_gallery.filter((item) => item.id !== mediaId); + const nextFeatured = + current.featured_media_id === mediaId + ? nextMedia.find((item) => item.type === "image")?.id || "" + : current.featured_media_id; + + return { + ...current, + media_gallery: nextMedia, + featured_media_id: nextFeatured, + }; + }); + }; + + const moveMediaItem = (mediaId: string, direction: -1 | 1) => { + setForm((current) => { + const currentIndex = current.media_gallery.findIndex((item) => item.id === mediaId); + if (currentIndex === -1) return current; + const nextIndex = currentIndex + direction; + if (nextIndex < 0 || nextIndex >= current.media_gallery.length) return current; + + const reordered = [...current.media_gallery]; + const [item] = reordered.splice(currentIndex, 1); + reordered.splice(nextIndex, 0, item); + + return { + ...current, + media_gallery: reordered, + }; + }); + }; + + const addVideoMedia = (src: string) => { + const trimmedSrc = src.trim(); + if (!trimmedSrc) return; + + setForm((current) => { + if (current.media_gallery.some((item) => item.src === trimmedSrc && item.type === "video")) { + return current; + } + + return { + ...current, + media_gallery: [ + ...current.media_gallery, + { + id: createMediaId("video", trimmedSrc), + type: "video", + src: trimmedSrc, + alt: current.title || "Video", + caption: current.title || "Video", + poster: "", + }, + ], + }; + }); + }; + const uploadArticleImage = async (file: File) => { const payload = new FormData(); payload.append("file", file); @@ -223,20 +323,35 @@ export default function AdminArticlesPage() { return result.url; }; - const appendHeroImageUrls = (urls: string[]) => { + const appendUploadedImages = (urls: string[]) => { setForm((current) => { - const existingUrls = current.heroImageUrls - .split("\n") - .map((line) => line.trim()) - .filter(Boolean); - - const combined = [...existingUrls, ...urls].filter( - (url, index, list) => list.indexOf(url) === index, + const existingImageUrls = new Set( + current.media_gallery + .filter((item) => item.type === "image") + .map((item) => item.src), ); + const appendedMedia = urls + .filter((url) => !existingImageUrls.has(url)) + .map((url) => ({ + id: createMediaId("image", url), + type: "image" as const, + src: url, + alt: current.title || "Bilde", + caption: current.title || "Bilde", + poster: "", + })); + + const mediaGallery = [...current.media_gallery, ...appendedMedia]; + const featuredMediaId = + current.featured_media_id || + mediaGallery.find((item) => item.type === "image")?.id || + ""; + return { ...current, - heroImageUrls: combined.join("\n"), + media_gallery: mediaGallery, + featured_media_id: featuredMediaId, }; }); }; @@ -270,9 +385,9 @@ export default function AdminArticlesPage() { try { const uploadedUrls = await Promise.all(files.map((file) => uploadArticleImage(file))); - appendHeroImageUrls(uploadedUrls); + appendUploadedImages(uploadedUrls); setFeedback( - `Lastet opp ${uploadedUrls.length} hero-bilde${uploadedUrls.length === 1 ? "" : "r"} som AVIF.`, + `Lastet opp ${uploadedUrls.length} bilde${uploadedUrls.length === 1 ? "" : "r"} som AVIF.`, ); } catch (error) { setFeedback(error instanceof Error ? error.message : "Kunne ikke laste opp hero-bilder."); @@ -302,7 +417,15 @@ export default function AdminArticlesPage() { source_url: form.source_url.trim(), source_label: form.source_label.trim(), published_at: form.published_at ? new Date(form.published_at).toISOString() : null, - hero_images: buildHeroImages(form.heroImageUrls, form.title.trim()), + media_gallery: form.media_gallery.map((item) => ({ + id: item.id, + type: item.type, + src: item.src.trim(), + alt: item.alt.trim(), + caption: item.caption.trim(), + poster: (item.poster || "").trim(), + })), + featured_media_id: form.featured_media_id || null, }; const response = await adminFetch(`${API_URL}/admin/articles`, { @@ -612,26 +735,162 @@ export default function AdminArticlesPage() { onChange={handleHeroImageUpload} />
- Hero-bilder - + Galleri og hovedbilde +
+ + +
-