From e780854139063c47de153f274a67ed3732467664 Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 25 Mar 2021 15:58:09 +0100 Subject: [PATCH 001/154] Unified volume mount paths --- docs/Getting Started.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Getting Started.md b/docs/Getting Started.md index cc80a16..122e6ae 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -55,7 +55,7 @@ services: restart: always volumes: - /etc/localtime:/etc/localtime:ro - - ./:/var/log:rw + - ./logs:/var/log:rw ``` #### Parameters @@ -72,7 +72,7 @@ docker run -it -d --name py3-kms \ -e LOGSIZE=2 \ -e LOGFILE=/var/log/pykms_logserver.log \ -v /etc/localtime:/etc/localtime:ro \ - -v /var/log:/var/log:rw \ + -v ./logs:/var/log:rw \ --restart unless-stopped pykmsorg/py-kms:[TAG] ``` You can omit the `-e SQLITE=...` and `-p 8080:8080` option if you plan to use the `minimal` or `latest` image, which does not include the respective module support. From b170ce60b29f521e189bf7decfb9ec486cbc6c40 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sun, 12 Sep 2021 18:51:13 +0200 Subject: [PATCH 002/154] Added initial github config --- .github/workflows/main.yml | 43 ++++++++++++++++ .../{Dockerfile.amd64 => Dockerfile} | 0 .../docker-py3-kms-minimal/Dockerfile.arm32v6 | 44 ----------------- .../docker-py3-kms-minimal/Dockerfile.arm32v7 | 44 ----------------- .../docker-py3-kms-minimal/Dockerfile.arm64v8 | 44 ----------------- docker/docker-py3-kms-minimal/hooks/post_push | 10 ---- docker/docker-py3-kms-minimal/hooks/pre_build | 5 -- .../multi-arch-manifest-latest.yaml | 21 -------- .../multi-arch-manifest-minimal.yaml | 21 -------- .../{Dockerfile.amd64 => Dockerfile} | 0 docker/docker-py3-kms/Dockerfile.arm32v6 | 49 ------------------- docker/docker-py3-kms/Dockerfile.arm32v7 | 49 ------------------- docker/docker-py3-kms/Dockerfile.arm64v8 | 49 ------------------- docker/docker-py3-kms/build-py3-kms.sh | 2 +- docker/docker-py3-kms/hooks/post_push | 9 ---- docker/docker-py3-kms/hooks/pre_build | 5 -- .../multi-arch-manifest-python3.yaml | 21 -------- 17 files changed, 44 insertions(+), 372 deletions(-) create mode 100644 .github/workflows/main.yml rename docker/docker-py3-kms-minimal/{Dockerfile.amd64 => Dockerfile} (100%) delete mode 100644 docker/docker-py3-kms-minimal/Dockerfile.arm32v6 delete mode 100644 docker/docker-py3-kms-minimal/Dockerfile.arm32v7 delete mode 100644 docker/docker-py3-kms-minimal/Dockerfile.arm64v8 delete mode 100644 docker/docker-py3-kms-minimal/hooks/post_push delete mode 100755 docker/docker-py3-kms-minimal/hooks/pre_build delete mode 100644 docker/docker-py3-kms-minimal/multi-arch-manifest-latest.yaml delete mode 100644 docker/docker-py3-kms-minimal/multi-arch-manifest-minimal.yaml rename docker/docker-py3-kms/{Dockerfile.amd64 => Dockerfile} (100%) delete mode 100644 docker/docker-py3-kms/Dockerfile.arm32v6 delete mode 100644 docker/docker-py3-kms/Dockerfile.arm32v7 delete mode 100644 docker/docker-py3-kms/Dockerfile.arm64v8 delete mode 100644 docker/docker-py3-kms/hooks/post_push delete mode 100755 docker/docker-py3-kms/hooks/pre_build delete mode 100644 docker/docker-py3-kms/multi-arch-manifest-python3.yaml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..a828027 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,43 @@ +name: Build Image On Release + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + bake: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2.3.4 + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + with: + platforms: all + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1.6.0 + - name: Login to DockerHub + uses: docker/login-action@v1.10.0 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build + uses: docker/build-push-action@v2 + with: + context: ./docker/docker-py3-kms/ + file: ./docker/docker-py3-kms/Dockerfile + platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 + push: true + tags: latest + - name: Build + uses: docker/build-push-action@v2 + with: + context: ./docker/docker-py3-kms-minimal/ + file: ./docker/docker-py3-kms-minimal/Dockerfile + platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 + push: true + tags: minimal diff --git a/docker/docker-py3-kms-minimal/Dockerfile.amd64 b/docker/docker-py3-kms-minimal/Dockerfile similarity index 100% rename from docker/docker-py3-kms-minimal/Dockerfile.amd64 rename to docker/docker-py3-kms-minimal/Dockerfile diff --git a/docker/docker-py3-kms-minimal/Dockerfile.arm32v6 b/docker/docker-py3-kms-minimal/Dockerfile.arm32v6 deleted file mode 100644 index c555137..0000000 --- a/docker/docker-py3-kms-minimal/Dockerfile.arm32v6 +++ /dev/null @@ -1,44 +0,0 @@ -# This is a minimized version from docker/docker-py3-kms/Dockerfile without SQLite support to further reduce image size - -# Prepare the multiarch env -FROM alpine AS builder -RUN apk add curl && curl -L "https://github.com/balena-io/qemu/releases/download/v4.0.0%2Bbalena2/qemu-4.0.0.balena2-arm.tar.gz" | tar zxvf - -C . --strip-components 1 - -# Switch to the target image -FROM arm32v6/alpine:3.12 - -# Import qemu from the preparation -COPY --from=builder qemu-arm-static /usr/bin - -ENV IP 0.0.0.0 -ENV PORT 1688 -ENV EPID "" -ENV LCID 1033 -ENV CLIENT_COUNT 26 -ENV ACTIVATION_INTERVAL 120 -ENV RENEWAL_INTERVAL 10080 -ENV HWID "RANDOM" -ENV LOGLEVEL INFO -ENV LOGFILE /var/log/pykms_logserver.log -ENV LOGSIZE "" - -RUN apk add --no-cache --update \ - bash \ - git \ - py3-argparse \ - py3-flask \ - py3-pygments \ - python3-tkinter \ - sqlite-libs \ - py3-pip && \ - pip3 install peewee tzlocal && \ - git clone https://github.com/SystemRage/py-kms/ /tmp/py-kms && \ - mv /tmp/py-kms/py-kms /home/ && \ - rm -rf /tmp/py-kms && \ - apk del git - -WORKDIR /home/py-kms - -EXPOSE ${PORT}/tcp - -ENTRYPOINT /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} diff --git a/docker/docker-py3-kms-minimal/Dockerfile.arm32v7 b/docker/docker-py3-kms-minimal/Dockerfile.arm32v7 deleted file mode 100644 index 08c1cc4..0000000 --- a/docker/docker-py3-kms-minimal/Dockerfile.arm32v7 +++ /dev/null @@ -1,44 +0,0 @@ -# This is a minimized version from docker/docker-py3-kms/Dockerfile without SQLite support to further reduce image size - -# Prepare the multiarch env -FROM alpine AS builder -RUN apk add curl && curl -L "https://github.com/balena-io/qemu/releases/download/v4.0.0%2Bbalena2/qemu-4.0.0.balena2-arm.tar.gz" | tar zxvf - -C . --strip-components 1 - -# Switch to the target image -FROM arm32v7/alpine:3.12 - -# Import qemu from the preparation -COPY --from=builder qemu-arm-static /usr/bin - -ENV IP 0.0.0.0 -ENV PORT 1688 -ENV EPID "" -ENV LCID 1033 -ENV CLIENT_COUNT 26 -ENV ACTIVATION_INTERVAL 120 -ENV RENEWAL_INTERVAL 10080 -ENV HWID "RANDOM" -ENV LOGLEVEL INFO -ENV LOGFILE /var/log/pykms_logserver.log -ENV LOGSIZE "" - -RUN apk add --no-cache --update \ - bash \ - git \ - py3-argparse \ - py3-flask \ - py3-pygments \ - python3-tkinter \ - sqlite-libs \ - py3-pip && \ - pip3 install peewee tzlocal && \ - git clone https://github.com/SystemRage/py-kms/ /tmp/py-kms && \ - mv /tmp/py-kms/py-kms /home/ && \ - rm -rf /tmp/py-kms && \ - apk del git - -WORKDIR /home/py-kms - -EXPOSE ${PORT}/tcp - -ENTRYPOINT /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} diff --git a/docker/docker-py3-kms-minimal/Dockerfile.arm64v8 b/docker/docker-py3-kms-minimal/Dockerfile.arm64v8 deleted file mode 100644 index e3ebfb7..0000000 --- a/docker/docker-py3-kms-minimal/Dockerfile.arm64v8 +++ /dev/null @@ -1,44 +0,0 @@ -# This is a minimized version from docker/docker-py3-kms/Dockerfile without SQLite support to further reduce image size - -# Prepare the multiarch env -FROM alpine AS builder -RUN apk add curl && curl -L "https://github.com/balena-io/qemu/releases/download/v4.0.0%2Bbalena2/qemu-4.0.0.balena2-aarch64.tar.gz" | tar zxvf - -C . --strip-components 1 - -# Switch to the target image -FROM arm64v8/alpine:3.12 - -# Import qemu from the preparation -COPY --from=builder qemu-aarch64-static /usr/bin - -ENV IP 0.0.0.0 -ENV PORT 1688 -ENV EPID "" -ENV LCID 1033 -ENV CLIENT_COUNT 26 -ENV ACTIVATION_INTERVAL 120 -ENV RENEWAL_INTERVAL 10080 -ENV HWID "RANDOM" -ENV LOGLEVEL INFO -ENV LOGFILE /var/log/pykms_logserver.log -ENV LOGSIZE "" - -RUN apk add --no-cache --update \ - bash \ - git \ - py3-argparse \ - py3-flask \ - py3-pygments \ - python3-tkinter \ - sqlite-libs \ - py3-pip && \ - pip3 install peewee tzlocal && \ - git clone https://github.com/SystemRage/py-kms/ /tmp/py-kms && \ - mv /tmp/py-kms/py-kms /home/ && \ - rm -rf /tmp/py-kms && \ - apk del git - -WORKDIR /home/py-kms - -EXPOSE ${PORT}/tcp - -ENTRYPOINT /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} diff --git a/docker/docker-py3-kms-minimal/hooks/post_push b/docker/docker-py3-kms-minimal/hooks/post_push deleted file mode 100644 index b1aa8e1..0000000 --- a/docker/docker-py3-kms-minimal/hooks/post_push +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -# Use manifest-tool to create the manifest, given the experimental -# "docker manifest" command isn't available yet on Docker Hub. - -curl -Lo manifest-tool "https://github.com/estesp/manifest-tool/releases/download/v1.0.2/manifest-tool-linux-amd64" -chmod +x manifest-tool - -./manifest-tool push from-spec multi-arch-manifest-latest.yaml -./manifest-tool push from-spec multi-arch-manifest-minimal.yaml diff --git a/docker/docker-py3-kms-minimal/hooks/pre_build b/docker/docker-py3-kms-minimal/hooks/pre_build deleted file mode 100755 index 0a94f7e..0000000 --- a/docker/docker-py3-kms-minimal/hooks/pre_build +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -# Register qemu-*-static for all supported processors except the -# current one, but also remove all registered binfmt_misc before -docker run --rm --privileged multiarch/qemu-user-static:register --reset diff --git a/docker/docker-py3-kms-minimal/multi-arch-manifest-latest.yaml b/docker/docker-py3-kms-minimal/multi-arch-manifest-latest.yaml deleted file mode 100644 index 9747b43..0000000 --- a/docker/docker-py3-kms-minimal/multi-arch-manifest-latest.yaml +++ /dev/null @@ -1,21 +0,0 @@ -image: pykmsorg/py-kms:latest -manifests: - - image: pykmsorg/py-kms:minimal-amd64 - platform: - architecture: amd64 - os: linux - - image: pykmsorg/py-kms:minimal-arm32v6 - platform: - architecture: arm - os: linux - variant: v6 - - image: pykmsorg/py-kms:minimal-arm32v7 - platform: - architecture: arm - os: linux - variant: v7 - - image: pykmsorg/py-kms:minimal-arm64v8 - platform: - architecture: arm64 - os: linux - variant: v8 diff --git a/docker/docker-py3-kms-minimal/multi-arch-manifest-minimal.yaml b/docker/docker-py3-kms-minimal/multi-arch-manifest-minimal.yaml deleted file mode 100644 index a3daff2..0000000 --- a/docker/docker-py3-kms-minimal/multi-arch-manifest-minimal.yaml +++ /dev/null @@ -1,21 +0,0 @@ -image: pykmsorg/py-kms:minimal -manifests: - - image: pykmsorg/py-kms:minimal-amd64 - platform: - architecture: amd64 - os: linux - - image: pykmsorg/py-kms:minimal-arm32v6 - platform: - architecture: arm - os: linux - variant: v6 - - image: pykmsorg/py-kms:minimal-arm32v7 - platform: - architecture: arm - os: linux - variant: v7 - - image: pykmsorg/py-kms:minimal-arm64v8 - platform: - architecture: arm64 - os: linux - variant: v8 diff --git a/docker/docker-py3-kms/Dockerfile.amd64 b/docker/docker-py3-kms/Dockerfile similarity index 100% rename from docker/docker-py3-kms/Dockerfile.amd64 rename to docker/docker-py3-kms/Dockerfile diff --git a/docker/docker-py3-kms/Dockerfile.arm32v6 b/docker/docker-py3-kms/Dockerfile.arm32v6 deleted file mode 100644 index 0ff4b31..0000000 --- a/docker/docker-py3-kms/Dockerfile.arm32v6 +++ /dev/null @@ -1,49 +0,0 @@ -# Prepare the multiarch env -FROM alpine AS builder -RUN apk add curl && curl -L "https://github.com/balena-io/qemu/releases/download/v4.0.0%2Bbalena2/qemu-4.0.0.balena2-arm.tar.gz" | tar zxvf - -C . --strip-components 1 - -# Switch to the target image -FROM arm32v6/alpine:3.12 - -# Import qemu from the preparation -COPY --from=builder qemu-arm-static /usr/bin - -ENV IP 0.0.0.0 -ENV PORT 1688 -ENV EPID "" -ENV LCID 1033 -ENV CLIENT_COUNT 26 -ENV ACTIVATION_INTERVAL 120 -ENV RENEWAL_INTERVAL 10080 -ENV SQLITE false -ENV HWID "364F463A8863D35F" -ENV LOGLEVEL ERROR -ENV LOGFILE /var/log/pykms_logserver.log -ENV LOGSIZE "" - -COPY start.sh /usr/bin/start.sh - -RUN apk add --no-cache --update \ - bash \ - git \ - py3-argparse \ - py3-flask \ - py3-pygments \ - python3-tkinter \ - sqlite-libs \ - py3-pip && \ - git clone https://github.com/SystemRage/py-kms.git /tmp/py-kms && \ - git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ - mv /tmp/py-kms/py-kms /home/ && \ - mv /tmp/sqlite_web/sqlite_web /home/ && \ - rm -rf /tmp/py-kms && \ - rm -rf /tmp/sqlite_web && \ - pip3 install peewee tzlocal pysqlite3 && \ - chmod a+x /usr/bin/start.sh && \ - apk del git - -WORKDIR /home/py-kms - -EXPOSE ${PORT}/tcp - -ENTRYPOINT ["/usr/bin/start.sh"] diff --git a/docker/docker-py3-kms/Dockerfile.arm32v7 b/docker/docker-py3-kms/Dockerfile.arm32v7 deleted file mode 100644 index b43baba..0000000 --- a/docker/docker-py3-kms/Dockerfile.arm32v7 +++ /dev/null @@ -1,49 +0,0 @@ -# Prepare the multiarch env -FROM alpine AS builder -RUN apk add curl && curl -L "https://github.com/balena-io/qemu/releases/download/v4.0.0%2Bbalena2/qemu-4.0.0.balena2-arm.tar.gz" | tar zxvf - -C . --strip-components 1 - -# Switch to the target image -FROM arm32v7/alpine:3.12 - -# Import qemu from the preparation -COPY --from=builder qemu-arm-static /usr/bin - -ENV IP 0.0.0.0 -ENV PORT 1688 -ENV EPID "" -ENV LCID 1033 -ENV CLIENT_COUNT 26 -ENV ACTIVATION_INTERVAL 120 -ENV RENEWAL_INTERVAL 10080 -ENV SQLITE false -ENV HWID "364F463A8863D35F" -ENV LOGLEVEL ERROR -ENV LOGFILE /var/log/pykms_logserver.log -ENV LOGSIZE "" - -COPY start.sh /usr/bin/start.sh - -RUN apk add --no-cache --update \ - bash \ - git \ - py3-argparse \ - py3-flask \ - py3-pygments \ - python3-tkinter \ - sqlite-libs \ - py3-pip && \ - git clone https://github.com/SystemRage/py-kms.git /tmp/py-kms && \ - git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ - mv /tmp/py-kms/py-kms /home/ && \ - mv /tmp/sqlite_web/sqlite_web /home/ && \ - rm -rf /tmp/py-kms && \ - rm -rf /tmp/sqlite_web && \ - pip3 install peewee tzlocal pysqlite3 && \ - chmod a+x /usr/bin/start.sh && \ - apk del git - -WORKDIR /home/py-kms - -EXPOSE ${PORT}/tcp - -ENTRYPOINT ["/usr/bin/start.sh"] diff --git a/docker/docker-py3-kms/Dockerfile.arm64v8 b/docker/docker-py3-kms/Dockerfile.arm64v8 deleted file mode 100644 index 31d1244..0000000 --- a/docker/docker-py3-kms/Dockerfile.arm64v8 +++ /dev/null @@ -1,49 +0,0 @@ -# Prepare the multiarch env -FROM alpine AS builder -RUN apk add curl && curl -L "https://github.com/balena-io/qemu/releases/download/v4.0.0%2Bbalena2/qemu-4.0.0.balena2-aarch64.tar.gz" | tar zxvf - -C . --strip-components 1 - -# Switch to the target image -FROM arm64v8/alpine:3.12 - -# Import qemu from the preparation -COPY --from=builder qemu-aarch64-static /usr/bin - -ENV IP 0.0.0.0 -ENV PORT 1688 -ENV EPID "" -ENV LCID 1033 -ENV CLIENT_COUNT 26 -ENV ACTIVATION_INTERVAL 120 -ENV RENEWAL_INTERVAL 10080 -ENV SQLITE false -ENV HWID "364F463A8863D35F" -ENV LOGLEVEL ERROR -ENV LOGFILE /var/log/pykms_logserver.log -ENV LOGSIZE "" - -COPY start.sh /usr/bin/start.sh - -RUN apk add --no-cache --update \ - bash \ - git \ - py3-argparse \ - py3-flask \ - py3-pygments \ - python3-tkinter \ - sqlite-libs \ - py3-pip && \ - git clone https://github.com/SystemRage/py-kms.git /tmp/py-kms && \ - git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ - mv /tmp/py-kms/py-kms /home/ && \ - mv /tmp/sqlite_web/sqlite_web /home/ && \ - rm -rf /tmp/py-kms && \ - rm -rf /tmp/sqlite_web && \ - pip3 install peewee tzlocal pysqlite3 && \ - chmod a+x /usr/bin/start.sh && \ - apk del git - -WORKDIR /home/py-kms - -EXPOSE ${PORT}/tcp - -ENTRYPOINT ["/usr/bin/start.sh"] diff --git a/docker/docker-py3-kms/build-py3-kms.sh b/docker/docker-py3-kms/build-py3-kms.sh index 616f1f5..d671d4a 100755 --- a/docker/docker-py3-kms/build-py3-kms.sh +++ b/docker/docker-py3-kms/build-py3-kms.sh @@ -1 +1 @@ -docker build -t pykms/pykms:py3-kms . --file Dockerfile.amd64 +docker build -t pykms/pykms:py3-kms . --file Dockerfile diff --git a/docker/docker-py3-kms/hooks/post_push b/docker/docker-py3-kms/hooks/post_push deleted file mode 100644 index 698e3ce..0000000 --- a/docker/docker-py3-kms/hooks/post_push +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# Use manifest-tool to create the manifest, given the experimental -# "docker manifest" command isn't available yet on Docker Hub. - -curl -Lo manifest-tool "https://github.com/estesp/manifest-tool/releases/download/v1.0.2/manifest-tool-linux-amd64" -chmod +x manifest-tool - -./manifest-tool push from-spec multi-arch-manifest-python3.yaml diff --git a/docker/docker-py3-kms/hooks/pre_build b/docker/docker-py3-kms/hooks/pre_build deleted file mode 100755 index 0a94f7e..0000000 --- a/docker/docker-py3-kms/hooks/pre_build +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -# Register qemu-*-static for all supported processors except the -# current one, but also remove all registered binfmt_misc before -docker run --rm --privileged multiarch/qemu-user-static:register --reset diff --git a/docker/docker-py3-kms/multi-arch-manifest-python3.yaml b/docker/docker-py3-kms/multi-arch-manifest-python3.yaml deleted file mode 100644 index ede1020..0000000 --- a/docker/docker-py3-kms/multi-arch-manifest-python3.yaml +++ /dev/null @@ -1,21 +0,0 @@ -image: pykmsorg/py-kms:python3 -manifests: - - image: pykmsorg/py-kms:python3-amd64 - platform: - architecture: amd64 - os: linux - - image: pykmsorg/py-kms:python3-arm32v6 - platform: - architecture: arm - os: linux - variant: v6 - - image: pykmsorg/py-kms:python3-arm32v7 - platform: - architecture: arm - os: linux - variant: v7 - - image: pykmsorg/py-kms:python3-arm64v8 - platform: - architecture: arm64 - os: linux - variant: v8 From cfdd668741eb292d9097763381422e5f85442bcf Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sun, 12 Sep 2021 19:02:39 +0200 Subject: [PATCH 003/154] Fixed python (broken by upstream) --- docker/docker-py3-kms-minimal/Dockerfile | 5 +++-- docker/docker-py3-kms/Dockerfile | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index afd3e42..29940a0 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -22,12 +22,13 @@ RUN apk add --no-cache --update \ py3-pygments \ python3-tkinter \ sqlite-libs \ - py3-pip && \ + py3-pip \ + build-base python3-dev && \ pip3 install peewee tzlocal && \ git clone https://github.com/SystemRage/py-kms/ /tmp/py-kms && \ mv /tmp/py-kms/py-kms /home/ && \ rm -rf /tmp/py-kms && \ - apk del git + apk del git build-base python3-dev WORKDIR /home/py-kms diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 393962a..7ab7bfb 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -23,7 +23,8 @@ RUN apk add --no-cache --update \ py3-pygments \ python3-tkinter \ sqlite-libs \ - py3-pip && \ + py3-pip \ + build-base python3-dev && \ git clone https://github.com/SystemRage/py-kms.git /tmp/py-kms && \ git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ mv /tmp/py-kms/py-kms /home/ && \ @@ -32,7 +33,7 @@ RUN apk add --no-cache --update \ rm -rf /tmp/sqlite_web && \ pip3 install peewee tzlocal pysqlite3 && \ chmod a+x /usr/bin/start.sh && \ - apk del git + apk del git build-base python3-dev WORKDIR /home/py-kms From acf8b31a9e8f834b73b89e310640b17f813b23f1 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sun, 12 Sep 2021 19:08:00 +0200 Subject: [PATCH 004/154] Fixed wrong push target --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a828027..48a72ec 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,7 +32,7 @@ jobs: file: ./docker/docker-py3-kms/Dockerfile platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 push: true - tags: latest + tags: pykmsorg/py-kms:latest - name: Build uses: docker/build-push-action@v2 with: @@ -40,4 +40,4 @@ jobs: file: ./docker/docker-py3-kms-minimal/Dockerfile platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 push: true - tags: minimal + tags: pykmsorg/py-kms:minimal From 57ab28d1880f2cb23198feae0df577db1fa0f886 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sun, 12 Sep 2021 19:14:38 +0200 Subject: [PATCH 005/154] Added manual trigger --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 48a72ec..0db0eb8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,6 +1,7 @@ name: Build Image On Release on: + workflow_dispatch: push: branches: - master From b120555245155a4c04b0518dcdf1a35e8afe6908 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sun, 12 Sep 2021 19:31:43 +0200 Subject: [PATCH 006/154] Added GHCR support --- .github/workflows/main.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0db0eb8..b885ab3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,6 +26,12 @@ jobs: with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + - name: Login to GitHub Container Registry + uses: docker/login-action@v1.10.0 + with: + registry: ghcr.io + username: pykmsorgadmin + password: ${{ secrets.GHCR_PASSWORD }} - name: Build uses: docker/build-push-action@v2 with: @@ -33,7 +39,7 @@ jobs: file: ./docker/docker-py3-kms/Dockerfile platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 push: true - tags: pykmsorg/py-kms:latest + tags: pykmsorg/py-kms:latest,ghcr.io/py-kms-organization/py-kms:latest - name: Build uses: docker/build-push-action@v2 with: @@ -41,4 +47,4 @@ jobs: file: ./docker/docker-py3-kms-minimal/Dockerfile platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 push: true - tags: pykmsorg/py-kms:minimal + tags: pykmsorg/py-kms:minimal,ghcr.io/py-kms-organization/py-kms:minimal From 5109446ce59a06a859fb0a03c67a2d24f256e57a Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sun, 12 Sep 2021 19:37:53 +0200 Subject: [PATCH 007/154] Corrected wrong tagging --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b885ab3..659ea87 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -39,7 +39,7 @@ jobs: file: ./docker/docker-py3-kms/Dockerfile platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 push: true - tags: pykmsorg/py-kms:latest,ghcr.io/py-kms-organization/py-kms:latest + tags: pykmsorg/py-kms:python3,ghcr.io/py-kms-organization/py-kms:python3 - name: Build uses: docker/build-push-action@v2 with: @@ -47,4 +47,4 @@ jobs: file: ./docker/docker-py3-kms-minimal/Dockerfile platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 push: true - tags: pykmsorg/py-kms:minimal,ghcr.io/py-kms-organization/py-kms:minimal + tags: pykmsorg/py-kms:latest,ghcr.io/py-kms-organization/py-kms:latest,pykmsorg/py-kms:minimal,ghcr.io/py-kms-organization/py-kms:minimal From d1db33f24bfb8368e732b67095064131951b73b5 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sun, 12 Sep 2021 20:08:50 +0200 Subject: [PATCH 008/154] Switch to runner based authentication --- .github/workflows/main.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 659ea87..9649b41 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,6 +12,9 @@ on: jobs: bake: runs-on: ubuntu-latest + permissions: + packages: write + contents: read steps: - name: Checkout uses: actions/checkout@v2.3.4 @@ -30,8 +33,8 @@ jobs: uses: docker/login-action@v1.10.0 with: registry: ghcr.io - username: pykmsorgadmin - password: ${{ secrets.GHCR_PASSWORD }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Build uses: docker/build-push-action@v2 with: From 0ac968c510dbbb7efb6ca887e611b4ea9c34c9b7 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Mon, 13 Sep 2021 10:29:13 +0200 Subject: [PATCH 009/154] Added 2022 GLVKs --- docs/Keys.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/Keys.md b/docs/Keys.md index fa9a258..30afc99 100644 --- a/docs/Keys.md +++ b/docs/Keys.md @@ -5,6 +5,13 @@ sometimes even reject it by itself (often due too many uses - in that case try t ## Windows *** +### Windows Server 2022 + +| Product | GVLK | +| --- | --- | +| Windows Server 2022 Datacenter | `WX4NM-KYWYW-QJJR4-XV3QB-6VM33` | +| Windows Server 2022 Standard | `VDYBN-27WPP-V4HQT-9VMD4-VMK7H` | + ### Windows Server 2019 | Product | GVLK | From 873ee726e6f02551eebfa3e2b585964d966e3a7a Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Mon, 13 Sep 2021 10:59:29 +0200 Subject: [PATCH 010/154] Corrected clone location for new repo --- docker/docker-py3-kms-minimal/Dockerfile | 2 +- docker/docker-py3-kms/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 29940a0..a5b9e72 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -25,7 +25,7 @@ RUN apk add --no-cache --update \ py3-pip \ build-base python3-dev && \ pip3 install peewee tzlocal && \ - git clone https://github.com/SystemRage/py-kms/ /tmp/py-kms && \ + git clone https://github.com/Py-KMS-Organization/py-kms.git /tmp/py-kms && \ mv /tmp/py-kms/py-kms /home/ && \ rm -rf /tmp/py-kms && \ apk del git build-base python3-dev diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 7ab7bfb..e42865f 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -25,7 +25,7 @@ RUN apk add --no-cache --update \ sqlite-libs \ py3-pip \ build-base python3-dev && \ - git clone https://github.com/SystemRage/py-kms.git /tmp/py-kms && \ + git clone https://github.com/Py-KMS-Organization/py-kms.git /tmp/py-kms && \ git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ mv /tmp/py-kms/py-kms /home/ && \ mv /tmp/sqlite_web/sqlite_web /home/ && \ From da202201c513e4f8fa360bf74e20d43f8d83d477 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Mon, 13 Sep 2021 11:13:48 +0200 Subject: [PATCH 011/154] Removed fresh code cloning from building (use the local cahced version instead) --- .github/workflows/main.yml | 4 ++-- docker/README.md | 2 ++ docker/docker-py3-kms-minimal/Dockerfile | 5 ++--- docker/docker-py3-kms/Dockerfile | 6 ++---- docker/docker-py3-kms/build-py3-kms.sh | 2 +- docker/docker-py3-kms/run-py3-kms.sh | 2 +- 6 files changed, 10 insertions(+), 11 deletions(-) create mode 100644 docker/README.md diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9649b41..f1b995e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -38,7 +38,7 @@ jobs: - name: Build uses: docker/build-push-action@v2 with: - context: ./docker/docker-py3-kms/ + context: . file: ./docker/docker-py3-kms/Dockerfile platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 push: true @@ -46,7 +46,7 @@ jobs: - name: Build uses: docker/build-push-action@v2 with: - context: ./docker/docker-py3-kms-minimal/ + context: . file: ./docker/docker-py3-kms-minimal/Dockerfile platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 push: true diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..56263c7 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,2 @@ +Both docker files must access the source code of this repository. Therefore the build context must be the root of the project directory. +Take a look into the build script for the normal py-kms version, as it demonstrates exactly that case and how to use these docker files. diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index a5b9e72..2fd9768 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -14,6 +14,8 @@ ENV LOGLEVEL INFO ENV LOGFILE /var/log/pykms_logserver.log ENV LOGSIZE "" +COPY ./py-kms /home/py-kms + RUN apk add --no-cache --update \ bash \ git \ @@ -25,9 +27,6 @@ RUN apk add --no-cache --update \ py3-pip \ build-base python3-dev && \ pip3 install peewee tzlocal && \ - git clone https://github.com/Py-KMS-Organization/py-kms.git /tmp/py-kms && \ - mv /tmp/py-kms/py-kms /home/ && \ - rm -rf /tmp/py-kms && \ apk del git build-base python3-dev WORKDIR /home/py-kms diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index e42865f..e98a808 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -13,7 +13,8 @@ ENV LOGLEVEL ERROR ENV LOGFILE /var/log/pykms_logserver.log ENV LOGSIZE "" -COPY start.sh /usr/bin/start.sh +COPY docker/docker-py3-kms/start.sh /usr/bin/start.sh +COPY ./py-kms /home/py-kms RUN apk add --no-cache --update \ bash \ @@ -25,11 +26,8 @@ RUN apk add --no-cache --update \ sqlite-libs \ py3-pip \ build-base python3-dev && \ - git clone https://github.com/Py-KMS-Organization/py-kms.git /tmp/py-kms && \ git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ - mv /tmp/py-kms/py-kms /home/ && \ mv /tmp/sqlite_web/sqlite_web /home/ && \ - rm -rf /tmp/py-kms && \ rm -rf /tmp/sqlite_web && \ pip3 install peewee tzlocal pysqlite3 && \ chmod a+x /usr/bin/start.sh && \ diff --git a/docker/docker-py3-kms/build-py3-kms.sh b/docker/docker-py3-kms/build-py3-kms.sh index d671d4a..71e6145 100755 --- a/docker/docker-py3-kms/build-py3-kms.sh +++ b/docker/docker-py3-kms/build-py3-kms.sh @@ -1 +1 @@ -docker build -t pykms/pykms:py3-kms . --file Dockerfile +docker build -t pykms/pykms:py3-kms ../../ --file ./Dockerfile diff --git a/docker/docker-py3-kms/run-py3-kms.sh b/docker/docker-py3-kms/run-py3-kms.sh index a98e5d4..b8d5f4c 100755 --- a/docker/docker-py3-kms/run-py3-kms.sh +++ b/docker/docker-py3-kms/run-py3-kms.sh @@ -13,4 +13,4 @@ docker run -d --name py3-kms \ -e LOGSIZE=2 \ -v /etc/localtime:/etc/localtime:ro \ -v /var/log:/var/log:rw \ - --restart unless-stopped pykmsorg/py-kms:python3 + --restart unless-stopped pykms/pykms:py3-kms From e151f97a8b39d354477256b35a35b1a3f80ff04a Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Mon, 13 Sep 2021 11:15:05 +0200 Subject: [PATCH 012/154] Added enhancement for Windows Server 2022 --- py-kms/pykms_Base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/py-kms/pykms_Base.py b/py-kms/pykms_Base.py index d70bdfe..6397b4a 100644 --- a/py-kms/pykms_Base.py +++ b/py-kms/pykms_Base.py @@ -161,6 +161,7 @@ def serverLogic(self, kmsRequest): # Get a name for SkuId, AppId. kmsdb = kmsDB2Dict() + appName, skuName = str(applicationId), str(skuId) appitems = kmsdb[2] for appitem in appitems: From c3ae9a95138d892740a3c8a87a9236a24c00b8cf Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Mon, 13 Sep 2021 11:16:26 +0200 Subject: [PATCH 013/154] Added Windows Server 2022 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 81d7160..c9e9b0f 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ _py-kms_ is a port of node-kms created by [cyrozap](http://forums.mydigitallife. - Windows Server 2012 R2 - Windows Server 2016 - Windows Server 2019 + - Windows Server 2022 - Microsoft Office 2010 ( Volume License ) - Microsoft Office 2013 ( Volume License ) - Microsoft Office 2016 ( Volume License ) From b1e66b615551c3fa76289001d0c410b2c4ccca05 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Mon, 13 Sep 2021 11:18:01 +0200 Subject: [PATCH 014/154] Updated shields to point to new repository --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c9e9b0f..16a9109 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Readme -![repo-size](https://img.shields.io/github/repo-size/SystemRage/py-kms) -![open-issues](https://img.shields.io/github/issues/SystemRage/py-kms) -![last-commit](https://img.shields.io/github/last-commit/SystemRage/py-kms/master) +![repo-size](https://img.shields.io/github/repo-size/Py-KMS-Organization/py-kms) +![open-issues](https://img.shields.io/github/issues/Py-KMS-Organization/py-kms) +![last-commit](https://img.shields.io/github/last-commit/Py-KMS-Organization/py-kms/master) ![docker-status](https://img.shields.io/docker/cloud/build/pykmsorg/py-kms) ![docker-pulls](https://img.shields.io/docker/pulls/pykmsorg/py-kms) ![read-the-docs](https://img.shields.io/readthedocs/py-kms) From c760b28eae4304f0527e18009a6fcb9847c5ab7a Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Mon, 13 Sep 2021 11:21:12 +0200 Subject: [PATCH 015/154] Added history of this fork --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 16a9109..e73504e 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ ## History _py-kms_ is a port of node-kms created by [cyrozap](http://forums.mydigitallife.info/members/183074-markedsword), which is a port of either the C#, C++, or .NET implementations of KMS Emulator. The original version was written by [CODYQX4](http://forums.mydigitallife.info/members/89933-CODYQX4) and is derived from the reverse-engineered code of Microsoft's official KMS. +This version of _py-kms_ is for itself a fork of the original implementation by [SystemRage](https://github.com/SystemRage/py-kms), which was abandoned early 2021. ## Features - Responds to `v4`, `v5`, and `v6` KMS requests. From ea711f8736433c0d11709f3ff7fa02d34f9c0a16 Mon Sep 17 00:00:00 2001 From: Tristan <39345534+MichelBaie@users.noreply.github.com> Date: Sun, 19 Sep 2021 14:35:14 +0200 Subject: [PATCH 016/154] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e73504e..484d8f9 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ This version of _py-kms_ is for itself a fork of the original implementation by - Windows 8 - Windows 8.1 - Windows 10 ( 1511 / 1607 / 1703 / 1709 / 1803 / 1809 ) - - Windows 10 ( 1903 / 1909 / 20H1 ) + - Windows 10 ( 1903 / 1909 / 20H1, 20H2, 21H1 ) - Windows Server 2008 - Windows Server 2008 R2 - Windows Server 2012 From f7062f75c6ca4aee7c15b209cacbcfa31eedbc8b Mon Sep 17 00:00:00 2001 From: Matthew Beckett Date: Thu, 7 Oct 2021 18:33:04 +0100 Subject: [PATCH 017/154] Add Helm chart for py-kms --- .gitignore | 2 + charts/py-kms/.helmignore | 23 +++++ charts/py-kms/Chart.yaml | 24 +++++ charts/py-kms/templates/NOTES.txt | 22 +++++ charts/py-kms/templates/_helpers.tpl | 62 +++++++++++++ charts/py-kms/templates/deployment.yaml | 69 ++++++++++++++ charts/py-kms/templates/hpa.yaml | 28 ++++++ charts/py-kms/templates/ingress.yaml | 61 +++++++++++++ charts/py-kms/templates/service.yaml | 19 ++++ charts/py-kms/templates/serviceaccount.yaml | 12 +++ .../templates/tests/test-connection.yaml | 15 +++ charts/py-kms/values.yaml | 91 +++++++++++++++++++ 12 files changed, 428 insertions(+) create mode 100644 charts/py-kms/.helmignore create mode 100644 charts/py-kms/Chart.yaml create mode 100644 charts/py-kms/templates/NOTES.txt create mode 100644 charts/py-kms/templates/_helpers.tpl create mode 100644 charts/py-kms/templates/deployment.yaml create mode 100644 charts/py-kms/templates/hpa.yaml create mode 100644 charts/py-kms/templates/ingress.yaml create mode 100644 charts/py-kms/templates/service.yaml create mode 100644 charts/py-kms/templates/serviceaccount.yaml create mode 100644 charts/py-kms/templates/tests/test-connection.yaml create mode 100644 charts/py-kms/values.yaml diff --git a/.gitignore b/.gitignore index 6d23810..a149ec6 100644 --- a/.gitignore +++ b/.gitignore @@ -128,3 +128,5 @@ dmypy.json # Pyre type checker .pyre/ +# Helm +charts/*/*.tgz \ No newline at end of file diff --git a/charts/py-kms/.helmignore b/charts/py-kms/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/charts/py-kms/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/py-kms/Chart.yaml b/charts/py-kms/Chart.yaml new file mode 100644 index 0000000..5ab290b --- /dev/null +++ b/charts/py-kms/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: py-kms +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "python3" diff --git a/charts/py-kms/templates/NOTES.txt b/charts/py-kms/templates/NOTES.txt new file mode 100644 index 0000000..7c70b5b --- /dev/null +++ b/charts/py-kms/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "py-kms.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "py-kms.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "py-kms.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "py-kms.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/charts/py-kms/templates/_helpers.tpl b/charts/py-kms/templates/_helpers.tpl new file mode 100644 index 0000000..803fd3a --- /dev/null +++ b/charts/py-kms/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "py-kms.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "py-kms.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "py-kms.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "py-kms.labels" -}} +helm.sh/chart: {{ include "py-kms.chart" . }} +{{ include "py-kms.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "py-kms.selectorLabels" -}} +app.kubernetes.io/name: {{ include "py-kms.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "py-kms.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "py-kms.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/charts/py-kms/templates/deployment.yaml b/charts/py-kms/templates/deployment.yaml new file mode 100644 index 0000000..a4e46b4 --- /dev/null +++ b/charts/py-kms/templates/deployment.yaml @@ -0,0 +1,69 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "py-kms.fullname" . }} + labels: + {{- include "py-kms.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "py-kms.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "py-kms.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "py-kms.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + {{- range $key, $val := (index .Values "py-kms" "environment") }} + - name: {{ $key }} + value: {{ $val | quote }} + {{- end }} + ports: + - name: kms + containerPort: 1688 + protocol: TCP + - name: http + containerPort: 8080 + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/charts/py-kms/templates/hpa.yaml b/charts/py-kms/templates/hpa.yaml new file mode 100644 index 0000000..db88558 --- /dev/null +++ b/charts/py-kms/templates/hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "py-kms.fullname" . }} + labels: + {{- include "py-kms.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "py-kms.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/charts/py-kms/templates/ingress.yaml b/charts/py-kms/templates/ingress.yaml new file mode 100644 index 0000000..2270735 --- /dev/null +++ b/charts/py-kms/templates/ingress.yaml @@ -0,0 +1,61 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "py-kms.fullname" . -}} +{{- $svcPort := .Values.service.httpPort -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "py-kms.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/charts/py-kms/templates/service.yaml b/charts/py-kms/templates/service.yaml new file mode 100644 index 0000000..370fa7c --- /dev/null +++ b/charts/py-kms/templates/service.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "py-kms.fullname" . }} + labels: + {{- include "py-kms.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.kmsPort }} + targetPort: 1688 + protocol: TCP + name: kms + - port: {{ .Values.service.httpPort }} + targetPort: 80 + protocol: TCP + name: http + selector: + {{- include "py-kms.selectorLabels" . | nindent 4 }} diff --git a/charts/py-kms/templates/serviceaccount.yaml b/charts/py-kms/templates/serviceaccount.yaml new file mode 100644 index 0000000..5bcc80c --- /dev/null +++ b/charts/py-kms/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "py-kms.serviceAccountName" . }} + labels: + {{- include "py-kms.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/charts/py-kms/templates/tests/test-connection.yaml b/charts/py-kms/templates/tests/test-connection.yaml new file mode 100644 index 0000000..01e7122 --- /dev/null +++ b/charts/py-kms/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "py-kms.fullname" . }}-test-connection" + labels: + {{- include "py-kms.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "py-kms.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/charts/py-kms/values.yaml b/charts/py-kms/values.yaml new file mode 100644 index 0000000..88b956d --- /dev/null +++ b/charts/py-kms/values.yaml @@ -0,0 +1,91 @@ +# Default values for py-kms. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: pykmsorg/py-kms + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: python3 + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +py-kms: + environment: + LOGLEVEL: INFO + LOGSIZE: 2 + HWID: RANDOM + SQLITE: true + IP: 0.0.0.0 + +serviceAccount: {} + # # Specifies whether a service account should be created + # create: true + # # Annotations to add to the service account + # annotations: {} + # # The name of the service account to use. + # # If not set and create is true, a name is generated using the fullname template + # name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + httpPort: 80 + kmsPort: 1688 + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} From 83a1638ba5884a387f46bd8dc2272141f04c30bd Mon Sep 17 00:00:00 2001 From: Matthew Beckett Date: Thu, 7 Oct 2021 18:40:27 +0100 Subject: [PATCH 018/154] Add helm-docs generated README.md --- charts/py-kms/README.md | 47 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 charts/py-kms/README.md diff --git a/charts/py-kms/README.md b/charts/py-kms/README.md new file mode 100644 index 0000000..553090f --- /dev/null +++ b/charts/py-kms/README.md @@ -0,0 +1,47 @@ +# py-kms + +![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: python3](https://img.shields.io/badge/AppVersion-python3-informational?style=flat-square) + +A Helm chart for Kubernetes + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| autoscaling.enabled | bool | `false` | | +| autoscaling.maxReplicas | int | `100` | | +| autoscaling.minReplicas | int | `1` | | +| autoscaling.targetCPUUtilizationPercentage | int | `80` | | +| fullnameOverride | string | `""` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"pykmsorg/py-kms"` | | +| image.tag | string | `"python3"` | | +| imagePullSecrets | list | `[]` | | +| ingress.annotations | object | `{}` | | +| ingress.className | string | `""` | | +| ingress.enabled | bool | `false` | | +| ingress.hosts[0].host | string | `"chart-example.local"` | | +| ingress.hosts[0].paths[0].path | string | `"/"` | | +| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` | | +| ingress.tls | list | `[]` | | +| nameOverride | string | `""` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podSecurityContext | object | `{}` | | +| py-kms.environment.HWID | string | `"RANDOM"` | | +| py-kms.environment.IP | string | `"0.0.0.0"` | | +| py-kms.environment.LOGLEVEL | string | `"INFO"` | | +| py-kms.environment.LOGSIZE | int | `2` | | +| py-kms.environment.SQLITE | bool | `true` | | +| replicaCount | int | `1` | | +| resources | object | `{}` | | +| securityContext | object | `{}` | | +| service.httpPort | int | `80` | | +| service.kmsPort | int | `1688` | | +| service.type | string | `"ClusterIP"` | | +| serviceAccount | object | `{}` | | +| tolerations | list | `[]` | | + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0) From 6f5b743d266991f23e974c2f29b4dea2681212d2 Mon Sep 17 00:00:00 2001 From: Matthew Beckett Date: Thu, 7 Oct 2021 19:25:16 +0100 Subject: [PATCH 019/154] Fix service.yaml containing invalid targetPort --- charts/py-kms/templates/service.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/py-kms/templates/service.yaml b/charts/py-kms/templates/service.yaml index 370fa7c..4a00fb6 100644 --- a/charts/py-kms/templates/service.yaml +++ b/charts/py-kms/templates/service.yaml @@ -12,7 +12,7 @@ spec: protocol: TCP name: kms - port: {{ .Values.service.httpPort }} - targetPort: 80 + targetPort: 8080 protocol: TCP name: http selector: From 4a7a8cf1c141661c793508a56be1244426d7ea41 Mon Sep 17 00:00:00 2001 From: Matthew Beckett Date: Thu, 7 Oct 2021 19:43:00 +0100 Subject: [PATCH 020/154] Enable writing to logfile in container until stdout is fixed --- charts/py-kms/values.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/charts/py-kms/values.yaml b/charts/py-kms/values.yaml index 88b956d..4b03894 100644 --- a/charts/py-kms/values.yaml +++ b/charts/py-kms/values.yaml @@ -18,6 +18,7 @@ py-kms: environment: LOGLEVEL: INFO LOGSIZE: 2 + LOGFILE: /var/log/py-kms.log HWID: RANDOM SQLITE: true IP: 0.0.0.0 From f93ea7f7a5f029cccd0b0aeb63a38b4bbdb2d41d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A6=E5=8A=9B=E6=80=95=E6=8E=A7?= Date: Sat, 9 Oct 2021 09:08:22 +0800 Subject: [PATCH 021/154] Update Keys.md Add Windows 11 keys --- docs/Keys.md | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/Keys.md b/docs/Keys.md index 30afc99..5a4de0b 100644 --- a/docs/Keys.md +++ b/docs/Keys.md @@ -39,37 +39,37 @@ sometimes even reject it by itself (often due too many uses - in that case try t | Windows Server 2016 Cloud Storage | `QN4C6-GBJD2-FB422-GHWJK-GJG2R` | | Windows Server 2016 Azure Core | `VP34G-4NPPG-79JTQ-864T4-R3MQX`
`WNCYY-GFBH2-M4WTT-XQ2FP-PG2K9` | -### Windows 10 +### Windows 10 & Windows 11 | Product | GVLK | | --- | --- | -| Windows 10 Professional Workstation | `NRG8B-VKK3Q-CXVCJ-9G2XF-6Q84J` | -| Windows 10 Professional Workstation N | `9FNHH-K3HBT-3W4TD-6383H-6XYWF` | -| Windows 10 Enterprise G | `YYVX9-NTFWV-6MDM3-9PT4T-4M68B` | -| Windows 10 Enterprise G N | `44RPN-FTY23-9VTTB-MP9BX-T84FV` | +| Windows 10/11 Professional Workstation | `NRG8B-VKK3Q-CXVCJ-9G2XF-6Q84J` | +| Windows 10/11 Professional Workstation N | `9FNHH-K3HBT-3W4TD-6383H-6XYWF` | +| Windows 10/11 Enterprise G | `YYVX9-NTFWV-6MDM3-9PT4T-4M68B` | +| Windows 10/11 Enterprise G N | `44RPN-FTY23-9VTTB-MP9BX-T84FV` | | Windows 10 Enterprise LTSC 2019 | `M7XTQ-FN8P6-TTKYV-9D4CC-J462D` | | Windows 10 Enterprise LTSC 2019 N | `92NFX-8DJQP-P6BBQ-THF9C-7CG2H` | -| Windows 10 Remote Server | `7NBT4-WGBQX-MP4H7-QXFF8-YP3KX` | -| Windows 10 Enterprise for Remote Sessions | `CPWHC-NT2C7-VYW78-DHDB2-PG3GK` | +| Windows 10/11 Remote Server | `7NBT4-WGBQX-MP4H7-QXFF8-YP3KX` | +| Windows 10/11 Enterprise for Remote Sessions | `CPWHC-NT2C7-VYW78-DHDB2-PG3GK` | | Windows 10 S (Lean) | `NBTWJ-3DR69-3C4V8-C26MC-GQ9M6` | -| Windows 10 Professional | `W269N-WFGWX-YVC9B-4J6C9-T83GX` | -| Windows 10 Professional N | `MH37W-N47XK-V7XM9-C7227-GCQG9`
`HMNWJ-V69R6-B2CDC-8P7VT-2373K` | -| Windows 10 Professional Education | `6TP4R-GNPTD-KYYHQ-7B7DP-J447Y` | -| Windows 10 Professional Education N | `YVWGF-BXNMC-HTQYQ-CPQ99-66QFC` | -| Windows 10 Education | `NW6C2-QMPVW-D7KKK-3GKT6-VCFB2`
`F48BJ-8NX82-MRVY9-PF8BW-HMHY2` | -| Windows 10 Education N | `2WH4N-8QGBV-H22JP-CT43Q-MDWWJ`
`PPWGW-8NW9C-J77Q9-8WHB9-QV64W` | -| Windows 10 Enterprise | `NPPR9-FWDCX-D2C8J-H872K-2YT43`
`96YNV-9X4RP-2YYKB-RMQH4-6Q72D`
`TN6CM-KCVXP-VVP8X-YVCF7-R9BDH`
`3PMKQ-YNVGT-HFJGG-2F4FQ-9D6T7` | -| Windows 10 Enterprise N | `DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4`
`WGGHN-J84D6-QYCPR-T7PJ7-X766F` | -| Windows 10 Enterprise S | `H76BG-QBNM7-73XY9-V6W2T-684BJ` | -| Windows 10 Enterprise S N | `X4R4B-NV6WD-PKTVK-F98BH-4C2J8` | +| Windows 10/11 Professional | `W269N-WFGWX-YVC9B-4J6C9-T83GX` | +| Windows 10/11 Professional N | `MH37W-N47XK-V7XM9-C7227-GCQG9`
`HMNWJ-V69R6-B2CDC-8P7VT-2373K` | +| Windows 10/11 Professional Education | `6TP4R-GNPTD-KYYHQ-7B7DP-J447Y` | +| Windows 10/11 Professional Education N | `YVWGF-BXNMC-HTQYQ-CPQ99-66QFC` | +| Windows 10/11 Education | `NW6C2-QMPVW-D7KKK-3GKT6-VCFB2`
`F48BJ-8NX82-MRVY9-PF8BW-HMHY2` | +| Windows 10/11 Education N | `2WH4N-8QGBV-H22JP-CT43Q-MDWWJ`
`PPWGW-8NW9C-J77Q9-8WHB9-QV64W` | +| Windows 10/11 Enterprise | `NPPR9-FWDCX-D2C8J-H872K-2YT43`
`96YNV-9X4RP-2YYKB-RMQH4-6Q72D`
`TN6CM-KCVXP-VVP8X-YVCF7-R9BDH`
`3PMKQ-YNVGT-HFJGG-2F4FQ-9D6T7` | +| Windows 10/11 Enterprise N | `DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4`
`WGGHN-J84D6-QYCPR-T7PJ7-X766F` | +| Windows 10/11 Enterprise S | `H76BG-QBNM7-73XY9-V6W2T-684BJ` | +| Windows 10/11 Enterprise S N | `X4R4B-NV6WD-PKTVK-F98BH-4C2J8` | | Windows 10 Enterprise 2015 LTSB | `WNMTR-4C88C-JK8YV-HQ7T2-76DF9` | | Windows 10 Enterprise 2015 LTSB N | `2F77B-TNFGY-69QQF-B8YKP-D69TJ`
`RW7WN-FMT44-KRGBK-G44WK-QV7YK` | | Windows 10 Enterprise 2016 LTSB | `DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJ` | | Windows 10 Enterprise 2016 LTSB N | `QFFDN-GRT3P-VKWWX-X7T3R-8B639` | -| Windows 10 Home
Windows 10 Core | `TX9XD-98N7V-6WMQ6-BX7FG-H8Q99`
`33QT6-RCNYF-DXB4F-DGP7B-7MHX9` | -| Windows 10 Home N
Windows 10 Core N | `3KHY7-WNT83-DGQKR-F7HPR-844BM`
`CP4KF-NG6TC-9K6QF-P6GTT-H8RBM` | -| Windows 10 Home Single Language
Windows 10 Core Single Language | `7HNRX-D7KGG-3K4RQ-4WPJ4-YTDFH`
`9HGRW-NH2CQ-XQHJD-YCRWB-6VJV7`
`4NX46-6DHCG-MR3PH-9FMCX-3RQ3G` | -| Windows 10 Home Country Specific
Windows 10 Core Country Specific | `PVMJN-6DFY6-9CCP6-7BKTT-D3WVR`
`JN9HR-MH7K4-DBPDD-TFTXF-Q9MMF` | +| Windows 10/11 Home
Windows 10/11 Core | `TX9XD-98N7V-6WMQ6-BX7FG-H8Q99`
`33QT6-RCNYF-DXB4F-DGP7B-7MHX9` | +| Windows 10/11 Home N
Windows 10/11 Core N | `3KHY7-WNT83-DGQKR-F7HPR-844BM`
`CP4KF-NG6TC-9K6QF-P6GTT-H8RBM` | +| Windows 10/11 Home Single Language
Windows 10 Core Single Language | `7HNRX-D7KGG-3K4RQ-4WPJ4-YTDFH`
`9HGRW-NH2CQ-XQHJD-YCRWB-6VJV7`
`4NX46-6DHCG-MR3PH-9FMCX-3RQ3G` | +| Windows 10/11 Home Country Specific
Windows 10 Core Country Specific | `PVMJN-6DFY6-9CCP6-7BKTT-D3WVR`
`JN9HR-MH7K4-DBPDD-TFTXF-Q9MMF` | ### Windows Server 2012 R2 From 5de292e12a9090a716001ddf2e0f9bad5941ca94 Mon Sep 17 00:00:00 2001 From: Matthew Beckett Date: Thu, 7 Oct 2021 20:04:49 +0100 Subject: [PATCH 022/154] Remove validation of LOGFILE extension --- py-kms/pykms_Misc.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/py-kms/pykms_Misc.py b/py-kms/pykms_Misc.py index 5769fc9..f948d44 100644 --- a/py-kms/pykms_Misc.py +++ b/py-kms/pykms_Misc.py @@ -227,7 +227,7 @@ def apply_formatter(levelnum, formats, handler, color = False): log_obj.setLevel(config['loglevel']) #------------------------------------------------------------------------------------------------------------------------------------------------------------ -def check_dir(path, where, log_obj = None, argument = '-F/--logfile', typefile = '.log'): +def check_dir(path, where, log_obj = None, argument = '-F/--logfile'): filename = os.path.basename(path) pathname = os.path.dirname(path) extension = os.path.splitext(filename)[1] @@ -243,9 +243,6 @@ def check_dir(path, where, log_obj = None, argument = '-F/--logfile', typefile = pathname = filename pretty_printer(log_obj = log_obj, where = where, to_exit = True, put_text = msg_dir %(argument, pathname)) - elif not extension.lower() == typefile: - pretty_printer(log_obj = log_obj, where = where, to_exit = True, - put_text = msg_fil %(argument, typefile, extension)) def check_logfile(optionlog, defaultlog, where): if not isinstance(optionlog, list): From 4a7376f17b0306c74b7180b16a08803dac1c522f Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Wed, 13 Oct 2021 12:54:22 +0200 Subject: [PATCH 023/154] Fix pytz and time localization --- docker/docker-py3-kms-minimal/Dockerfile | 2 +- docker/docker-py3-kms/Dockerfile | 2 +- docker/docker-py3-kms/start.sh | 0 docs/Getting Started.md | 2 +- py-kms/pykms_Base.py | 9 +++++++-- 5 files changed, 10 insertions(+), 5 deletions(-) mode change 100644 => 100755 docker/docker-py3-kms/start.sh diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 2fd9768..98eb5ce 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -26,7 +26,7 @@ RUN apk add --no-cache --update \ sqlite-libs \ py3-pip \ build-base python3-dev && \ - pip3 install peewee tzlocal && \ + pip3 install peewee tzlocal pytz && \ apk del git build-base python3-dev WORKDIR /home/py-kms diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index e98a808..bbe06c7 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -29,7 +29,7 @@ RUN apk add --no-cache --update \ git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ mv /tmp/sqlite_web/sqlite_web /home/ && \ rm -rf /tmp/sqlite_web && \ - pip3 install peewee tzlocal pysqlite3 && \ + pip3 install peewee tzlocal pytz pysqlite3 && \ chmod a+x /usr/bin/start.sh && \ apk del git build-base python3-dev diff --git a/docker/docker-py3-kms/start.sh b/docker/docker-py3-kms/start.sh old mode 100644 new mode 100755 diff --git a/docs/Getting Started.md b/docs/Getting Started.md index 122e6ae..ce1c633 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -15,7 +15,7 @@ If you wish to get _py-kms_ just up and running without installing any dependenc Docker also solves problems regarding the explicit IPv4 and IPv6 usage (it just supports both). The following command will download, "install" and start _py-kms_ and also keep it alive after any service disruption. ```bash -docker run -d --name py-kms --restart always -p 1688:1688 pykmsorg/py-kms +docker run -d --name py-kms --restart always -p 1688:1688 -v /etc/localtime:/etc/localtime:ro pykmsorg/py-kms ``` If you just want to use the image and don't want to build them yourself, you can always use the official image at the [Docker Hub](https://hub.docker.com/r/pykmsorg/py-kms) (`pykmsorg/py-kms`). To ensure that you are using always the latest version you should check something like [watchtower](https://github.com/containrrr/watchtower) out ! diff --git a/py-kms/pykms_Base.py b/py-kms/pykms_Base.py index 6397b4a..dd55f31 100644 --- a/py-kms/pykms_Base.py +++ b/py-kms/pykms_Base.py @@ -119,11 +119,11 @@ def serverLogic(self, kmsRequest): # Localize the request time, if module "tzlocal" is available. try: + from datetime import datetime from tzlocal import get_localzone from pytz.exceptions import UnknownTimeZoneError try: - tz = get_localzone() - local_dt = tz.localize(requestDatetime) + local_dt = datetime.fromisoformat(str(requestDatetime)).astimezone(get_localzone()) except UnknownTimeZoneError: pretty_printer(log_obj = loggersrv.warning, put_text = "{reverse}{yellow}{bold}Unknown time zone ! Request time not localized.{end}") @@ -132,6 +132,11 @@ def serverLogic(self, kmsRequest): pretty_printer(log_obj = loggersrv.warning, put_text = "{reverse}{yellow}{bold}Module 'tzlocal' not available ! Request time not localized.{end}") local_dt = requestDatetime + except Exception as e: + # Just in case something else goes wrong + loggersrv.warning('Okay, something went horribly wrong while localizing the request time (proceeding anyways): ' + str(e)) + local_dt = requestDatetime + pass # Activation threshold. # https://docs.microsoft.com/en-us/windows/deployment/volume-activation/activate-windows-10-clients-vamt From 3fe2b45f72208e7b15f055a7d375826f219ca67d Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Wed, 13 Oct 2021 12:55:16 +0200 Subject: [PATCH 024/154] Extended error message --- py-kms/pykms_Base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-kms/pykms_Base.py b/py-kms/pykms_Base.py index dd55f31..1f38ba9 100644 --- a/py-kms/pykms_Base.py +++ b/py-kms/pykms_Base.py @@ -130,7 +130,7 @@ def serverLogic(self, kmsRequest): local_dt = requestDatetime except ImportError: pretty_printer(log_obj = loggersrv.warning, - put_text = "{reverse}{yellow}{bold}Module 'tzlocal' not available ! Request time not localized.{end}") + put_text = "{reverse}{yellow}{bold}Module 'tzlocal' or 'pytz' not available ! Request time not localized.{end}") local_dt = requestDatetime except Exception as e: # Just in case something else goes wrong From 3806c032142f1f086e6da1715a8c67648771d38d Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Wed, 13 Oct 2021 21:59:46 +0200 Subject: [PATCH 025/154] Fix broken check_dir() call from 5de292e12a9090a716001ddf2e0f9bad5941ca94 --- py-kms/pykms_Server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-kms/pykms_Server.py b/py-kms/pykms_Server.py index 301661b..60c74a5 100755 --- a/py-kms/pykms_Server.py +++ b/py-kms/pykms_Server.py @@ -447,7 +447,7 @@ def server_check(): # Check sqlite. if srv_config['sqlite']: if isinstance(srv_config['sqlite'], str): - check_dir(srv_config['sqlite'], 'srv', log_obj = loggersrv.error, argument = '-s/--sqlite', typefile = '.db') + check_dir(srv_config['sqlite'], 'srv', log_obj = loggersrv.error, argument = '-s/--sqlite') elif srv_config['sqlite'] is True: srv_config['sqlite'] = srv_options['sql']['file'] From cb8a95e6d63f0f2559a4eaf775c25d36d3bf0ea7 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Thu, 14 Oct 2021 11:45:17 +0200 Subject: [PATCH 026/154] Fir for undefnied time zones --- docker/docker-py3-kms-minimal/Dockerfile | 6 +++++- docker/docker-py3-kms/Dockerfile | 10 +++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 98eb5ce..738c054 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -11,7 +11,7 @@ ENV ACTIVATION_INTERVAL 120 ENV RENEWAL_INTERVAL 10080 ENV HWID "RANDOM" ENV LOGLEVEL INFO -ENV LOGFILE /var/log/pykms_logserver.log +ENV LOGFILE /dev/stdout ENV LOGSIZE "" COPY ./py-kms /home/py-kms @@ -25,10 +25,14 @@ RUN apk add --no-cache --update \ python3-tkinter \ sqlite-libs \ py3-pip \ + tzdata \ build-base python3-dev && \ pip3 install peewee tzlocal pytz && \ apk del git build-base python3-dev +# Fix undefined timezone, in case the user did not mount the /etc/localtime +RUN cp /usr/share/zoneinfo/UTC /etc/localtime + WORKDIR /home/py-kms EXPOSE ${PORT}/tcp diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index bbe06c7..38a6a61 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -8,9 +8,9 @@ ENV CLIENT_COUNT 26 ENV ACTIVATION_INTERVAL 120 ENV RENEWAL_INTERVAL 10080 ENV SQLITE false -ENV HWID "364F463A8863D35F" -ENV LOGLEVEL ERROR -ENV LOGFILE /var/log/pykms_logserver.log +ENV HWID "RANDOM" +ENV LOGLEVEL INFO +ENV LOGFILE /dev/stdout ENV LOGSIZE "" COPY docker/docker-py3-kms/start.sh /usr/bin/start.sh @@ -25,6 +25,7 @@ RUN apk add --no-cache --update \ python3-tkinter \ sqlite-libs \ py3-pip \ + tzdata \ build-base python3-dev && \ git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ mv /tmp/sqlite_web/sqlite_web /home/ && \ @@ -33,6 +34,9 @@ RUN apk add --no-cache --update \ chmod a+x /usr/bin/start.sh && \ apk del git build-base python3-dev +# Fix undefined timezone, in case the user did not mount the /etc/localtime +RUN cp /usr/share/zoneinfo/UTC /etc/localtime + WORKDIR /home/py-kms EXPOSE ${PORT}/tcp From 0630b226111dda3ab9f7c738e5701b81d147346e Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Thu, 14 Oct 2021 13:13:15 +0200 Subject: [PATCH 027/154] Switch to whole new entrypoint system --- docker/docker-py3-kms-minimal/Dockerfile | 26 ++++++------ docker/docker-py3-kms/Dockerfile | 35 +++++++++------- docker/docker-py3-kms/build-py3-kms.sh | 1 - docker/docker-py3-kms/run-py3-kms.sh | 16 ------- docker/docker-py3-kms/start.sh | 50 ---------------------- docker/entrypoint.py | 53 ++++++++++++++++++++++++ docs/Getting Started.md | 9 ++-- 7 files changed, 92 insertions(+), 98 deletions(-) delete mode 100755 docker/docker-py3-kms/build-py3-kms.sh delete mode 100755 docker/docker-py3-kms/run-py3-kms.sh delete mode 100755 docker/docker-py3-kms/start.sh create mode 100755 docker/entrypoint.py diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 738c054..2c9107d 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -2,17 +2,17 @@ FROM alpine:3.12 -ENV IP 0.0.0.0 -ENV PORT 1688 -ENV EPID "" -ENV LCID 1033 -ENV CLIENT_COUNT 26 -ENV ACTIVATION_INTERVAL 120 -ENV RENEWAL_INTERVAL 10080 -ENV HWID "RANDOM" -ENV LOGLEVEL INFO -ENV LOGFILE /dev/stdout -ENV LOGSIZE "" +ENV IP 0.0.0.0 +ENV PORT 1688 +ENV EPID "" +ENV LCID 1033 +ENV CLIENT_COUNT 26 +ENV ACTIVATION_INTERVAL 120 +ENV RENEWAL_INTERVAL 10080 +ENV HWID RANDOM +ENV LOGLEVEL INFO +ENV LOGFILE /dev/stdout +ENV LOGSIZE "" COPY ./py-kms /home/py-kms @@ -37,4 +37,6 @@ WORKDIR /home/py-kms EXPOSE ${PORT}/tcp -ENTRYPOINT /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} +COPY docker/entrypoint.py /usr/bin/entrypoint.py +RUN chmod a+x /usr/bin/entrypoint.py +ENTRYPOINT ['/usr/bin/python3', '/usr/bin/entrypoint.py'] diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 38a6a61..e5fd87c 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -1,19 +1,19 @@ FROM alpine:3.12 -ENV IP 0.0.0.0 -ENV PORT 1688 -ENV EPID "" -ENV LCID 1033 -ENV CLIENT_COUNT 26 -ENV ACTIVATION_INTERVAL 120 -ENV RENEWAL_INTERVAL 10080 -ENV SQLITE false -ENV HWID "RANDOM" -ENV LOGLEVEL INFO -ENV LOGFILE /dev/stdout -ENV LOGSIZE "" +ENV IP 0.0.0.0 +ENV PORT 1688 +ENV EPID "" +ENV LCID 1033 +ENV CLIENT_COUNT 26 +ENV ACTIVATION_INTERVAL 120 +ENV RENEWAL_INTERVAL 10080 +ENV SQLITE true +ENV SQLITE_PORT 8080 +ENV HWID RANDOM +ENV LOGLEVEL INFO +ENV LOGFILE /dev/stdout +ENV LOGSIZE "" -COPY docker/docker-py3-kms/start.sh /usr/bin/start.sh COPY ./py-kms /home/py-kms RUN apk add --no-cache --update \ @@ -28,10 +28,12 @@ RUN apk add --no-cache --update \ tzdata \ build-base python3-dev && \ git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ + cd /tmp/sqlite_web && \ + git checkout 2e7c85da3d37f80074ed3ae39b5851069b4f301c && \ + cd / && \ mv /tmp/sqlite_web/sqlite_web /home/ && \ rm -rf /tmp/sqlite_web && \ pip3 install peewee tzlocal pytz pysqlite3 && \ - chmod a+x /usr/bin/start.sh && \ apk del git build-base python3-dev # Fix undefined timezone, in case the user did not mount the /etc/localtime @@ -39,6 +41,9 @@ RUN cp /usr/share/zoneinfo/UTC /etc/localtime WORKDIR /home/py-kms +EXPOSE ${SQLITE_PORT}/tcp EXPOSE ${PORT}/tcp -ENTRYPOINT ["/usr/bin/start.sh"] +COPY docker/entrypoint.py /usr/bin/entrypoint.py +RUN chmod a+x /usr/bin/entrypoint.py +ENTRYPOINT ['/usr/bin/python3', '/usr/bin/entrypoint.py'] diff --git a/docker/docker-py3-kms/build-py3-kms.sh b/docker/docker-py3-kms/build-py3-kms.sh deleted file mode 100755 index 71e6145..0000000 --- a/docker/docker-py3-kms/build-py3-kms.sh +++ /dev/null @@ -1 +0,0 @@ -docker build -t pykms/pykms:py3-kms ../../ --file ./Dockerfile diff --git a/docker/docker-py3-kms/run-py3-kms.sh b/docker/docker-py3-kms/run-py3-kms.sh deleted file mode 100755 index b8d5f4c..0000000 --- a/docker/docker-py3-kms/run-py3-kms.sh +++ /dev/null @@ -1,16 +0,0 @@ -docker stop py3-kms -docker rm py3-kms -docker run -d --name py3-kms \ - -t \ - -p 8080:8080 \ - -p 1688:1688 \ - -e IP=0.0.0.0 \ - -e PORT=1688 \ - -e SQLITE=true \ - -e HWID=RANDOM \ - -e LOGLEVEL=INFO \ - -e LOGFILE=/var/log/pykms_logserver.log \ - -e LOGSIZE=2 \ - -v /etc/localtime:/etc/localtime:ro \ - -v /var/log:/var/log:rw \ - --restart unless-stopped pykms/pykms:py3-kms diff --git a/docker/docker-py3-kms/start.sh b/docker/docker-py3-kms/start.sh deleted file mode 100755 index f6b1e01..0000000 --- a/docker/docker-py3-kms/start.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -cd /home/py-kms -if [ "$SQLITE" == false ]; -then - if [ "$EPID" == "" ]; - then - if [ "$LOGSIZE" == "" ]; - then - /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} - else - /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} -S ${LOGSIZE} - fi - else - if [ "$LOGSIZE" == "" ]; - then - /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -e ${EPID} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} - else - /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -e ${EPID} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} -S ${LOGSIZE} - fi - fi -else - if [ "$EPID" == "" ]; - then - if [ "$LOGSIZE" == "" ]; - then - /bin/bash -c "/usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -s ${PWD}/pykms_database.db -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} &" - sleep 5 - /usr/bin/python3 pykms_Client.py ${IP} ${PORT} -m Windows10 & - /usr/bin/python3 /home/sqlite_web/sqlite_web.py -H ${IP} -x ${PWD}/pykms_database.db --read-only - else - /bin/bash -c "/usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -s ${PWD}/pykms_database.db -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} -S ${LOGSIZE} &" - sleep 5 - /usr/bin/python3 pykms_Client.py ${IP} ${PORT} -m Windows10 & - /usr/bin/python3 /home/sqlite_web/sqlite_web.py -H ${IP} -x ${PWD}/pykms_database.db --read-only - fi - else - if [ "$LOGSIZE" == "" ]; - then - /bin/bash -c "/usr/bin/python3 pykms_Server.py ${IP} ${PORT} -e ${EPID} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -s ${PWD}/pykms_database.db -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} &" - sleep 5 - /usr/bin/python3 pykms_Client.py ${IP} ${PORT} -m Windows10 & - /usr/bin/python3 /home/sqlite_web/sqlite_web.py -H ${IP} -x ${PWD}/pykms_database.db --read-only - else - /bin/sh -c "/usr/bin/python3 pykms_Server.py ${IP} ${PORT} -e ${EPID} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -s ${PWD}/pykms_database.db -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} -S ${LOGSIZE} &" - sleep 5 - /usr/bin/python3 pykms_Client.py ${IP} ${PORT} -m Windows10 & - /usr/bin/python3 /home/sqlite_web/sqlite_web.py -H ${IP} -x ${PWD}/pykms_database.db --read-only - fi - fi -fi diff --git a/docker/entrypoint.py b/docker/entrypoint.py new file mode 100755 index 0000000..9fe4fe3 --- /dev/null +++ b/docker/entrypoint.py @@ -0,0 +1,53 @@ +#!/usr/bin/python3 + +# This replaces the old start.sh and ensures all arguments are bound correctly from the environment variables... + +import os +import time +import subprocess + +argumentVariableMapping = { + '-l': 'LCID', + '-c': 'CLIENT_COUNT', + '-a': 'ACTIVATION_INTERVAL', + '-r': 'RENEWAL_INTERVAL', + '-w': 'HWID', + '-V': 'LOGLEVEL', + '-F': 'LOGFILE', + '-S': 'LOGSIZE', + '-e': 'EPID' +} + +# Build the command to execute +command = ['/usr/bin/python3', 'pykms_Server.py', os.environ.get('IP'), os.environ.get('PORT')] +for (arg, env) in argumentVariableMapping.items(): + if env in os.environ and os.environ.get(env) != '': + command.append(arg) + command.append(os.environ.get(env)) + +enableSQLITE = os.environ.get('SQLITE').lower() == 'true' +os.makedirs('db', exist_ok=True) +dbPath = os.path.join(os.environ.get('PWD'), 'db', 'pykms_database.db') +if enableSQLITE: + command.append('-s') + command.append(dbPath) + +pykmsProcess = subprocess.Popen(command) + +# In case SQLITE is defined: Start the web interface +if enableSQLITE: + time.sleep(5) # The server may take a while to start + if not os.path.isfile(dbPath): + # Start a dummy activation to ensure the database file is created + subprocess.run(['/usr/bin/python3', 'pykms_Client.py', os.environ.get('IP'), os.environ.get('PORT'), '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218']) + sqliteProcess = subprocess.Popen(['/usr/bin/python3', '/home/sqlite_web/sqlite_web.py', '-H', os.environ.get('IP'), '--read-only', '-x', dbPath, '-p', os.environ.get('SQLITE_PORT')]) + +try: + pykmsProcess.wait() +except: + # In case of any error - just shut down + pass + +if enableSQLITE: + sqliteProcess.terminate() + pykmsProcess.terminate() diff --git a/docs/Getting Started.md b/docs/Getting Started.md index ce1c633..45e9b29 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -37,25 +37,26 @@ _Please note that any architecture other than the classic `amd64` is slightly bi #### Docker Compose You can use `docker-compose` instead of building and running the Dockerfile, so you do not need to respecify your settings again and again. The following Docker Compose file will deploy the `latest` image with the log into your local directory. +Make sure to take a look into the `entrypoint.py` script to see all supported variable mappings! ```yaml version: '3' services: kms: - image: pykmsorg/py-kms:latest + image: pykmsorg/py-kms:python3 ports: - 1688:1688 + - 8080:8080 environment: - IP=0.0.0.0 - SQLITE=true - HWID=RANDOM - LOGLEVEL=INFO - - LOGSIZE=2 - - LOGFILE=/var/log/pykms_logserver.log + - LOGFILE=/dev/stdout restart: always volumes: + - ./db:/home/py-kms/db - /etc/localtime:/etc/localtime:ro - - ./logs:/var/log:rw ``` #### Parameters From fba768bd512397f09be69aa408bfc6efb3a72954 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Thu, 14 Oct 2021 13:17:51 +0200 Subject: [PATCH 028/154] Extended docs for SQLITE stuff --- docs/Getting Started.md | 9 +-------- docs/Usage.md | 4 ++++ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/docs/Getting Started.md b/docs/Getting Started.md index 45e9b29..96553f2 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -60,20 +60,13 @@ services: ``` #### Parameters -Below is a fully expanded run command, detailing all the different supported environment variables to set. For further reference see the [start parameters](Usage.html#docker-environment) for the docker environment. +Below is a little bit more extended run command, detailing all the different supported environment variables to set. For further reference see the [start parameters](Usage.html#docker-environment) for the docker environment. ```bash docker run -it -d --name py3-kms \ -p 8080:8080 \ -p 1688:1688 \ - -e IP=0.0.0.0 \ - -e PORT=1688 \ -e SQLITE=true \ - -e HWID=RANDOM \ - -e LOGLEVEL=INFO \ - -e LOGSIZE=2 \ - -e LOGFILE=/var/log/pykms_logserver.log \ -v /etc/localtime:/etc/localtime:ro \ - -v ./logs:/var/log:rw \ --restart unless-stopped pykmsorg/py-kms:[TAG] ``` You can omit the `-e SQLITE=...` and `-p 8080:8080` option if you plan to use the `minimal` or `latest` image, which does not include the respective module support. diff --git a/docs/Usage.md b/docs/Usage.md index 7e27ba9..a0ab9d4 100644 --- a/docs/Usage.md +++ b/docs/Usage.md @@ -230,6 +230,10 @@ ENV RENEWAL_INTERVAL 10080 # Use this flag to store request information from unique clients in an SQLite database. ENV SQLITE false +# TCP-port +# The network port to listen with the web interface on. The default is "8080". +ENV SQLITE_PORT 8080 + # hwid # Use this flag to specify a HWID. # The HWID must be an 16-character string of hex characters. From b2b9cb137e485c24fd2755cbf9613ddb2d20c341 Mon Sep 17 00:00:00 2001 From: TheSpad Date: Thu, 14 Oct 2021 18:37:45 +0100 Subject: [PATCH 029/154] Fix entrypoint --- docker/entrypoint.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 9fe4fe3..c394bf5 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -27,7 +27,8 @@ enableSQLITE = os.environ.get('SQLITE').lower() == 'true' os.makedirs('db', exist_ok=True) -dbPath = os.path.join(os.environ.get('PWD'), 'db', 'pykms_database.db') +dbPath = os.path.join('/home/py-kms', 'db', 'pykms_database.db') +print(dbPath) if enableSQLITE: command.append('-s') command.append(dbPath) From 8c1d23fe3809084c12cde71564b04a5de4bfcb8c Mon Sep 17 00:00:00 2001 From: TheSpad Date: Thu, 14 Oct 2021 18:38:19 +0100 Subject: [PATCH 030/154] Fix entrypoint --- docker/docker-py3-kms-minimal/Dockerfile | 2 +- docker/docker-py3-kms/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 2c9107d..25a28af 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -39,4 +39,4 @@ EXPOSE ${PORT}/tcp COPY docker/entrypoint.py /usr/bin/entrypoint.py RUN chmod a+x /usr/bin/entrypoint.py -ENTRYPOINT ['/usr/bin/python3', '/usr/bin/entrypoint.py'] +ENTRYPOINT ["/usr/bin/python3", "/usr/bin/entrypoint.py"] diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index e5fd87c..c2ee203 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -46,4 +46,4 @@ EXPOSE ${PORT}/tcp COPY docker/entrypoint.py /usr/bin/entrypoint.py RUN chmod a+x /usr/bin/entrypoint.py -ENTRYPOINT ['/usr/bin/python3', '/usr/bin/entrypoint.py'] +ENTRYPOINT ["/usr/bin/python3", "/usr/bin/entrypoint.py"] From 74850b8b63aba3f831d6170d460657f597300690 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 15 Oct 2021 01:31:34 +0200 Subject: [PATCH 031/154] Corrected path back to current work directory and formatted log message --- docker/entrypoint.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index c394bf5..becba95 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -27,9 +27,9 @@ enableSQLITE = os.environ.get('SQLITE').lower() == 'true' os.makedirs('db', exist_ok=True) -dbPath = os.path.join('/home/py-kms', 'db', 'pykms_database.db') -print(dbPath) +dbPath = os.path.join('db', 'pykms_database.db') if enableSQLITE: + print('Storing database file to ' + dbPath) command.append('-s') command.append(dbPath) From d0566104748a3e0ee162ffca758865aff9c93384 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sun, 17 Oct 2021 11:51:27 +0200 Subject: [PATCH 032/154] Integrated Office 2021 GLVK keys & database --- docs/Keys.md | 18 ++++++++++++++++++ py-kms/KmsDataBase.xml | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/docs/Keys.md b/docs/Keys.md index 5a4de0b..a4342ef 100644 --- a/docs/Keys.md +++ b/docs/Keys.md @@ -282,6 +282,24 @@ sometimes even reject it by itself (often due too many uses - in that case try t ## Office *** +### Office 2021 + +| Product | GVLK | +| --- | --- | +| Office Access LTSC 2021 | `WM8YG-YNGDD-4JHDC-PG3F4-FC4T4` | +| Office Excel LTSC 2021 | `NWG3X-87C9K-TC7YY-BC2G7-G6RVC` | +| Office Outlook LTSC 2021 | `C9FM6-3N72F-HFJXB-TM3V9-T86R9` | +| Office Powerpoint LTSC 2021 | `TY7XF-NFRBR-KJ44C-G83KF-GX27K` | +| Office LTSC Professional Plus 2021 | `FXYTK-NJJ8C-GB6DW-3DYQT-6F7TH` | +| Office Project Pro 2021 | `FTNWT-C6WBT-8HMGF-K9PRX-QV9H8` | +| Office Project Standard 2021 | `J2JDC-NJCYY-9RGQ4-YXWMH-T3D4T` | +| Office Publisher LTSC 2021 | `2MW9D-N4BXM-9VBPG-Q7W6M-KFBGQ` | +| Office Skype for Business LTSC 2021 | `HWCXN-K3WBT-WJBKY-R8BD9-XK29P` | +| Office LTSC Standard 2021 | `KDX7X-BNVR8-TXXGX-4Q7Y8-78VT3` | +| Office Visio LTSC Pro 2021 | `KNH8D-FGHT4-T8RK3-CTDYJ-K2HT4` | +| Office Visio LTSC Standard 2021 | `MJVNY-BYWPY-CWV6J-2RKRT-4M8QG` | +| Office Word LTSC 2021 | `TN8H9-M34D3-Y64V9-TR72V-X79KV` | + ### Office 2019 | Product | GVLK | diff --git a/py-kms/KmsDataBase.xml b/py-kms/KmsDataBase.xml index cc454ca..0d590a0 100644 --- a/py-kms/KmsDataBase.xml +++ b/py-kms/KmsDataBase.xml @@ -530,6 +530,10 @@ + + + + @@ -984,6 +988,21 @@ + + + + + + + + + + + + + + + From b00e743eaf4e46075c615950aeb29379b1970411 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sun, 17 Oct 2021 11:56:28 +0200 Subject: [PATCH 033/154] Fixed broken SQLite entrypoint (https://github.com/Py-KMS-Organization/py-kms/issues/14) --- docker/entrypoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index becba95..ea30ede 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -25,7 +25,7 @@ command.append(arg) command.append(os.environ.get(env)) -enableSQLITE = os.environ.get('SQLITE').lower() == 'true' +enableSQLITE = os.environ.get('SQLITE') != None and os.environ.get('SQLITE').lower() == 'true' os.makedirs('db', exist_ok=True) dbPath = os.path.join('db', 'pykms_database.db') if enableSQLITE: From 4ee742d671ae853f600b90425c97b2080ff17b80 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Thu, 21 Oct 2021 13:14:44 +0200 Subject: [PATCH 034/154] Fix for missing environment variables --- docker/entrypoint.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index ea30ede..399d091 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -19,17 +19,19 @@ } # Build the command to execute -command = ['/usr/bin/python3', 'pykms_Server.py', os.environ.get('IP'), os.environ.get('PORT')] +listenIP = os.environ.get('IP', '0.0.0.0') +listenPort = os.environ.get('PORT', '1688') +command = ['/usr/bin/python3', 'pykms_Server.py', listenIP, listenPort] for (arg, env) in argumentVariableMapping.items(): if env in os.environ and os.environ.get(env) != '': command.append(arg) command.append(os.environ.get(env)) -enableSQLITE = os.environ.get('SQLITE') != None and os.environ.get('SQLITE').lower() == 'true' -os.makedirs('db', exist_ok=True) -dbPath = os.path.join('db', 'pykms_database.db') +enableSQLITE = os.environ.get('SQLITE', 'false').lower() == 'true' if enableSQLITE: print('Storing database file to ' + dbPath) + dbPath = os.path.join('db', 'pykms_database.db') + os.makedirs('db', exist_ok=True) command.append('-s') command.append(dbPath) @@ -40,8 +42,8 @@ time.sleep(5) # The server may take a while to start if not os.path.isfile(dbPath): # Start a dummy activation to ensure the database file is created - subprocess.run(['/usr/bin/python3', 'pykms_Client.py', os.environ.get('IP'), os.environ.get('PORT'), '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218']) - sqliteProcess = subprocess.Popen(['/usr/bin/python3', '/home/sqlite_web/sqlite_web.py', '-H', os.environ.get('IP'), '--read-only', '-x', dbPath, '-p', os.environ.get('SQLITE_PORT')]) + subprocess.run(['/usr/bin/python3', 'pykms_Client.py', listenIP, listenPort, '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218']) + sqliteProcess = subprocess.Popen(['/usr/bin/python3', '/home/sqlite_web/sqlite_web.py', '-H', listenIP, '--read-only', '-x', dbPath, '-p', os.environ.get('SQLITE_PORT', 8080)]) try: pykmsProcess.wait() From eb42224bf1ec25c9b9905bcd4ce4ab23d3130a12 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Thu, 21 Oct 2021 13:22:03 +0200 Subject: [PATCH 035/154] Block SQLITE in case sqlite-web files are missing --- docker/entrypoint.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 399d091..5d2f982 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -17,6 +17,7 @@ '-S': 'LOGSIZE', '-e': 'EPID' } +sqliteWebPath = '/home/sqlite_web/sqlite_web.py' # Build the command to execute listenIP = os.environ.get('IP', '0.0.0.0') @@ -27,7 +28,7 @@ command.append(arg) command.append(os.environ.get(env)) -enableSQLITE = os.environ.get('SQLITE', 'false').lower() == 'true' +enableSQLITE = os.path.isfile(sqliteWebPath) and os.environ.get('SQLITE', 'false').lower() == 'true' if enableSQLITE: print('Storing database file to ' + dbPath) dbPath = os.path.join('db', 'pykms_database.db') @@ -43,7 +44,7 @@ if not os.path.isfile(dbPath): # Start a dummy activation to ensure the database file is created subprocess.run(['/usr/bin/python3', 'pykms_Client.py', listenIP, listenPort, '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218']) - sqliteProcess = subprocess.Popen(['/usr/bin/python3', '/home/sqlite_web/sqlite_web.py', '-H', listenIP, '--read-only', '-x', dbPath, '-p', os.environ.get('SQLITE_PORT', 8080)]) + sqliteProcess = subprocess.Popen(['/usr/bin/python3', sqliteWebPath, '-H', listenIP, '--read-only', '-x', dbPath, '-p', os.environ.get('SQLITE_PORT', 8080)]) try: pykmsProcess.wait() From 5df548760479f5c20e5c64fef8830986bf6887f1 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Thu, 21 Oct 2021 13:26:34 +0200 Subject: [PATCH 036/154] Switch from pulls-limited Docker Hub to Github Container Registry --- README.md | 2 +- docs/Getting Started.md | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 484d8f9..76e90b6 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ The wiki has been completly reworked and is now available on [readthedocs.com](h ## Quick start - To start the server, execute `python3 pykms_Server.py [IPADDRESS] [PORT]`, the default _IPADDRESS_ is `0.0.0.0` ( all interfaces ) and the default _PORT_ is `1688`. Note that both the address and port are optional. It's allowed to use IPv4 and IPv6 addresses. If you have a IPv6-capable dual-stack OS, a dual-stack socket is created when using a IPv6 address. -- To start the server automatically using Docker, execute `docker run -d --name py-kms --restart always -p 1688:1688 pykmsorg/py-kms`. +- To start the server automatically using Docker, execute `docker run -d --name py-kms --restart always -p 1688:1688 ghcr.io/py-kms-organization/py-kms`. - To show the help pages type: `python3 pykms_Server.py -h` and `python3 pykms_Client.py -h`. - For launching _py-kms_ GUI make the file `pykms_Server.py` executable with `chmod +x /path/to/folder/py-kms/pykms_Server.py`, then simply run `pykms_Server.py` by double-clicking. diff --git a/docs/Getting Started.md b/docs/Getting Started.md index 96553f2..7aa157c 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -15,10 +15,10 @@ If you wish to get _py-kms_ just up and running without installing any dependenc Docker also solves problems regarding the explicit IPv4 and IPv6 usage (it just supports both). The following command will download, "install" and start _py-kms_ and also keep it alive after any service disruption. ```bash -docker run -d --name py-kms --restart always -p 1688:1688 -v /etc/localtime:/etc/localtime:ro pykmsorg/py-kms +docker run -d --name py-kms --restart always -p 1688:1688 -v /etc/localtime:/etc/localtime:ro ghcr.io/py-kms-organization/py-kms ``` -If you just want to use the image and don't want to build them yourself, you can always use the official image at the [Docker Hub](https://hub.docker.com/r/pykmsorg/py-kms) (`pykmsorg/py-kms`). To ensure that you are using always the -latest version you should check something like [watchtower](https://github.com/containrrr/watchtower) out ! +If you just want to use the image and don't want to build them yourself, you can always use the official image at the [Docker Hub](https://hub.docker.com/r/pykmsorg/py-kms) (`pykmsorg/py-kms`) or [GitHub Container Registry](https://github.com/Py-KMS-Organization/py-kms/pkgs/container/py-kms) (`ghcr.io/py-kms-organization/py-kms`). To ensure that you are using always the +latest version you should check something like [watchtower](https://github.com/containrrr/watchtower) out! #### Tags There are currently three tags of the image available (select one just by appending `:` to the image from above): @@ -43,7 +43,7 @@ version: '3' services: kms: - image: pykmsorg/py-kms:python3 + image: ghcr.io/py-kms-organization/py-kms:python3 ports: - 1688:1688 - 8080:8080 @@ -67,7 +67,7 @@ docker run -it -d --name py3-kms \ -p 1688:1688 \ -e SQLITE=true \ -v /etc/localtime:/etc/localtime:ro \ - --restart unless-stopped pykmsorg/py-kms:[TAG] + --restart unless-stopped ghcr.io/py-kms-organization/py-kms:[TAG] ``` You can omit the `-e SQLITE=...` and `-p 8080:8080` option if you plan to use the `minimal` or `latest` image, which does not include the respective module support. From 677916a3ec9964b119b6478f1a45e484bc603433 Mon Sep 17 00:00:00 2001 From: lepoarro <68047844+lepoarro@users.noreply.github.com> Date: Fri, 22 Oct 2021 14:59:53 +0300 Subject: [PATCH 037/154] Update entrypoint.py --- docker/entrypoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 5d2f982..bd0805e 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -30,8 +30,8 @@ enableSQLITE = os.path.isfile(sqliteWebPath) and os.environ.get('SQLITE', 'false').lower() == 'true' if enableSQLITE: - print('Storing database file to ' + dbPath) dbPath = os.path.join('db', 'pykms_database.db') + print('Storing database file to ' + dbPath) os.makedirs('db', exist_ok=True) command.append('-s') command.append(dbPath) From d25d73235e208267632bb964eea22f7c0518120a Mon Sep 17 00:00:00 2001 From: Matthew Beckett Date: Fri, 22 Oct 2021 13:13:09 +0100 Subject: [PATCH 038/154] Add installation instructions to helm chart Readme --- charts/py-kms/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/charts/py-kms/README.md b/charts/py-kms/README.md index 553090f..00fd65d 100644 --- a/charts/py-kms/README.md +++ b/charts/py-kms/README.md @@ -4,6 +4,20 @@ A Helm chart for Kubernetes +## Deployment + +Below is a basic overview of the steps required to deploy the Helm chart to an existing Kubernetes cluster which is accessible via Kubectl + +### Create py-kms Namespace (recommended) + +`kubectl create ns py-kms` + +### Deploy chart with default values.yaml + +`helm install -n py-kms -f myvalues.yaml charts/py-kms` + +For more information please refer to the Helm Install command documentation located at: https://helm.sh/docs/helm/helm_install/ + ## Values | Key | Type | Default | Description | From 73a80ba385ac690d1f17bf94b27ec5771bf58abd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Oct 2021 18:10:52 +0000 Subject: [PATCH 039/154] Bump urllib3 from 1.25.9 to 1.26.5 in /docs Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.25.9 to 1.26.5. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.25.9...1.26.5) --- updated-dependencies: - dependency-name: urllib3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index ba6fda4..5176e19 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -40,5 +40,5 @@ sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==1.0.3 sphinxcontrib-serializinghtml==1.1.4 toml==0.10.1 -urllib3==1.25.9 +urllib3==1.26.5 webencodings==0.5.1 From 6dcd059fc511f26dee1202a056d8111850d4ec99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Oct 2021 18:10:53 +0000 Subject: [PATCH 040/154] Bump babel from 2.8.0 to 2.9.1 in /docs Bumps [babel](https://github.com/python-babel/babel) from 2.8.0 to 2.9.1. - [Release notes](https://github.com/python-babel/babel/releases) - [Changelog](https://github.com/python-babel/babel/blob/master/CHANGES) - [Commits](https://github.com/python-babel/babel/compare/v2.8.0...v2.9.1) --- updated-dependencies: - dependency-name: babel dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index ba6fda4..f8a7c4d 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,6 +1,6 @@ alabaster==0.7.12 appdirs==1.4.4 -Babel==2.8.0 +Babel==2.9.1 CacheControl==0.12.6 certifi==2020.4.5.1 chardet==3.0.4 From a981e4af78892f1602306d14e3494c8a10a6eba6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Oct 2021 18:10:54 +0000 Subject: [PATCH 041/154] Bump pygments from 2.6.1 to 2.7.4 in /docs Bumps [pygments](https://github.com/pygments/pygments) from 2.6.1 to 2.7.4. - [Release notes](https://github.com/pygments/pygments/releases) - [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES) - [Commits](https://github.com/pygments/pygments/compare/2.6.1...2.7.4) --- updated-dependencies: - dependency-name: pygments dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index ba6fda4..d53ff13 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -22,7 +22,7 @@ ordered-set==4.0.1 packaging==20.4 pep517==0.8.2 progress==1.5 -Pygments==2.6.1 +Pygments==2.7.4 pyparsing==2.4.7 pytoml==0.1.21 pytz==2020.1 From 94bcba39f40f9e5687869c707dd5b8f12a292839 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Oct 2021 18:10:55 +0000 Subject: [PATCH 042/154] Bump jinja2 from 2.11.2 to 2.11.3 in /docs Bumps [jinja2](https://github.com/pallets/jinja) from 2.11.2 to 2.11.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/2.11.2...2.11.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index ba6fda4..d2ec97c 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -13,7 +13,7 @@ docutils==0.16 html5lib==1.0.1 idna==2.9 imagesize==1.2.0 -Jinja2==2.11.2 +Jinja2==2.11.3 lockfile==0.12.2 Markdown==3.2.2 MarkupSafe==1.1.1 From bd2871cadfdfdbad22735e64c4dc52b7bd857ead Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Fri, 22 Oct 2021 20:30:33 +0200 Subject: [PATCH 043/154] Minimal requirements --- docs/requirements.txt | 47 +++---------------------------------------- 1 file changed, 3 insertions(+), 44 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 31fffac..0ee5b6b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,44 +1,3 @@ -alabaster==0.7.12 -appdirs==1.4.4 -Babel==2.9.1 -CacheControl==0.12.6 -certifi==2020.4.5.1 -chardet==3.0.4 -colorama==0.4.3 -commonmark==0.9.1 -contextlib2==0.6.0 -distlib==0.3.0 -distro==1.5.0 -docutils==0.16 -html5lib==1.0.1 -idna==2.9 -imagesize==1.2.0 -Jinja2==2.11.3 -lockfile==0.12.2 -Markdown==3.2.2 -MarkupSafe==1.1.1 -msgpack==1.0.0 -ordered-set==4.0.1 -packaging==20.4 -pep517==0.8.2 -progress==1.5 -Pygments==2.7.4 -pyparsing==2.4.7 -pytoml==0.1.21 -pytz==2020.1 -recommonmark==0.6.0 -requests==2.23.0 -retrying==1.3.3 -six==1.15.0 -snowballstemmer==2.0.0 -Sphinx==3.1.2 -sphinx-markdown-tables==0.0.15 -sphinxcontrib-applehelp==1.0.2 -sphinxcontrib-devhelp==1.0.2 -sphinxcontrib-htmlhelp==1.0.3 -sphinxcontrib-jsmath==1.0.1 -sphinxcontrib-qthelp==1.0.3 -sphinxcontrib-serializinghtml==1.1.4 -toml==0.10.1 -urllib3==1.26.5 -webencodings==0.5.1 +sphinx==3.4.3 +sphinx_rtd_theme==0.5.1 +readthedocs-sphinx-search==0.1.0 From fa74f8a36c840ebc96f4019ab97b077175c66fd5 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Fri, 22 Oct 2021 20:33:32 +0200 Subject: [PATCH 044/154] Readded missing module --- docs/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index 0ee5b6b..a42efae 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,4 @@ sphinx==3.4.3 sphinx_rtd_theme==0.5.1 readthedocs-sphinx-search==0.1.0 +sphinx_markdown_tables==0.0.15 From 0c0e345d8b3980fd7ee28cb94b7858bac5a81d66 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sat, 23 Oct 2021 12:16:50 +0200 Subject: [PATCH 045/154] Added Office 2021 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 484d8f9..21a834e 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ This version of _py-kms_ is for itself a fork of the original implementation by - Microsoft Office 2013 ( Volume License ) - Microsoft Office 2016 ( Volume License ) - Microsoft Office 2019 ( Volume License ) + - Microsoft Office 2021 ( Volume License ) - It's written in Python (tested with Python 3.6.9). - Supports execution by `Docker`, `systemd`, `Upstart` and many more... - Includes a GUI for simple managing. From e620e9236afcb5720f6f6b47696d07cfa3c94616 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Sun, 24 Oct 2021 02:27:18 +0200 Subject: [PATCH 046/154] For #23 #25 --- py-kms/KmsDataBase.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/py-kms/KmsDataBase.xml b/py-kms/KmsDataBase.xml index 0d590a0..9b03291 100644 --- a/py-kms/KmsDataBase.xml +++ b/py-kms/KmsDataBase.xml @@ -530,9 +530,9 @@ - - - + + + From f9e7df6af9b79a91afa48201a6cbee56eef5254f Mon Sep 17 00:00:00 2001 From: edgd1er Date: Fri, 15 Oct 2021 01:47:18 +0200 Subject: [PATCH 047/154] lint dockerfile, set TZ and UID/GID, have client log. --- docker/docker-py3-kms-minimal/Dockerfile | 15 ++-- docker/docker-py3-kms/Dockerfile | 68 +++++++++++------- docker/entrypoint.py | 45 +++++++++--- docker/start.py | 90 ++++++++++++++++++++++++ 4 files changed, 172 insertions(+), 46 deletions(-) create mode 100644 docker/start.py diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 25a28af..ecb2668 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -1,6 +1,5 @@ # This is a minimized version from docker/docker-py3-kms/Dockerfile without SQLite support to further reduce image size - -FROM alpine:3.12 +FROM alpine:3.14 ENV IP 0.0.0.0 ENV PORT 1688 @@ -11,7 +10,7 @@ ENV ACTIVATION_INTERVAL 120 ENV RENEWAL_INTERVAL 10080 ENV HWID RANDOM ENV LOGLEVEL INFO -ENV LOGFILE /dev/stdout +ENV LOGFILE STDOUT ENV LOGSIZE "" COPY ./py-kms /home/py-kms @@ -27,11 +26,10 @@ RUN apk add --no-cache --update \ py3-pip \ tzdata \ build-base python3-dev && \ - pip3 install peewee tzlocal pytz && \ - apk del git build-base python3-dev - -# Fix undefined timezone, in case the user did not mount the /etc/localtime -RUN cp /usr/share/zoneinfo/UTC /etc/localtime + pip3 install --no-cache peewee tzlocal pytz wheel && \ + apk del git build-base python3-dev && \ + # Fix undefined timezone, in case the user did not mount the /etc/localtime + ln -sf /usr/share/zoneinfo/UTC /etc/localtime WORKDIR /home/py-kms @@ -40,3 +38,4 @@ EXPOSE ${PORT}/tcp COPY docker/entrypoint.py /usr/bin/entrypoint.py RUN chmod a+x /usr/bin/entrypoint.py ENTRYPOINT ["/usr/bin/python3", "/usr/bin/entrypoint.py"] +#CMD["/usr/bin/start.py"] diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index c2ee203..5bfb7d5 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -1,4 +1,5 @@ -FROM alpine:3.12 +# Switch to the target image +FROM alpine:3.14 ENV IP 0.0.0.0 ENV PORT 1688 @@ -11,39 +12,52 @@ ENV SQLITE true ENV SQLITE_PORT 8080 ENV HWID RANDOM ENV LOGLEVEL INFO -ENV LOGFILE /dev/stdout +ENV LOGFILE STDOUT ENV LOGSIZE "" +ENV TZ America/Chicago COPY ./py-kms /home/py-kms +#hadolint ignore=DL3013,DL3018 RUN apk add --no-cache --update \ - bash \ - git \ - py3-argparse \ - py3-flask \ - py3-pygments \ - python3-tkinter \ - sqlite-libs \ - py3-pip \ - tzdata \ - build-base python3-dev && \ - git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ - cd /tmp/sqlite_web && \ - git checkout 2e7c85da3d37f80074ed3ae39b5851069b4f301c && \ - cd / && \ - mv /tmp/sqlite_web/sqlite_web /home/ && \ - rm -rf /tmp/sqlite_web && \ - pip3 install peewee tzlocal pytz pysqlite3 && \ - apk del git build-base python3-dev + bash \ + git \ + python3 \ + py3-argparse \ + py3-flask \ + py3-pygments \ + python3-tkinter \ + sqlite-libs \ + py3-pip \ + build-base python3-dev \ + ca-certificates \ + duplicity \ + su-exec \ + sudo \ + tzdata \ + shadow \ + && git clone --branch master --depth 1 https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web \ + && mv /tmp/sqlite_web/sqlite_web /home/ \ + && rm -rf /tmp/sqlite_web \ + && pip3 install --no-cache-dir peewee tzlocal pytz pysqlite3 wheel \ + && apk del git build-base python3-dev \ + && mkdir /db/ \ + && addgroup power_users \ + && adduser -S py-kms -G users -s /bin/bash \ + && usermod -a -G power_users py-kms \ + && chown py-kms:users /home/py-kms \ + # Fix undefined timezone, in case the user did not mount the /etc/localtime + && ln -sf /usr/share/zoneinfo/UTC /etc/localtime -# Fix undefined timezone, in case the user did not mount the /etc/localtime -RUN cp /usr/share/zoneinfo/UTC /etc/localtime +COPY docker/entrypoint.py /usr/bin/entrypoint.py +COPY docker/start.py /usr/bin/start.py -WORKDIR /home/py-kms +RUN chmod 755 /usr/bin/entrypoint.py -EXPOSE ${SQLITE_PORT}/tcp +WORKDIR /home/py-kms +#USER py-kms EXPOSE ${PORT}/tcp +EXPOSE 8080 -COPY docker/entrypoint.py /usr/bin/entrypoint.py -RUN chmod a+x /usr/bin/entrypoint.py -ENTRYPOINT ["/usr/bin/python3", "/usr/bin/entrypoint.py"] +ENTRYPOINT [ "/usr/bin/python3", "/usr/bin/entrypoint.py" ] +CMD ["/usr/bin/start.py"] diff --git a/docker/entrypoint.py b/docker/entrypoint.py index bd0805e..d886c92 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -1,9 +1,10 @@ #!/usr/bin/python3 -# This replaces the old start.sh and ensures all arguments are bound correctly from the environment variables... +# Need root privileges to change timezone, and user uid/gid +import grp import os -import time +import pwd import subprocess argumentVariableMapping = { @@ -19,6 +20,21 @@ } sqliteWebPath = '/home/sqlite_web/sqlite_web.py' +def change_uid_grp(): + user_db_entries = pwd.getpwnam("py-kms") + user_grp_db_entries = grp.getgrnam("power_users") + uid = user_db_entries.pw_uid + gid = user_grp_db_entries.gr_gid + new_gid = int(os.getenv('GID', str(gid))) + new_uid = int(os.getenv('UID', str(uid))) + os.chown("/home/py-kms", new_uid, new_uid) + os.chown("/db/pykms_database.db", new_uid, new_uid) + if gid != new_gid: + print("Setting gid to " + str(new_gid), flush=True) + os.setgid(gid) + if uid != new_uid: + print("Setting uid to " + str(new_uid), flush=True) + os.setuid(uid) # Build the command to execute listenIP = os.environ.get('IP', '0.0.0.0') listenPort = os.environ.get('PORT', '1688') @@ -36,8 +52,14 @@ command.append('-s') command.append(dbPath) -pykmsProcess = subprocess.Popen(command) +def change_tz(): + tz = os.getenv('TZ', 'etc/UTC') + # TZ is not symlinked and defined TZ exists + if tz not in os.readlink(LTIME) and os.path.isfile('/usr/share/zoneinfo/' + tz): + print("Setting timezone to " + tz, flush=True) + os.remove(LTIME) + os.symlink(os.path.join('/usr/share/zoneinfo/', tz), LTIME) # In case SQLITE is defined: Start the web interface if enableSQLITE: time.sleep(5) # The server may take a while to start @@ -46,12 +68,13 @@ subprocess.run(['/usr/bin/python3', 'pykms_Client.py', listenIP, listenPort, '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218']) sqliteProcess = subprocess.Popen(['/usr/bin/python3', sqliteWebPath, '-H', listenIP, '--read-only', '-x', dbPath, '-p', os.environ.get('SQLITE_PORT', 8080)]) -try: - pykmsProcess.wait() -except: - # In case of any error - just shut down - pass -if enableSQLITE: - sqliteProcess.terminate() - pykmsProcess.terminate() +LTIME = '/etc/localtime' +PYTHON3 = '/usr/bin/python3' +log_level = os.getenv('LOGLEVEL', 'INFO') + +# Main +if (__name__ == "__main__"): + change_tz() + change_uid_grp() + subprocess.call("/usr/bin/start.py",shell=True) diff --git a/docker/start.py b/docker/start.py new file mode 100644 index 0000000..7bb3309 --- /dev/null +++ b/docker/start.py @@ -0,0 +1,90 @@ +#!/usr/bin/python3 + +# This replaces the old start.sh and ensures all arguments are bound correctly from the environment variables... + +import os +import subprocess +import time + +LTIME = '/etc/localtime' +PYTHON3 = '/usr/bin/python3' +argumentVariableMapping = { + '-l': 'LCID', + '-c': 'CLIENT_COUNT', + '-a': 'ACTIVATION_INTERVAL', + '-r': 'RENEWAL_INTERVAL', + '-w': 'HWID', + '-V': 'LOGLEVEL', + '-F': 'LOGFILE', + '-S': 'LOGSIZE', + '-e': 'EPID' +} +enableSQLITE = os.getenv('SQLITE', 'false').lower() == 'true' +dbPath = os.path.join('/db/pykms_database.db') +log_level = os.getenv('LOGLEVEL', 'INFO') + + +def start_kms_client(): + time.sleep(5) # The server may take a while to start + if not os.path.isfile(dbPath): + # Start a dummy activation to ensure the database file is created + client_cmd = [PYTHON3, 'pykms_Client.py', os.environ.get('IP', "0.0.0.0"), os.environ.get('PORT', 1688), + '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218', + '-V', os.environ.get('LOGLEVEL', 'INFO'), '-F', os.environ.get('LOGFILE', 'STDOUT')] + if os.environ.get('LOGSIZE', '') != "": + client_cmd.append('-S') + client_cmd.append(os.environ.get('LOGSIZE')) + + if log_level.lower() in ['info', 'debug']: + print("Starting a dummy activation to ensure the database file is created", flush=True) + if log_level.lower() == 'debug': + print("client_cmd: " + str(client_cmd), flush=True) + + subprocess.run(client_cmd) + + +def start_kms(): + # Build the command to execute + command = [PYTHON3, 'pykms_Server.py', os.environ.get('IP'), os.environ.get('PORT')] + for (arg, env) in argumentVariableMapping.items(): + if env in os.environ and os.environ.get(env) != '': + command.append(arg) + command.append(os.environ.get(env)) + + os.makedirs(os.path.dirname(dbPath), exist_ok=True) + + if enableSQLITE: + print('Storing database file to ' + dbPath, flush=True) + command.append('-s') + command.append(dbPath) + + if log_level.lower() == 'debug': + print("server_cmd: " + str(command), flush=True) + + pykms_process = subprocess.Popen(command) + + # In case SQLITE is defined: Start the web interface + if enableSQLITE: + start_kms_client() + sqlite_cmd = [PYTHON3, '/home/sqlite_web/sqlite_web.py', '-H', os.environ.get('IP'), '--read-only', '-x', dbPath, + '-p', os.environ.get('SQLITE_PORT')] + + if log_level.lower() == 'debug': + print("sqlite_cmd: " + str(sqlite_cmd), flush=True) + + sqlite_process = subprocess.Popen(sqlite_cmd) + + try: + pykms_process.wait() + except Exception: + # In case of any error - just shut down + pass + + if enableSQLITE: + sqlite_process.terminate() + pykms_process.terminate() + + +# Main +if (__name__ == "__main__"): + start_kms() From d2394cd1bd5ece2dbac98c33701bd89345f7afba Mon Sep 17 00:00:00 2001 From: edgd1er Date: Fri, 22 Oct 2021 23:39:31 +0200 Subject: [PATCH 048/154] start as root, change uid/gid, drop priv, run server/client --- docker/docker-py3-kms/Dockerfile | 4 +-- docker/entrypoint.py | 58 +++++++------------------------- docker/start.py | 12 +++---- 3 files changed, 19 insertions(+), 55 deletions(-) diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 5bfb7d5..629d5b0 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -32,8 +32,6 @@ RUN apk add --no-cache --update \ build-base python3-dev \ ca-certificates \ duplicity \ - su-exec \ - sudo \ tzdata \ shadow \ && git clone --branch master --depth 1 https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web \ @@ -56,7 +54,7 @@ RUN chmod 755 /usr/bin/entrypoint.py WORKDIR /home/py-kms #USER py-kms -EXPOSE ${PORT}/tcp +EXPOSE 1688/tcp EXPOSE 8080 ENTRYPOINT [ "/usr/bin/python3", "/usr/bin/entrypoint.py" ] diff --git a/docker/entrypoint.py b/docker/entrypoint.py index d886c92..3250225 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -7,18 +7,10 @@ import pwd import subprocess -argumentVariableMapping = { - '-l': 'LCID', - '-c': 'CLIENT_COUNT', - '-a': 'ACTIVATION_INTERVAL', - '-r': 'RENEWAL_INTERVAL', - '-w': 'HWID', - '-V': 'LOGLEVEL', - '-F': 'LOGFILE', - '-S': 'LOGSIZE', - '-e': 'EPID' -} -sqliteWebPath = '/home/sqlite_web/sqlite_web.py' +PYTHON3 = '/usr/bin/python3' +dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db', 'pykms_database.db') +log_level = os.getenv('LOGLEVEL', 'INFO') + def change_uid_grp(): user_db_entries = pwd.getpwnam("py-kms") @@ -27,54 +19,28 @@ def change_uid_grp(): gid = user_grp_db_entries.gr_gid new_gid = int(os.getenv('GID', str(gid))) new_uid = int(os.getenv('UID', str(uid))) - os.chown("/home/py-kms", new_uid, new_uid) - os.chown("/db/pykms_database.db", new_uid, new_uid) + os.chown("/home/py-kms", new_uid, new_gid) + os.chown("/usr/bin/start.py", new_uid, new_gid) + if os.path.isfile(dbPath): os.chown(dbPath, new_uid, new_gid) + os.system("ls -al /usr/bin/start.py") if gid != new_gid: print("Setting gid to " + str(new_gid), flush=True) os.setgid(gid) if uid != new_uid: print("Setting uid to " + str(new_uid), flush=True) os.setuid(uid) -# Build the command to execute -listenIP = os.environ.get('IP', '0.0.0.0') -listenPort = os.environ.get('PORT', '1688') -command = ['/usr/bin/python3', 'pykms_Server.py', listenIP, listenPort] -for (arg, env) in argumentVariableMapping.items(): - if env in os.environ and os.environ.get(env) != '': - command.append(arg) - command.append(os.environ.get(env)) - -enableSQLITE = os.path.isfile(sqliteWebPath) and os.environ.get('SQLITE', 'false').lower() == 'true' -if enableSQLITE: - dbPath = os.path.join('db', 'pykms_database.db') - print('Storing database file to ' + dbPath) - os.makedirs('db', exist_ok=True) - command.append('-s') - command.append(dbPath) def change_tz(): tz = os.getenv('TZ', 'etc/UTC') # TZ is not symlinked and defined TZ exists - if tz not in os.readlink(LTIME) and os.path.isfile('/usr/share/zoneinfo/' + tz): + if tz not in os.readlink('/etc/localtime') and os.path.isfile('/usr/share/zoneinfo/' + tz): print("Setting timezone to " + tz, flush=True) - os.remove(LTIME) - os.symlink(os.path.join('/usr/share/zoneinfo/', tz), LTIME) -# In case SQLITE is defined: Start the web interface -if enableSQLITE: - time.sleep(5) # The server may take a while to start - if not os.path.isfile(dbPath): - # Start a dummy activation to ensure the database file is created - subprocess.run(['/usr/bin/python3', 'pykms_Client.py', listenIP, listenPort, '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218']) - sqliteProcess = subprocess.Popen(['/usr/bin/python3', sqliteWebPath, '-H', listenIP, '--read-only', '-x', dbPath, '-p', os.environ.get('SQLITE_PORT', 8080)]) + os.remove('/etc/localtime') + os.symlink(os.path.join('/usr/share/zoneinfo/', tz), '/etc/localtime') -LTIME = '/etc/localtime' -PYTHON3 = '/usr/bin/python3' -log_level = os.getenv('LOGLEVEL', 'INFO') - # Main if (__name__ == "__main__"): change_tz() - change_uid_grp() - subprocess.call("/usr/bin/start.py",shell=True) + subprocess.call(PYTHON3 + " /usr/bin/start.py", preexec_fn=change_uid_grp(), shell=True) diff --git a/docker/start.py b/docker/start.py index 7bb3309..8de8d57 100644 --- a/docker/start.py +++ b/docker/start.py @@ -1,7 +1,6 @@ #!/usr/bin/python3 # This replaces the old start.sh and ensures all arguments are bound correctly from the environment variables... - import os import subprocess import time @@ -19,13 +18,14 @@ '-S': 'LOGSIZE', '-e': 'EPID' } -enableSQLITE = os.getenv('SQLITE', 'false').lower() == 'true' -dbPath = os.path.join('/db/pykms_database.db') + +sqliteWebPath = '/home/sqlite_web/sqlite_web.py' +enableSQLITE = os.path.isfile(sqliteWebPath) and os.environ.get('SQLITE', 'false').lower() == 'true' +dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db', 'pykms_database.db') log_level = os.getenv('LOGLEVEL', 'INFO') def start_kms_client(): - time.sleep(5) # The server may take a while to start if not os.path.isfile(dbPath): # Start a dummy activation to ensure the database file is created client_cmd = [PYTHON3, 'pykms_Client.py', os.environ.get('IP', "0.0.0.0"), os.environ.get('PORT', 1688), @@ -51,8 +51,6 @@ def start_kms(): command.append(arg) command.append(os.environ.get(env)) - os.makedirs(os.path.dirname(dbPath), exist_ok=True) - if enableSQLITE: print('Storing database file to ' + dbPath, flush=True) command.append('-s') @@ -65,6 +63,8 @@ def start_kms(): # In case SQLITE is defined: Start the web interface if enableSQLITE: + time.sleep(5) # The server may take a while to start + os.system('ls -al ' + dbPath) start_kms_client() sqlite_cmd = [PYTHON3, '/home/sqlite_web/sqlite_web.py', '-H', os.environ.get('IP'), '--read-only', '-x', dbPath, '-p', os.environ.get('SQLITE_PORT')] From 6d7124414a6b270c7e6749c89ab8169d54f7d11e Mon Sep 17 00:00:00 2001 From: edgd1er Date: Sat, 23 Oct 2021 08:54:48 +0200 Subject: [PATCH 049/154] use unbuffered output globally. --- docker/entrypoint.py | 12 ++++++------ docker/start.py | 19 +++++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 3250225..06dda71 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -1,6 +1,6 @@ -#!/usr/bin/python3 +#!/usr/bin/python3 -u -# Need root privileges to change timezone, and user uid/gid +# Need root privileges to change timezone, and user uid/gid, file/folder ownernship import grp import os @@ -24,10 +24,10 @@ def change_uid_grp(): if os.path.isfile(dbPath): os.chown(dbPath, new_uid, new_gid) os.system("ls -al /usr/bin/start.py") if gid != new_gid: - print("Setting gid to " + str(new_gid), flush=True) + print("Setting gid to " + str(new_gid)) os.setgid(gid) if uid != new_uid: - print("Setting uid to " + str(new_uid), flush=True) + print("Setting uid to " + str(new_uid)) os.setuid(uid) @@ -35,7 +35,7 @@ def change_tz(): tz = os.getenv('TZ', 'etc/UTC') # TZ is not symlinked and defined TZ exists if tz not in os.readlink('/etc/localtime') and os.path.isfile('/usr/share/zoneinfo/' + tz): - print("Setting timezone to " + tz, flush=True) + print("Setting timezone to " + tz) os.remove('/etc/localtime') os.symlink(os.path.join('/usr/share/zoneinfo/', tz), '/etc/localtime') @@ -43,4 +43,4 @@ def change_tz(): # Main if (__name__ == "__main__"): change_tz() - subprocess.call(PYTHON3 + " /usr/bin/start.py", preexec_fn=change_uid_grp(), shell=True) + subprocess.call(PYTHON3 + " -u /usr/bin/start.py", preexec_fn=change_uid_grp(), shell=True) diff --git a/docker/start.py b/docker/start.py index 8de8d57..861adff 100644 --- a/docker/start.py +++ b/docker/start.py @@ -1,11 +1,10 @@ -#!/usr/bin/python3 +#!/usr/bin/python3 -u # This replaces the old start.sh and ensures all arguments are bound correctly from the environment variables... import os import subprocess import time -LTIME = '/etc/localtime' PYTHON3 = '/usr/bin/python3' argumentVariableMapping = { '-l': 'LCID', @@ -28,7 +27,7 @@ def start_kms_client(): if not os.path.isfile(dbPath): # Start a dummy activation to ensure the database file is created - client_cmd = [PYTHON3, 'pykms_Client.py', os.environ.get('IP', "0.0.0.0"), os.environ.get('PORT', 1688), + client_cmd = [PYTHON3,'-u', 'pykms_Client.py', os.environ.get('IP', "0.0.0.0"), os.environ.get('PORT', 1688), '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218', '-V', os.environ.get('LOGLEVEL', 'INFO'), '-F', os.environ.get('LOGFILE', 'STDOUT')] if os.environ.get('LOGSIZE', '') != "": @@ -36,28 +35,28 @@ def start_kms_client(): client_cmd.append(os.environ.get('LOGSIZE')) if log_level.lower() in ['info', 'debug']: - print("Starting a dummy activation to ensure the database file is created", flush=True) + print("Starting a dummy activation to ensure the database file is created") if log_level.lower() == 'debug': - print("client_cmd: " + str(client_cmd), flush=True) + print("client_cmd: " + str(client_cmd)) subprocess.run(client_cmd) def start_kms(): # Build the command to execute - command = [PYTHON3, 'pykms_Server.py', os.environ.get('IP'), os.environ.get('PORT')] + command = [PYTHON3,'-u', 'pykms_Server.py', os.environ.get('IP'), os.environ.get('PORT')] for (arg, env) in argumentVariableMapping.items(): if env in os.environ and os.environ.get(env) != '': command.append(arg) command.append(os.environ.get(env)) if enableSQLITE: - print('Storing database file to ' + dbPath, flush=True) + print('Storing database file to ' + dbPath) command.append('-s') command.append(dbPath) if log_level.lower() == 'debug': - print("server_cmd: " + str(command), flush=True) + print("server_cmd: " + str(command)) pykms_process = subprocess.Popen(command) @@ -66,11 +65,11 @@ def start_kms(): time.sleep(5) # The server may take a while to start os.system('ls -al ' + dbPath) start_kms_client() - sqlite_cmd = [PYTHON3, '/home/sqlite_web/sqlite_web.py', '-H', os.environ.get('IP'), '--read-only', '-x', dbPath, + sqlite_cmd = [PYTHON3,'-u', '/home/sqlite_web/sqlite_web.py', '-H', os.environ.get('IP'), '--read-only', '-x', dbPath, '-p', os.environ.get('SQLITE_PORT')] if log_level.lower() == 'debug': - print("sqlite_cmd: " + str(sqlite_cmd), flush=True) + print("sqlite_cmd: " + str(sqlite_cmd)) sqlite_process = subprocess.Popen(sqlite_cmd) From 5f7ef1397f8ce98e35bd2a834797bffb54f02efe Mon Sep 17 00:00:00 2001 From: edgd1er Date: Mon, 25 Oct 2021 23:57:57 +0200 Subject: [PATCH 050/154] add proper logger to entrypoint and start --- docker/entrypoint.py | 25 +++++++++++++++++++------ docker/start.py | 37 +++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 06dda71..3ccfb58 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -3,31 +3,43 @@ # Need root privileges to change timezone, and user uid/gid, file/folder ownernship import grp +import logging import os import pwd import subprocess +import sys PYTHON3 = '/usr/bin/python3' dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db', 'pykms_database.db') log_level = os.getenv('LOGLEVEL', 'INFO') +loggersrv = logging.getLogger('logsrv') +loggersrv.setLevel(log_level) +streamhandler = logging.StreamHandler(sys.stdout) +streamhandler.setLevel(log_level) +formatter = logging.Formatter(fmt = '\x1b[94m%(asctime)s %(levelname)-8s %(message)s', + datefmt = '%a, %d %b %Y %H:%M:%S',) +streamhandler.setFormatter(formatter) +loggersrv.addHandler(streamhandler) + def change_uid_grp(): user_db_entries = pwd.getpwnam("py-kms") user_grp_db_entries = grp.getgrnam("power_users") - uid = user_db_entries.pw_uid - gid = user_grp_db_entries.gr_gid + uid = int(user_db_entries.pw_uid) + gid = int(user_grp_db_entries.gr_gid) new_gid = int(os.getenv('GID', str(gid))) new_uid = int(os.getenv('UID', str(uid))) os.chown("/home/py-kms", new_uid, new_gid) os.chown("/usr/bin/start.py", new_uid, new_gid) if os.path.isfile(dbPath): os.chown(dbPath, new_uid, new_gid) - os.system("ls -al /usr/bin/start.py") + loggersrv.debug("%s" %str(subprocess.check_output("ls -al " + dbPath, shell=True))) if gid != new_gid: - print("Setting gid to " + str(new_gid)) + loggersrv.info("Setting gid to '%s'." % str(new_gid)) os.setgid(gid) + if uid != new_uid: - print("Setting uid to " + str(new_uid)) + loggersrv.info("Setting uid to '%s'." % str(new_uid)) os.setuid(uid) @@ -35,12 +47,13 @@ def change_tz(): tz = os.getenv('TZ', 'etc/UTC') # TZ is not symlinked and defined TZ exists if tz not in os.readlink('/etc/localtime') and os.path.isfile('/usr/share/zoneinfo/' + tz): - print("Setting timezone to " + tz) + loggersrv.info("Setting timzeone to %s" % tz ) os.remove('/etc/localtime') os.symlink(os.path.join('/usr/share/zoneinfo/', tz), '/etc/localtime') # Main if (__name__ == "__main__"): + loggersrv.info("Log level: %s" % log_level) change_tz() subprocess.call(PYTHON3 + " -u /usr/bin/start.py", preexec_fn=change_uid_grp(), shell=True) diff --git a/docker/start.py b/docker/start.py index 861adff..3b2a318 100644 --- a/docker/start.py +++ b/docker/start.py @@ -1,8 +1,10 @@ #!/usr/bin/python3 -u # This replaces the old start.sh and ensures all arguments are bound correctly from the environment variables... +import logging import os import subprocess +import sys import time PYTHON3 = '/usr/bin/python3' @@ -27,50 +29,45 @@ def start_kms_client(): if not os.path.isfile(dbPath): # Start a dummy activation to ensure the database file is created - client_cmd = [PYTHON3,'-u', 'pykms_Client.py', os.environ.get('IP', "0.0.0.0"), os.environ.get('PORT', 1688), + client_cmd = [PYTHON3, '-u', 'pykms_Client.py', os.environ.get('IP', "0.0.0.0"), os.environ.get('PORT', 1688), '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218', '-V', os.environ.get('LOGLEVEL', 'INFO'), '-F', os.environ.get('LOGFILE', 'STDOUT')] if os.environ.get('LOGSIZE', '') != "": client_cmd.append('-S') client_cmd.append(os.environ.get('LOGSIZE')) - if log_level.lower() in ['info', 'debug']: - print("Starting a dummy activation to ensure the database file is created") - if log_level.lower() == 'debug': - print("client_cmd: " + str(client_cmd)) + loggersrv.info("Starting a dummy activation to ensure the database file is created") + loggersrv.debug("client_cmd: %s" % (" ".join(str(x) for x in client_cmd).strip())) subprocess.run(client_cmd) def start_kms(): + sqlite_process = None # Build the command to execute - command = [PYTHON3,'-u', 'pykms_Server.py', os.environ.get('IP'), os.environ.get('PORT')] + command = [PYTHON3, '-u', 'pykms_Server.py', os.environ.get('IP'), os.environ.get('PORT')] for (arg, env) in argumentVariableMapping.items(): if env in os.environ and os.environ.get(env) != '': command.append(arg) command.append(os.environ.get(env)) if enableSQLITE: - print('Storing database file to ' + dbPath) + loggersrv.info("Storing database file to %s" % dbPath) command.append('-s') command.append(dbPath) - if log_level.lower() == 'debug': - print("server_cmd: " + str(command)) - + loggersrv.debug("server_cmd: %s" % (" ".join(str(x) for x in command).strip())) pykms_process = subprocess.Popen(command) # In case SQLITE is defined: Start the web interface if enableSQLITE: time.sleep(5) # The server may take a while to start - os.system('ls -al ' + dbPath) start_kms_client() - sqlite_cmd = [PYTHON3,'-u', '/home/sqlite_web/sqlite_web.py', '-H', os.environ.get('IP'), '--read-only', '-x', dbPath, + sqlite_cmd = [PYTHON3, '-u', '/home/sqlite_web/sqlite_web.py', '-H', os.environ.get('IP'), '--read-only', '-x', + dbPath, '-p', os.environ.get('SQLITE_PORT')] - if log_level.lower() == 'debug': - print("sqlite_cmd: " + str(sqlite_cmd)) - + loggersrv.debug("sqlite_cmd: %s" % (" ".join(str(x) for x in sqlite_cmd).strip())) sqlite_process = subprocess.Popen(sqlite_cmd) try: @@ -80,10 +77,18 @@ def start_kms(): pass if enableSQLITE: - sqlite_process.terminate() + if None != sqlite_process: sqlite_process.terminate() pykms_process.terminate() # Main if (__name__ == "__main__"): + loggersrv = logging.getLogger('logsrv') + loggersrv.setLevel(log_level) + streamhandler = logging.StreamHandler(sys.stdout) + streamhandler.setLevel(log_level) + formatter = logging.Formatter(fmt='\x1b[94m%(asctime)s %(levelname)-8s %(message)s', + datefmt='%a, %d %b %Y %H:%M:%S') + streamhandler.setFormatter(formatter) + loggersrv.addHandler(streamhandler) start_kms() From a564822e26d117028d46fdbbea6f4ec18c172194 Mon Sep 17 00:00:00 2001 From: edgd1er Date: Tue, 26 Oct 2021 22:56:47 +0200 Subject: [PATCH 051/154] add healthcheck with netcap checking port --- .dockerignore | 8 ++++++++ .gitignore | 5 ++++- docker/docker-py3-kms-minimal/Dockerfile | 15 +++++++++++---- docker/docker-py3-kms/Dockerfile | 10 ++++++---- 4 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..54d0d69 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +log/ +.idea +.github +*.db +*.yml +*.md +*.sh +Makefile diff --git a/.gitignore b/.gitignore index a149ec6..874f86a 100644 --- a/.gitignore +++ b/.gitignore @@ -129,4 +129,7 @@ dmypy.json .pyre/ # Helm -charts/*/*.tgz \ No newline at end of file +charts/*/*.tgz +/.idea/ +docker-compose-*.yml +*.sh diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index ecb2668..e4cd8ed 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -24,12 +24,17 @@ RUN apk add --no-cache --update \ python3-tkinter \ sqlite-libs \ py3-pip \ - tzdata \ + tzdata \ + netcat-openbsd \ build-base python3-dev && \ pip3 install --no-cache peewee tzlocal pytz wheel && \ apk del git build-base python3-dev && \ + && addgroup power_users \ + && adduser -S py-kms -G users -s /bin/bash \ + && usermod -a -G power_users py-kms \ + && chown py-kms:users /home/py-kms \ # Fix undefined timezone, in case the user did not mount the /etc/localtime - ln -sf /usr/share/zoneinfo/UTC /etc/localtime + && ln -sf /usr/share/zoneinfo/UTC /etc/localtime WORKDIR /home/py-kms @@ -37,5 +42,7 @@ EXPOSE ${PORT}/tcp COPY docker/entrypoint.py /usr/bin/entrypoint.py RUN chmod a+x /usr/bin/entrypoint.py -ENTRYPOINT ["/usr/bin/python3", "/usr/bin/entrypoint.py"] -#CMD["/usr/bin/start.py"] +HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -t localhost ${PORT} || exit 1 + +ENTRYPOINT ["/usr/bin/python3", "-u","/usr/bin/entrypoint.py"] +CMD["/usr/bin/start.py"] diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 629d5b0..c4221ac 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -16,8 +16,7 @@ ENV LOGFILE STDOUT ENV LOGSIZE "" ENV TZ America/Chicago -COPY ./py-kms /home/py-kms - +COPY py-kms /home/py-kms/ #hadolint ignore=DL3013,DL3018 RUN apk add --no-cache --update \ bash \ @@ -34,6 +33,7 @@ RUN apk add --no-cache --update \ duplicity \ tzdata \ shadow \ + netcat-openbsd \ && git clone --branch master --depth 1 https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web \ && mv /tmp/sqlite_web/sqlite_web /home/ \ && rm -rf /tmp/sqlite_web \ @@ -54,8 +54,10 @@ RUN chmod 755 /usr/bin/entrypoint.py WORKDIR /home/py-kms #USER py-kms -EXPOSE 1688/tcp +EXPOSE ${PORT}/tcp EXPOSE 8080 -ENTRYPOINT [ "/usr/bin/python3", "/usr/bin/entrypoint.py" ] +HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -t localhost ${PORT} || exit 1 + +ENTRYPOINT [ "/usr/bin/python3","-u","/usr/bin/entrypoint.py" ] CMD ["/usr/bin/start.py"] From 2979e783111440737ba02c556c368cdde9bb1a48 Mon Sep 17 00:00:00 2001 From: edgd1er Date: Fri, 29 Oct 2021 18:53:52 +0200 Subject: [PATCH 052/154] add missing setting to timzeone. --- docker/entrypoint.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 3ccfb58..17cff0e 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -50,6 +50,9 @@ def change_tz(): loggersrv.info("Setting timzeone to %s" % tz ) os.remove('/etc/localtime') os.symlink(os.path.join('/usr/share/zoneinfo/', tz), '/etc/localtime') + f = open("/etc/timezone", "w") + f.write(tz) + f.close() # Main From 51e2210e72e333fc24b5d360069dcb97b03ff360 Mon Sep 17 00:00:00 2001 From: edgd1er Date: Sat, 30 Oct 2021 12:41:11 +0200 Subject: [PATCH 053/154] var added as requested and renamed as per PEP-008 https://www.python.org/dev/peps/pep-0008/#function-and-variable-names --- docker/start.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docker/start.py b/docker/start.py index 3b2a318..625cf2f 100644 --- a/docker/start.py +++ b/docker/start.py @@ -24,18 +24,21 @@ enableSQLITE = os.path.isfile(sqliteWebPath) and os.environ.get('SQLITE', 'false').lower() == 'true' dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db', 'pykms_database.db') log_level = os.getenv('LOGLEVEL', 'INFO') +log_file = os.environ.get('LOGFILE', 'STDOUT') +listen_ip = os.environ.get('IP', '0.0.0.0') +listen_port = os.environ.get('PORT', '1688') +sqlite_port = os.environ.get('SQLITE_PORT', '8080') def start_kms_client(): if not os.path.isfile(dbPath): # Start a dummy activation to ensure the database file is created - client_cmd = [PYTHON3, '-u', 'pykms_Client.py', os.environ.get('IP', "0.0.0.0"), os.environ.get('PORT', 1688), + client_cmd = [PYTHON3, '-u', 'pykms_Client.py', listen_ip, listen_port, '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218', - '-V', os.environ.get('LOGLEVEL', 'INFO'), '-F', os.environ.get('LOGFILE', 'STDOUT')] + '-V', log_level, '-F', log_file] if os.environ.get('LOGSIZE', '') != "": client_cmd.append('-S') client_cmd.append(os.environ.get('LOGSIZE')) - loggersrv.info("Starting a dummy activation to ensure the database file is created") loggersrv.debug("client_cmd: %s" % (" ".join(str(x) for x in client_cmd).strip())) @@ -45,7 +48,7 @@ def start_kms_client(): def start_kms(): sqlite_process = None # Build the command to execute - command = [PYTHON3, '-u', 'pykms_Server.py', os.environ.get('IP'), os.environ.get('PORT')] + command = [PYTHON3, '-u', 'pykms_Server.py', listen_ip, listen_port] for (arg, env) in argumentVariableMapping.items(): if env in os.environ and os.environ.get(env) != '': command.append(arg) @@ -55,6 +58,7 @@ def start_kms(): loggersrv.info("Storing database file to %s" % dbPath) command.append('-s') command.append(dbPath) + os.makedirs(os.path.dirname(dbPath), exist_ok=True) loggersrv.debug("server_cmd: %s" % (" ".join(str(x) for x in command).strip())) pykms_process = subprocess.Popen(command) @@ -63,9 +67,8 @@ def start_kms(): if enableSQLITE: time.sleep(5) # The server may take a while to start start_kms_client() - sqlite_cmd = [PYTHON3, '-u', '/home/sqlite_web/sqlite_web.py', '-H', os.environ.get('IP'), '--read-only', '-x', - dbPath, - '-p', os.environ.get('SQLITE_PORT')] + sqlite_cmd = [PYTHON3, '-u', '/home/sqlite_web/sqlite_web.py', '-H', listen_ip, '--read-only', '-x', + dbPath, '-p', sqlite_port] loggersrv.debug("sqlite_cmd: %s" % (" ".join(str(x) for x in sqlite_cmd).strip())) sqlite_process = subprocess.Popen(sqlite_cmd) From fa17996b6677f0884b71a6511e963fcf42596de6 Mon Sep 17 00:00:00 2001 From: edgd1er Date: Sun, 31 Oct 2021 18:13:38 +0100 Subject: [PATCH 054/154] fix dockerfile for minimal kms --- docker/docker-py3-kms-minimal/Dockerfile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index e4cd8ed..858f62c 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -25,10 +25,11 @@ RUN apk add --no-cache --update \ sqlite-libs \ py3-pip \ tzdata \ + shadow \ netcat-openbsd \ - build-base python3-dev && \ - pip3 install --no-cache peewee tzlocal pytz wheel && \ - apk del git build-base python3-dev && \ + build-base python3-dev \ + && pip3 install --no-cache peewee tzlocal pytz wheel \ + && apk del git build-base python3-dev \ && addgroup power_users \ && adduser -S py-kms -G users -s /bin/bash \ && usermod -a -G power_users py-kms \ @@ -41,8 +42,10 @@ WORKDIR /home/py-kms EXPOSE ${PORT}/tcp COPY docker/entrypoint.py /usr/bin/entrypoint.py +COPY docker/start.py /usr/bin/start.py + RUN chmod a+x /usr/bin/entrypoint.py HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -t localhost ${PORT} || exit 1 ENTRYPOINT ["/usr/bin/python3", "-u","/usr/bin/entrypoint.py"] -CMD["/usr/bin/start.py"] +CMD ["/usr/bin/start.py"] From ba25df0b1cf2261e0247c025b3c2bc099f408618 Mon Sep 17 00:00:00 2001 From: Zhaofeng Yang Date: Mon, 1 Nov 2021 12:32:38 +0800 Subject: [PATCH 055/154] subprocess should be run when this if statement is true --- docker/entrypoint.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 17cff0e..214eebd 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -32,8 +32,9 @@ def change_uid_grp(): new_uid = int(os.getenv('UID', str(uid))) os.chown("/home/py-kms", new_uid, new_gid) os.chown("/usr/bin/start.py", new_uid, new_gid) - if os.path.isfile(dbPath): os.chown(dbPath, new_uid, new_gid) - loggersrv.debug("%s" %str(subprocess.check_output("ls -al " + dbPath, shell=True))) + if os.path.isfile(dbPath): + os.chown(dbPath, new_uid, new_gid) + loggersrv.debug("%s" %str(subprocess.check_output("ls -al " + dbPath, shell=True))) if gid != new_gid: loggersrv.info("Setting gid to '%s'." % str(new_gid)) os.setgid(gid) From 7f4fe7d003763a0f1af70dc549fffe8f5f873f66 Mon Sep 17 00:00:00 2001 From: Zhaofeng Yang Date: Mon, 1 Nov 2021 13:25:27 +0800 Subject: [PATCH 056/154] code style --- docker/entrypoint.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 214eebd..57038fd 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -33,8 +33,9 @@ def change_uid_grp(): os.chown("/home/py-kms", new_uid, new_gid) os.chown("/usr/bin/start.py", new_uid, new_gid) if os.path.isfile(dbPath): - os.chown(dbPath, new_uid, new_gid) - loggersrv.debug("%s" %str(subprocess.check_output("ls -al " + dbPath, shell=True))) + os.chown(dbPath, new_uid, new_gid) + loggersrv.debug("%s" %str(subprocess.check_output("ls -al " + dbPath, shell=True))) + if gid != new_gid: loggersrv.info("Setting gid to '%s'." % str(new_gid)) os.setgid(gid) From 008143b1c45bfe312d1bca7f2234ad0de0a2c3ee Mon Sep 17 00:00:00 2001 From: TheSpad Date: Tue, 9 Nov 2021 18:03:28 +0000 Subject: [PATCH 057/154] Fix healthchecks, make Dockerfiles consistent --- docker/docker-py3-kms-minimal/Dockerfile | 31 ++++++------- docker/docker-py3-kms/Dockerfile | 56 ++++++++++++------------ 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 858f62c..d509bf6 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -16,18 +16,18 @@ ENV LOGSIZE "" COPY ./py-kms /home/py-kms RUN apk add --no-cache --update \ - bash \ - git \ - py3-argparse \ - py3-flask \ - py3-pygments \ - python3-tkinter \ - sqlite-libs \ - py3-pip \ - tzdata \ + bash \ + git \ + py3-argparse \ + py3-flask \ + py3-pygments \ + python3-tkinter \ + sqlite-libs \ + py3-pip \ + tzdata \ shadow \ netcat-openbsd \ - build-base python3-dev \ + build-base python3-dev \ && pip3 install --no-cache peewee tzlocal pytz wheel \ && apk del git build-base python3-dev \ && addgroup power_users \ @@ -37,15 +37,16 @@ RUN apk add --no-cache --update \ # Fix undefined timezone, in case the user did not mount the /etc/localtime && ln -sf /usr/share/zoneinfo/UTC /etc/localtime +COPY docker/entrypoint.py /usr/bin/entrypoint.py +COPY docker/start.py /usr/bin/start.py + +RUN chmod 755 /usr/bin/entrypoint.py + WORKDIR /home/py-kms EXPOSE ${PORT}/tcp -COPY docker/entrypoint.py /usr/bin/entrypoint.py -COPY docker/start.py /usr/bin/start.py - -RUN chmod a+x /usr/bin/entrypoint.py -HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -t localhost ${PORT} || exit 1 +HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z localhost ${PORT} || exit 1 ENTRYPOINT ["/usr/bin/python3", "-u","/usr/bin/entrypoint.py"] CMD ["/usr/bin/start.py"] diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index c4221ac..e0c0c2c 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -19,33 +19,33 @@ ENV TZ America/Chicago COPY py-kms /home/py-kms/ #hadolint ignore=DL3013,DL3018 RUN apk add --no-cache --update \ - bash \ - git \ - python3 \ - py3-argparse \ - py3-flask \ - py3-pygments \ - python3-tkinter \ - sqlite-libs \ - py3-pip \ - build-base python3-dev \ - ca-certificates \ - duplicity \ - tzdata \ - shadow \ - netcat-openbsd \ - && git clone --branch master --depth 1 https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web \ - && mv /tmp/sqlite_web/sqlite_web /home/ \ - && rm -rf /tmp/sqlite_web \ - && pip3 install --no-cache-dir peewee tzlocal pytz pysqlite3 wheel \ - && apk del git build-base python3-dev \ - && mkdir /db/ \ - && addgroup power_users \ - && adduser -S py-kms -G users -s /bin/bash \ - && usermod -a -G power_users py-kms \ - && chown py-kms:users /home/py-kms \ - # Fix undefined timezone, in case the user did not mount the /etc/localtime - && ln -sf /usr/share/zoneinfo/UTC /etc/localtime + bash \ + git \ + python3 \ + py3-argparse \ + py3-flask \ + py3-pygments \ + python3-tkinter \ + sqlite-libs \ + py3-pip \ + build-base python3-dev \ + ca-certificates \ + duplicity \ + tzdata \ + shadow \ + netcat-openbsd \ + && git clone --branch master --depth 1 https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web \ + && mv /tmp/sqlite_web/sqlite_web /home/ \ + && rm -rf /tmp/sqlite_web \ + && pip3 install --no-cache-dir peewee tzlocal pytz pysqlite3 wheel \ + && apk del git build-base python3-dev \ + && mkdir /db/ \ + && addgroup power_users \ + && adduser -S py-kms -G users -s /bin/bash \ + && usermod -a -G power_users py-kms \ + && chown py-kms:users /home/py-kms \ + # Fix undefined timezone, in case the user did not mount the /etc/localtime + && ln -sf /usr/share/zoneinfo/UTC /etc/localtime COPY docker/entrypoint.py /usr/bin/entrypoint.py COPY docker/start.py /usr/bin/start.py @@ -57,7 +57,7 @@ WORKDIR /home/py-kms EXPOSE ${PORT}/tcp EXPOSE 8080 -HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -t localhost ${PORT} || exit 1 +HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z localhost ${PORT} || exit 1 ENTRYPOINT [ "/usr/bin/python3","-u","/usr/bin/entrypoint.py" ] CMD ["/usr/bin/start.py"] From e67f14c7d7b67816cf6559b3ab7872bd538913e6 Mon Sep 17 00:00:00 2001 From: TheSpad Date: Tue, 9 Nov 2021 18:05:39 +0000 Subject: [PATCH 058/154] Fix HC interval --- docker/docker-py3-kms-minimal/Dockerfile | 2 +- docker/docker-py3-kms/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index d509bf6..59f58cf 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -46,7 +46,7 @@ WORKDIR /home/py-kms EXPOSE ${PORT}/tcp -HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z localhost ${PORT} || exit 1 +HEALTHCHECK --interval=5ms --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z localhost ${PORT} || exit 1 ENTRYPOINT ["/usr/bin/python3", "-u","/usr/bin/entrypoint.py"] CMD ["/usr/bin/start.py"] diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index e0c0c2c..16ec7d2 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -57,7 +57,7 @@ WORKDIR /home/py-kms EXPOSE ${PORT}/tcp EXPOSE 8080 -HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z localhost ${PORT} || exit 1 +HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z localhost ${PORT} || exit 1 ENTRYPOINT [ "/usr/bin/python3","-u","/usr/bin/entrypoint.py" ] CMD ["/usr/bin/start.py"] From edc028c66d00b6a7a8f2547335d334c36710b739 Mon Sep 17 00:00:00 2001 From: TheSpad Date: Tue, 9 Nov 2021 18:06:07 +0000 Subject: [PATCH 059/154] Fix HC interval typo --- docker/docker-py3-kms-minimal/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 59f58cf..7e0a6c2 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -46,7 +46,7 @@ WORKDIR /home/py-kms EXPOSE ${PORT}/tcp -HEALTHCHECK --interval=5ms --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z localhost ${PORT} || exit 1 +HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z localhost ${PORT} || exit 1 ENTRYPOINT ["/usr/bin/python3", "-u","/usr/bin/entrypoint.py"] CMD ["/usr/bin/start.py"] From 2312a2d8ac3eb1773354a67b989fbc8f66ebfa58 Mon Sep 17 00:00:00 2001 From: Vladislav Poddubnyy Date: Wed, 1 Dec 2021 02:43:01 +0300 Subject: [PATCH 060/154] Fixed not dropping privileges to py-kms user by default --- docker/entrypoint.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 57038fd..df01e30 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -36,13 +36,11 @@ def change_uid_grp(): os.chown(dbPath, new_uid, new_gid) loggersrv.debug("%s" %str(subprocess.check_output("ls -al " + dbPath, shell=True))) - if gid != new_gid: - loggersrv.info("Setting gid to '%s'." % str(new_gid)) - os.setgid(gid) + loggersrv.info("Setting gid to '%s'." % str(new_gid)) + os.setgid(new_gid) - if uid != new_uid: - loggersrv.info("Setting uid to '%s'." % str(new_uid)) - os.setuid(uid) + loggersrv.info("Setting uid to '%s'." % str(new_uid)) + os.setuid(new_uid) def change_tz(): From 7073b88d43449cd2138a142577a42a2e0461d3d8 Mon Sep 17 00:00:00 2001 From: xWTF Date: Fri, 3 Dec 2021 17:14:29 +0800 Subject: [PATCH 061/154] Fix loglevel MININFO for docker --- docker/entrypoint.py | 9 +++++---- docker/start.py | 8 +++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 57038fd..e534cc0 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -11,12 +11,13 @@ PYTHON3 = '/usr/bin/python3' dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db', 'pykms_database.db') -log_level = os.getenv('LOGLEVEL', 'INFO') - +log_level_bootstrap = log_level = os.getenv('LOGLEVEL', 'INFO') +if log_level_bootstrap == "MININFO": + log_level_bootstrap = "INFO" loggersrv = logging.getLogger('logsrv') -loggersrv.setLevel(log_level) +loggersrv.setLevel(log_level_bootstrap) streamhandler = logging.StreamHandler(sys.stdout) -streamhandler.setLevel(log_level) +streamhandler.setLevel(log_level_bootstrap) formatter = logging.Formatter(fmt = '\x1b[94m%(asctime)s %(levelname)-8s %(message)s', datefmt = '%a, %d %b %Y %H:%M:%S',) streamhandler.setFormatter(formatter) diff --git a/docker/start.py b/docker/start.py index 625cf2f..5d6cf1d 100644 --- a/docker/start.py +++ b/docker/start.py @@ -23,7 +23,9 @@ sqliteWebPath = '/home/sqlite_web/sqlite_web.py' enableSQLITE = os.path.isfile(sqliteWebPath) and os.environ.get('SQLITE', 'false').lower() == 'true' dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db', 'pykms_database.db') -log_level = os.getenv('LOGLEVEL', 'INFO') +log_level_bootstrap = log_level = os.getenv('LOGLEVEL', 'INFO') +if log_level_bootstrap == "MININFO": + log_level_bootstrap = "INFO" log_file = os.environ.get('LOGFILE', 'STDOUT') listen_ip = os.environ.get('IP', '0.0.0.0') listen_port = os.environ.get('PORT', '1688') @@ -87,9 +89,9 @@ def start_kms(): # Main if (__name__ == "__main__"): loggersrv = logging.getLogger('logsrv') - loggersrv.setLevel(log_level) + loggersrv.setLevel(log_level_bootstrap) streamhandler = logging.StreamHandler(sys.stdout) - streamhandler.setLevel(log_level) + streamhandler.setLevel(log_level_bootstrap) formatter = logging.Formatter(fmt='\x1b[94m%(asctime)s %(levelname)-8s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S') streamhandler.setFormatter(formatter) From 59e9d4784338daf337004e33b3f7b1fc2b64f8d5 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Thu, 9 Dec 2021 01:58:12 +0100 Subject: [PATCH 062/154] Removed unused dependency --- docker/docker-py3-kms/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 16ec7d2..9eba678 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -30,7 +30,6 @@ RUN apk add --no-cache --update \ py3-pip \ build-base python3-dev \ ca-certificates \ - duplicity \ tzdata \ shadow \ netcat-openbsd \ From 1e6a55d06adc74a692920ecae667a976a50a1c69 Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 9 Dec 2021 17:38:26 +0100 Subject: [PATCH 063/154] Fix for #36 --- py-kms/Etrigan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-kms/Etrigan.py b/py-kms/Etrigan.py index 0bb2498..c9cf193 100644 --- a/py-kms/Etrigan.py +++ b/py-kms/Etrigan.py @@ -9,7 +9,7 @@ import signal import logging import argparse -from collections import Sequence +from collections.abc import Sequence __version__ = "0.1" __license__ = "MIT License" From 28faacdf1d2418f2921a7b56997dbfe37f7bc919 Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 9 Dec 2021 17:45:24 +0100 Subject: [PATCH 064/154] Added CTRL+C check --- docker/start.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/start.py b/docker/start.py index 5d6cf1d..5658235 100644 --- a/docker/start.py +++ b/docker/start.py @@ -80,6 +80,8 @@ def start_kms(): except Exception: # In case of any error - just shut down pass + except KeyboardInterrupt: + pass if enableSQLITE: if None != sqlite_process: sqlite_process.terminate() From 11e8b4d2fceca01375c947b687ea2aa354c24b32 Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 9 Dec 2021 18:01:23 +0100 Subject: [PATCH 065/154] Corrected SO_REUSEPORT behavior on unsupported platforms --- py-kms/pykms_Connect.py | 8 ++++++-- py-kms/pykms_Server.py | 5 +---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/py-kms/pykms_Connect.py b/py-kms/pykms_Connect.py index cf8b3dd..69492bc 100644 --- a/py-kms/pykms_Connect.py +++ b/py-kms/pykms_Connect.py @@ -4,6 +4,9 @@ import socket import selectors import ipaddress +import logging +from pykms_Format import pretty_printer +loggersrv = logging.getLogger('logsrv') # https://github.com/python/cpython/blob/master/Lib/socket.py def has_dualstack_ipv6(): @@ -27,12 +30,13 @@ def create_server_sock(address, *, family = socket.AF_INET, backlog = None, reus *family* should be either AF_INET or AF_INET6. *backlog* is the queue size passed to socket.listen(). - *reuse_port* dictates whether to use the SO_REUSEPORT socket option. + *reuse_port* if True and the platform supports it, we will use the SO_REUSEPORT socket option. *dualstack_ipv6* if True and the platform supports it, it will create an AF_INET6 socket able to accept both IPv4 or IPv6 connections; when False it will explicitly disable this option on platforms that enable it by default (e.g. Linux). """ if reuse_port and not hasattr(socket._socket, "SO_REUSEPORT"): - raise ValueError("SO_REUSEPORT not supported on this platform") + pretty_printer(log_obj = loggersrv.warning, put_text = "{reverse}{yellow}{bold}SO_REUSEPORT not supported on this platform - ignoring socket option.{end}") + reuse_port = False if dualstack_ipv6: if not has_dualstack_ipv6(): diff --git a/py-kms/pykms_Server.py b/py-kms/pykms_Server.py index 60c74a5..cb131ee 100755 --- a/py-kms/pykms_Server.py +++ b/py-kms/pykms_Server.py @@ -13,7 +13,6 @@ import socketserver import queue as Queue import selectors -from getpass import getuser from tempfile import gettempdir from time import monotonic as time @@ -495,14 +494,12 @@ def server_create(): all_address = [( srv_config['ip'], srv_config['port'], (srv_config['backlog_main'] if 'backlog_main' in srv_config else srv_options['backlog']['def']), - (srv_config['reuse_main'] if 'reuse_main' in srv_config else False if getuser() == 'WDAGUtilityAccount' \ - else srv_options['reuse']['def']) + (srv_config['reuse_main'] if 'reuse_main' in srv_config else srv_options['reuse']['def']) )] log_address = "TCP server listening at %s on port %d" %(srv_config['ip'], srv_config['port']) if 'listen' in srv_config: for l, b, r in zip(srv_config['listen'], srv_config['backlog'], srv_config['reuse']): - r = (False if getuser() == 'WDAGUtilityAccount' else r) all_address.append(l + (b,) + (r,)) log_address += justify("at %s on port %d" %(l[0], l[1]), indent = 56) From 7350ba14baf397455224fc416b8c525513dab40c Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 9 Dec 2021 18:08:01 +0100 Subject: [PATCH 066/154] Silenced deprecated warning in Python 3.10 --- py-kms/pykms_Server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-kms/pykms_Server.py b/py-kms/pykms_Server.py index cb131ee..20066af 100755 --- a/py-kms/pykms_Server.py +++ b/py-kms/pykms_Server.py @@ -629,7 +629,7 @@ def finish(self): serverqueue = Queue.Queue(maxsize = 0) serverthread = server_thread(serverqueue, name = "Thread-Srv") -serverthread.setDaemon(True) +serverthread.daemon = True serverthread.start() if __name__ == "__main__": From 01fa14267933c3e165cc660604c24f434678f5b6 Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 9 Dec 2021 18:10:48 +0100 Subject: [PATCH 067/154] Updated Python version info --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3c0889..756e80d 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ This version of _py-kms_ is for itself a fork of the original implementation by - Microsoft Office 2016 ( Volume License ) - Microsoft Office 2019 ( Volume License ) - Microsoft Office 2021 ( Volume License ) - - It's written in Python (tested with Python 3.6.9). + - It's written in Python (tested with Python 3.10.1). - Supports execution by `Docker`, `systemd`, `Upstart` and many more... - Includes a GUI for simple managing. - Uses `sqlite` for persistent data storage. From c186432fcfa6146208d8c5fe096333b1fa90c3f1 Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 9 Dec 2021 18:13:21 +0100 Subject: [PATCH 068/154] Added Windows 11 to supported list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 756e80d..e23f874 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ This version of _py-kms_ is for itself a fork of the original implementation by - Windows 8.1 - Windows 10 ( 1511 / 1607 / 1703 / 1709 / 1803 / 1809 ) - Windows 10 ( 1903 / 1909 / 20H1, 20H2, 21H1 ) + - Windows 11 ( 21H2 ) - Windows Server 2008 - Windows Server 2008 R2 - Windows Server 2012 From 7935b092d476c95a60252ffcbd84d44ff28705ce Mon Sep 17 00:00:00 2001 From: arturolegovich <82318393+arturolegovich@users.noreply.github.com> Date: Fri, 10 Dec 2021 22:45:22 +0400 Subject: [PATCH 069/154] Added Windows 10 21H2 Added Windows 10 21H2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e23f874..a0d10a4 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ This version of _py-kms_ is for itself a fork of the original implementation by - Windows 8 - Windows 8.1 - Windows 10 ( 1511 / 1607 / 1703 / 1709 / 1803 / 1809 ) - - Windows 10 ( 1903 / 1909 / 20H1, 20H2, 21H1 ) + - Windows 10 ( 1903 / 1909 / 20H1, 20H2, 21H1, 21H2 ) - Windows 11 ( 21H2 ) - Windows Server 2008 - Windows Server 2008 R2 From 9c44b6e97e7de2119d8a79c9d436e178cee18d0c Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Tue, 14 Dec 2021 18:03:36 +0100 Subject: [PATCH 070/154] Added proper Windows 11 key names for #46 --- docs/Keys.md | 4 ++-- py-kms/KmsDataBase.xml | 50 +++++++++++++++++++++--------------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/docs/Keys.md b/docs/Keys.md index a4342ef..260d5e9 100644 --- a/docs/Keys.md +++ b/docs/Keys.md @@ -47,8 +47,8 @@ sometimes even reject it by itself (often due too many uses - in that case try t | Windows 10/11 Professional Workstation N | `9FNHH-K3HBT-3W4TD-6383H-6XYWF` | | Windows 10/11 Enterprise G | `YYVX9-NTFWV-6MDM3-9PT4T-4M68B` | | Windows 10/11 Enterprise G N | `44RPN-FTY23-9VTTB-MP9BX-T84FV` | -| Windows 10 Enterprise LTSC 2019 | `M7XTQ-FN8P6-TTKYV-9D4CC-J462D` | -| Windows 10 Enterprise LTSC 2019 N | `92NFX-8DJQP-P6BBQ-THF9C-7CG2H` | +| Windows 10 Enterprise LTSC 2019/2021 | `M7XTQ-FN8P6-TTKYV-9D4CC-J462D` | +| Windows 10 Enterprise LTSC 2019/2021 N | `92NFX-8DJQP-P6BBQ-THF9C-7CG2H` | | Windows 10/11 Remote Server | `7NBT4-WGBQX-MP4H7-QXFF8-YP3KX` | | Windows 10/11 Enterprise for Remote Sessions | `CPWHC-NT2C7-VYW78-DHDB2-PG3GK` | | Windows 10 S (Lean) | `NBTWJ-3DR69-3C4V8-C26MC-GQ9M6` | diff --git a/py-kms/KmsDataBase.xml b/py-kms/KmsDataBase.xml index 9b03291..7ddda6c 100644 --- a/py-kms/KmsDataBase.xml +++ b/py-kms/KmsDataBase.xml @@ -577,16 +577,16 @@ - - + + - - - + + + @@ -594,44 +594,44 @@ - - + + - + - + - + - - + + - + - + - + - - + + - - - - - - + + + + + + - - + + From b0b3a622d8b46c9e5c3b240a92203f26e3f89f64 Mon Sep 17 00:00:00 2001 From: Alexandr Chivarzin Date: Wed, 22 Dec 2021 16:07:53 +0300 Subject: [PATCH 071/154] Clarification of edition Enterprise multi-session Windows 10 Enterprise for remote Sessions (1803) and Windows 10 Enterprise for virtual desktops (1809+) are the same edition of Windows 10. In Windows 11, the edition was renamed to Windows 11 Enterprise multi-session. --- docs/Keys.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Keys.md b/docs/Keys.md index 260d5e9..9d8e71e 100644 --- a/docs/Keys.md +++ b/docs/Keys.md @@ -50,7 +50,7 @@ sometimes even reject it by itself (often due too many uses - in that case try t | Windows 10 Enterprise LTSC 2019/2021 | `M7XTQ-FN8P6-TTKYV-9D4CC-J462D` | | Windows 10 Enterprise LTSC 2019/2021 N | `92NFX-8DJQP-P6BBQ-THF9C-7CG2H` | | Windows 10/11 Remote Server | `7NBT4-WGBQX-MP4H7-QXFF8-YP3KX` | -| Windows 10/11 Enterprise for Remote Sessions | `CPWHC-NT2C7-VYW78-DHDB2-PG3GK` | +| Windows 10 Enterprise for Remote Sessions, Windows 10 Enterprise for virtual desktops and Windows 11 Enterprise multi-session | `CPWHC-NT2C7-VYW78-DHDB2-PG3GK` | | Windows 10 S (Lean) | `NBTWJ-3DR69-3C4V8-C26MC-GQ9M6` | | Windows 10/11 Professional | `W269N-WFGWX-YVC9B-4J6C9-T83GX` | | Windows 10/11 Professional N | `MH37W-N47XK-V7XM9-C7227-GCQG9`
`HMNWJ-V69R6-B2CDC-8P7VT-2373K` | From 8a7da2826e59428d19808b90596d9dadeb8e3a3d Mon Sep 17 00:00:00 2001 From: Alexandr Chivarzin Date: Wed, 22 Dec 2021 17:27:15 +0300 Subject: [PATCH 072/154] Improved readability Revisions for PG3GK key are now written on different lines, rather than on one. --- docs/Keys.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Keys.md b/docs/Keys.md index 9d8e71e..3790bfe 100644 --- a/docs/Keys.md +++ b/docs/Keys.md @@ -50,7 +50,7 @@ sometimes even reject it by itself (often due too many uses - in that case try t | Windows 10 Enterprise LTSC 2019/2021 | `M7XTQ-FN8P6-TTKYV-9D4CC-J462D` | | Windows 10 Enterprise LTSC 2019/2021 N | `92NFX-8DJQP-P6BBQ-THF9C-7CG2H` | | Windows 10/11 Remote Server | `7NBT4-WGBQX-MP4H7-QXFF8-YP3KX` | -| Windows 10 Enterprise for Remote Sessions, Windows 10 Enterprise for virtual desktops and Windows 11 Enterprise multi-session | `CPWHC-NT2C7-VYW78-DHDB2-PG3GK` | +| Windows 10 Enterprise for Remote Sessions
Windows 10 Enterprise for virtual desktops
Windows 11 Enterprise multi-session | `CPWHC-NT2C7-VYW78-DHDB2-PG3GK` | | Windows 10 S (Lean) | `NBTWJ-3DR69-3C4V8-C26MC-GQ9M6` | | Windows 10/11 Professional | `W269N-WFGWX-YVC9B-4J6C9-T83GX` | | Windows 10/11 Professional N | `MH37W-N47XK-V7XM9-C7227-GCQG9`
`HMNWJ-V69R6-B2CDC-8P7VT-2373K` | From bc3c504fe3a8e59672b8f4226877daf34fdc4a70 Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 23 Dec 2021 17:28:24 +0100 Subject: [PATCH 073/154] Corrected permissions on database file (and parent folder for #48) --- docker/entrypoint.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index cd4999a..53f05af 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -10,7 +10,7 @@ import sys PYTHON3 = '/usr/bin/python3' -dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db', 'pykms_database.db') +dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db') # Do not include the database file name, as we must correct the folder permissions (the db file is recursively reachable) log_level_bootstrap = log_level = os.getenv('LOGLEVEL', 'INFO') if log_level_bootstrap == "MININFO": log_level_bootstrap = "INFO" @@ -34,8 +34,13 @@ def change_uid_grp(): os.chown("/home/py-kms", new_uid, new_gid) os.chown("/usr/bin/start.py", new_uid, new_gid) if os.path.isfile(dbPath): - os.chown(dbPath, new_uid, new_gid) - loggersrv.debug("%s" %str(subprocess.check_output("ls -al " + dbPath, shell=True))) + # Corret permissions recursively, as to access the database file, also its parent folder must be accessible + for root, dirs, files in os.walk(dbPath): + for dName in dirs: + os.chown(os.path.join(root, dName), new_uid, new_gid) + for fName in files: + os.chown(os.path.join(root, fName), new_uid, new_gid) + loggersrv.debug(str(subprocess.check_output(['ls', '-la', dbPath]))) loggersrv.info("Setting gid to '%s'." % str(new_gid)) os.setgid(new_gid) From 05fdd33353d9b536e406b3c39d28678f1994b9b5 Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 23 Dec 2021 17:53:17 +0100 Subject: [PATCH 074/154] Added permission unlocker for log files --- docker/entrypoint.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 53f05af..589f13a 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -41,7 +41,10 @@ def change_uid_grp(): for fName in files: os.chown(os.path.join(root, fName), new_uid, new_gid) loggersrv.debug(str(subprocess.check_output(['ls', '-la', dbPath]))) - + if 'LOGFILE' in os.environ and os.path.exists(os.environ['LOGFILE']): + # Oh, the user also wants a custom log file -> make sure start.py can access it by setting the correct permissions (777) + os.chmod(os.environ['LOGFILE'], 777) + loggersrv.error(str(subprocess.check_output(['ls', '-la', os.environ['LOGFILE']]))) loggersrv.info("Setting gid to '%s'." % str(new_gid)) os.setgid(new_gid) From 81e616ddd12b9be7467ff027fe7edca367e9498e Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 23 Dec 2021 18:42:54 +0100 Subject: [PATCH 075/154] Proper failure if entry in database is not found --- py-kms/pykms_Client.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/py-kms/pykms_Client.py b/py-kms/pykms_Client.py index bd6d3ec..5a47fb7 100644 --- a/py-kms/pykms_Client.py +++ b/py-kms/pykms_Client.py @@ -156,18 +156,25 @@ def client_check(): def client_update(): kmsdb = kmsDB2Dict() + loggerclt.debug(f'Searching in kms database for machine "{clt_config["mode"]}"...') + appitems = kmsdb[2] for appitem in appitems: kmsitems = appitem['KmsItems'] for kmsitem in kmsitems: - name = re.sub('\(.*\)', '', kmsitem['DisplayName']).replace('2015', '').replace(' ', '') + name = re.sub('\(.*\)', '', kmsitem['DisplayName']) # Remove bracets + name = name.replace('2015', '') # Remove specific years + name = name.replace(' ', '') # Ignore whitespaces + name = name.replace('/11', '', 1) # Cut out Windows 11, as it is basically Windows 10 if name == clt_config['mode']: skuitems = kmsitem['SkuItems'] # Select 'Enterprise' for Windows or 'Professional Plus' for Office. for skuitem in skuitems: - if skuitem['DisplayName'].replace(' ','') == name + 'Enterprise' or \ - skuitem['DisplayName'].replace(' ','') == name[:6] + 'ProfessionalPlus' + name[6:]: - + sName = skuitem['DisplayName'] + sName = sName.replace(' ', '') # Ignore whitespaces + sName = sName.replace('/11', '', 1) # Cut out Windows 11, as it is basically Windows 10 + if sName == name + 'Enterprise' or \ + sName == name[:6] + 'ProfessionalPlus' + name[6:]: clt_config['KMSClientSkuID'] = skuitem['Id'] clt_config['RequiredClientCount'] = int(kmsitem['NCountPolicy']) clt_config['KMSProtocolMajorVersion'] = int(float(kmsitem['DefaultKmsProtocol'])) @@ -175,7 +182,8 @@ def client_update(): clt_config['KMSClientLicenseStatus'] = 2 clt_config['KMSClientAppID'] = appitem['Id'] clt_config['KMSClientKMSCountedID'] = kmsitem['Id'] - break + return + raise RuntimeError(f'Client failed to find machine configuration in kms database - make sure it contains an entry for "{clt_config["mode"]}"') def client_connect(): loggerclt.info("Connecting to %s on port %d" % (clt_config['ip'], clt_config['port'])) From cd07807a808cb1330a91c19d1898a26735fe3164 Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 23 Dec 2021 18:59:31 +0100 Subject: [PATCH 076/154] Added more debug logging & FINALLY corrected permission fixer --- docker/entrypoint.py | 18 ++++++++++++------ py-kms/pykms_Sql.py | 1 + 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 589f13a..1483579 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -33,14 +33,20 @@ def change_uid_grp(): new_uid = int(os.getenv('UID', str(uid))) os.chown("/home/py-kms", new_uid, new_gid) os.chown("/usr/bin/start.py", new_uid, new_gid) - if os.path.isfile(dbPath): + if os.path.isdir(dbPath): # Corret permissions recursively, as to access the database file, also its parent folder must be accessible - for root, dirs, files in os.walk(dbPath): - for dName in dirs: - os.chown(os.path.join(root, dName), new_uid, new_gid) + loggersrv.debug(f'Correcting owner permissions on {dbPath}.') + os.chown(dbPath, new_uid, new_gid) + for root, dirs, files in os.walk(dbPath): + for dName in dirs: + dPath = os.path.join(root, dName) + loggersrv.debug(f'Correcting owner permissions on {dPath}.') + os.chown(dPath, new_uid, new_gid) for fName in files: - os.chown(os.path.join(root, fName), new_uid, new_gid) - loggersrv.debug(str(subprocess.check_output(['ls', '-la', dbPath]))) + fPath = os.path.join(root, fName) + loggersrv.debug(f'Correcting owner permissions on {fPath}.') + os.chown(fPath, new_uid, new_gid) + loggersrv.debug(subprocess.check_output(['ls', '-la', dbPath]).decode()) if 'LOGFILE' in os.environ and os.path.exists(os.environ['LOGFILE']): # Oh, the user also wants a custom log file -> make sure start.py can access it by setting the correct permissions (777) os.chmod(os.environ['LOGFILE'], 777) diff --git a/py-kms/pykms_Sql.py b/py-kms/pykms_Sql.py index 1e8c47d..6afa889 100644 --- a/py-kms/pykms_Sql.py +++ b/py-kms/pykms_Sql.py @@ -18,6 +18,7 @@ def sql_initialize(dbName): if not os.path.isfile(dbName): # Initialize the database. + loggersrv.debug(f'Initializing database file "{dbName}"...') con = None try: con = sqlite3.connect(dbName) From 882eeb8dce95b13a1b4e112993acc9f9f7bf493b Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 23 Dec 2021 19:02:04 +0100 Subject: [PATCH 077/154] Removed link to special file, as it does not work anyways --- docs/Getting Started.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/Getting Started.md b/docs/Getting Started.md index 7aa157c..2ad3ec8 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -52,7 +52,6 @@ services: - SQLITE=true - HWID=RANDOM - LOGLEVEL=INFO - - LOGFILE=/dev/stdout restart: always volumes: - ./db:/home/py-kms/db From feb6d798e62e8e434fa98b54bed2771aaad32a26 Mon Sep 17 00:00:00 2001 From: Simonmicro Date: Thu, 6 Jan 2022 17:14:40 +0100 Subject: [PATCH 078/154] Fixes #54 --- docker/entrypoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 1483579..30f51bb 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -49,7 +49,7 @@ def change_uid_grp(): loggersrv.debug(subprocess.check_output(['ls', '-la', dbPath]).decode()) if 'LOGFILE' in os.environ and os.path.exists(os.environ['LOGFILE']): # Oh, the user also wants a custom log file -> make sure start.py can access it by setting the correct permissions (777) - os.chmod(os.environ['LOGFILE'], 777) + os.chmod(os.environ['LOGFILE'], 0o777) loggersrv.error(str(subprocess.check_output(['ls', '-la', os.environ['LOGFILE']]))) loggersrv.info("Setting gid to '%s'." % str(new_gid)) os.setgid(new_gid) From 65e9808fc34c49a7905210c7e4b1a46e94dcbd6e Mon Sep 17 00:00:00 2001 From: Jacobite89 <52151591+Jacobite89@users.noreply.github.com> Date: Fri, 11 Feb 2022 09:43:24 +0100 Subject: [PATCH 079/154] Update Dockerfile --- docker/docker-py3-kms/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 9eba678..7633108 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -1,5 +1,5 @@ # Switch to the target image -FROM alpine:3.14 +FROM alpine:3.15 ENV IP 0.0.0.0 ENV PORT 1688 From fab7b507a8a727236cbd67be27b732c06d8a8516 Mon Sep 17 00:00:00 2001 From: Jacobite89 <52151591+Jacobite89@users.noreply.github.com> Date: Fri, 11 Feb 2022 09:44:15 +0100 Subject: [PATCH 080/154] Update Dockerfile --- docker/docker-py3-kms-minimal/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 7e0a6c2..abd7cfa 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -1,5 +1,5 @@ # This is a minimized version from docker/docker-py3-kms/Dockerfile without SQLite support to further reduce image size -FROM alpine:3.14 +FROM alpine:3.15 ENV IP 0.0.0.0 ENV PORT 1688 From 238af40309f141d385517c76f2ab4503d29849ab Mon Sep 17 00:00:00 2001 From: Klemen Mihevc <3218757+SoLoR1@users.noreply.github.com> Date: Sun, 3 Apr 2022 22:11:32 +0200 Subject: [PATCH 081/154] Allow multiple IPs in dovecot IP env variable --- docker/start.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docker/start.py b/docker/start.py index 5658235..807906c 100644 --- a/docker/start.py +++ b/docker/start.py @@ -27,7 +27,7 @@ if log_level_bootstrap == "MININFO": log_level_bootstrap = "INFO" log_file = os.environ.get('LOGFILE', 'STDOUT') -listen_ip = os.environ.get('IP', '0.0.0.0') +listen_ip = os.environ.get('IP', '0.0.0.0').split() listen_port = os.environ.get('PORT', '1688') sqlite_port = os.environ.get('SQLITE_PORT', '8080') @@ -35,7 +35,7 @@ def start_kms_client(): if not os.path.isfile(dbPath): # Start a dummy activation to ensure the database file is created - client_cmd = [PYTHON3, '-u', 'pykms_Client.py', listen_ip, listen_port, + client_cmd = [PYTHON3, '-u', 'pykms_Client.py', listen_ip[0], listen_port, '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218', '-V', log_level, '-F', log_file] if os.environ.get('LOGSIZE', '') != "": @@ -50,11 +50,16 @@ def start_kms_client(): def start_kms(): sqlite_process = None # Build the command to execute - command = [PYTHON3, '-u', 'pykms_Server.py', listen_ip, listen_port] + command = [PYTHON3, '-u', 'pykms_Server.py', listen_ip[0], listen_port] for (arg, env) in argumentVariableMapping.items(): if env in os.environ and os.environ.get(env) != '': command.append(arg) command.append(os.environ.get(env)) + if len(listen_ip) > 1: + command.append("connect") + for i in range(1,len(listen_ip)): + command.append("-n") + command.append(listen_ip[i] + "," + listen_port) if enableSQLITE: loggersrv.info("Storing database file to %s" % dbPath) @@ -69,7 +74,7 @@ def start_kms(): if enableSQLITE: time.sleep(5) # The server may take a while to start start_kms_client() - sqlite_cmd = [PYTHON3, '-u', '/home/sqlite_web/sqlite_web.py', '-H', listen_ip, '--read-only', '-x', + sqlite_cmd = [PYTHON3, '-u', '/home/sqlite_web/sqlite_web.py', '-H', listen_ip[0], '--read-only', '-x', dbPath, '-p', sqlite_port] loggersrv.debug("sqlite_cmd: %s" % (" ".join(str(x) for x in sqlite_cmd).strip())) From 7979f40e5e1b777eb07113e2ef0805345cdf83b3 Mon Sep 17 00:00:00 2001 From: Klemen Mihevc <3218757+SoLoR1@users.noreply.github.com> Date: Mon, 4 Apr 2022 21:51:50 +0200 Subject: [PATCH 082/154] Fix healthcheck to netcat to actual IP Since localhost usualy resolves in to 127.0.0.1/::1 in case we run custom ip it will fail, so lets fix that. --- docker/docker-py3-kms-minimal/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index abd7cfa..9d2b073 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -46,7 +46,7 @@ WORKDIR /home/py-kms EXPOSE ${PORT}/tcp -HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z localhost ${PORT} || exit 1 +HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z ${IP%% *} ${PORT} || exit 1 ENTRYPOINT ["/usr/bin/python3", "-u","/usr/bin/entrypoint.py"] CMD ["/usr/bin/start.py"] From 943a63d68f09f31d91d5316f018be43bad60fa9c Mon Sep 17 00:00:00 2001 From: Klemen Mihevc <3218757+SoLoR1@users.noreply.github.com> Date: Mon, 4 Apr 2022 21:54:46 +0200 Subject: [PATCH 083/154] Fix healthcheck to netcat to actual IP --- docker/docker-py3-kms/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 7633108..480328d 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -56,7 +56,7 @@ WORKDIR /home/py-kms EXPOSE ${PORT}/tcp EXPOSE 8080 -HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z localhost ${PORT} || exit 1 +HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z ${IP%% *} ${PORT} || exit 1 ENTRYPOINT [ "/usr/bin/python3","-u","/usr/bin/entrypoint.py" ] CMD ["/usr/bin/start.py"] From e7135b52990fc141827e9c40f5d04f8dd783a5ac Mon Sep 17 00:00:00 2001 From: martinsstuff Date: Sat, 9 Apr 2022 23:40:29 +0200 Subject: [PATCH 084/154] Correct "lcid" info & reorder for clarity --- docs/Usage.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/Usage.md b/docs/Usage.md index a0ab9d4..59674b4 100644 --- a/docs/Usage.md +++ b/docs/Usage.md @@ -17,7 +17,7 @@ Follows a list of usable parameters: Use _EPID_ as Windows _EPID_. If no _EPID_ is specified, a random one will be generated. -l or --lcid -> Do not randomize the locale ID part of the _EPID_ and use _LCID_ instead. +> Specify the _LCID_ part of the _EPID_. If an _EPID_ is manually specified, this setting is ignored. Default is 1033 (English - US). The Language Code Identifier (_LCID_) describes localizable information in Windows. This structure is used to identify specific languages for the purpose of customizing software for particular languages and cultures. For example, it can specify the way dates, @@ -26,10 +26,9 @@ The _LCID_ must be specified as a decimal number (example: 1049 for "Russian - R By default py-kms generates a valid locale ID but this may lead to a value which is unlikely to occur in your country. You may want to select the locale ID of your country instead. See [here](https://msdn.microsoft.com/en-us/library/cc233982.aspx) for a list of valid _LCIDs_. -If an _EPID_ is manually specified, this setting is ignored. Default is a fixed _LCID_ of 1033 (English - US). -w or --hwid -> Use specified _HWID_ for all products. +> Use specified _HWID_ for all products. Use `-w RANDOM` to generate a random HWID. Default is _364F463A8863D35F_. Hardware Identification is a security measure used by Microsoft upon the activation of the Windows operating system. As part of the Product Activation system, a unique HWID number is generated when the operating system is first installed. The _HWID_ identifies the hardware components that the system @@ -39,8 +38,7 @@ to make sure that the operating system is still running on the same device. If the two _HWID_ numbers differ too much then the operating system will shut down until Microsoft reactivates the product. The theory behind _HWID_ is to ensure that the operating system is not being used on any device other than the one for which it was purchased and registered. -HWID must be an 16-character string of hex characters that are interpreted as a series of 8 bytes (big endian). -Default is _364F463A8863D35F_. To auto generate the _HWID_, type `-w RANDOM`. +HWID must be an 16-character string of hex characters that are interpreted as a series of 8 bytes (big endian). -c or --client-count > Use this flag to specify the current _CLIENTCOUNT_. Default is None. Remember that a number >=25 is From 805c234e33d5c49c66a07cefa006392f099fdb8a Mon Sep 17 00:00:00 2001 From: edgd1er Date: Thu, 14 Apr 2022 01:30:34 +0200 Subject: [PATCH 085/154] client: add -D to discover KMS server #51 --- py-kms/pykms_Client.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/py-kms/pykms_Client.py b/py-kms/pykms_Client.py index 5a47fb7..b203a6f 100644 --- a/py-kms/pykms_Client.py +++ b/py-kms/pykms_Client.py @@ -13,7 +13,13 @@ import os import threading -import pykms_RpcBind, pykms_RpcRequest +import dns.message +import dns.rdataclass +import dns.rdatatype +import dns.query +import dns.resolver + +import pykms_RpcBind, pykms_RpcRequest from pykms_Filetimes import dt_to_filetime from pykms_Dcerpc import MSRPCHeader, MSRPCBindNak, MSRPCRequestHeader, MSRPCRespHeader from pykms_Base import kmsBase, UUID @@ -72,6 +78,7 @@ def run(self): Use \"STDOUTOFF\" to disable stdout messages. Use \"FILEOFF\" if you not want to create logfile.', 'def' : os.path.join('.', 'pykms_logclient.log'), 'des' : "logfile"}, 'lsize' : {'help' : 'Use this flag to set a maximum size (in MB) to the output log file. Deactivated by default.', 'def' : 0, 'des': "logsize"}, + 'discovery' : {'help': 'ask the client to perform a _vlmcs._tcp.domain.tld DNS request to set KMS server.', 'def': None , 'des': 'discovery' }, } def client_options(): @@ -99,6 +106,8 @@ def client_options(): default = clt_options['lfile']['def'], help = clt_options['lfile']['help'], type = str) client_parser.add_argument("-S", "--logsize", dest = clt_options['lsize']['des'], action = "store", default = clt_options['lsize']['def'], help = clt_options['lsize']['help'], type = float) + client_parser.add_argument("-D", "--discovery", dest = clt_options['discovery']['des'], action = "store", + default = clt_options['discovery']['def'], help = clt_options['discovery']['help'], type = str) client_parser.add_argument("-h", "--help", action = "help", help = "show this help message and exit") @@ -186,6 +195,15 @@ def client_update(): raise RuntimeError(f'Client failed to find machine configuration in kms database - make sure it contains an entry for "{clt_config["mode"]}"') def client_connect(): + + if clt_config['discovery'] is not None: + loggerclt.info(f'Using Domain: {clt_config["discovery"]}') + r = dns.resolver.query('_vlmcs._tcp.' + clt_config['discovery'], dns.rdatatype.SRV) + for a in r: + loggerclt.debug(f'answer KMS server: {a.target} , port: {a.port}') + clt_config['ip'] = socket.gethostbyname(r[0].target.to_text()) + clt_config['port'] = r[0].port + loggerclt.info("Connecting to %s on port %d" % (clt_config['ip'], clt_config['port'])) try: clt_sock = socket.create_connection((clt_config['ip'], clt_config['port']), timeout = clt_config['timeoutidle']) From ddb99ddc1ea18d3ccbdfda392f14d5c5d0d96227 Mon Sep 17 00:00:00 2001 From: edgd1er Date: Thu, 14 Apr 2022 01:48:06 +0200 Subject: [PATCH 086/154] add dnspython to docker image, add doc. #51 --- docker/docker-py3-kms-minimal/Dockerfile | 4 ++-- docker/docker-py3-kms/Dockerfile | 4 ++-- docs/Usage.md | 6 ++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 9d2b073..579e4ba 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -14,7 +14,7 @@ ENV LOGFILE STDOUT ENV LOGSIZE "" COPY ./py-kms /home/py-kms - +#hadolint ignore=DL3013,DL3018 RUN apk add --no-cache --update \ bash \ git \ @@ -28,7 +28,7 @@ RUN apk add --no-cache --update \ shadow \ netcat-openbsd \ build-base python3-dev \ - && pip3 install --no-cache peewee tzlocal pytz wheel \ + && pip3 install --no-cache-dir peewee tzlocal pytz wheel dnspython \ && apk del git build-base python3-dev \ && addgroup power_users \ && adduser -S py-kms -G users -s /bin/bash \ diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 480328d..2a8689d 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -36,7 +36,7 @@ RUN apk add --no-cache --update \ && git clone --branch master --depth 1 https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web \ && mv /tmp/sqlite_web/sqlite_web /home/ \ && rm -rf /tmp/sqlite_web \ - && pip3 install --no-cache-dir peewee tzlocal pytz pysqlite3 wheel \ + && pip3 install --no-cache-dir peewee tzlocal pytz pysqlite3 wheel dnspython \ && apk del git build-base python3-dev \ && mkdir /db/ \ && addgroup power_users \ @@ -52,7 +52,7 @@ COPY docker/start.py /usr/bin/start.py RUN chmod 755 /usr/bin/entrypoint.py WORKDIR /home/py-kms -#USER py-kms + EXPOSE ${PORT}/tcp EXPOSE 8080 diff --git a/docs/Usage.md b/docs/Usage.md index 59674b4..ab69d66 100644 --- a/docs/Usage.md +++ b/docs/Usage.md @@ -143,6 +143,12 @@ user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py -V DEBUG user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG ``` +If you wish to get KMS server from DNS server: (ie perform a DNS resolution on _vlmcs._tcp.domain.tld). If ever there are several answers, only the first one is selected. +``` +user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py -V DEBUG -F STDOUT -D contoso.com +user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG -F STDOUT -D contoso.com +``` + Or if you want better specify: ``` user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py 1688 -V DEBUG From c74a64cc6722cfcdb72ee347cfe859a502b583d6 Mon Sep 17 00:00:00 2001 From: edgd1er Date: Thu, 14 Apr 2022 07:44:08 +0200 Subject: [PATCH 087/154] client: handle dns exceptions #51 --- docs/Usage.md | 4 ++-- py-kms/pykms_Client.py | 16 +++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/Usage.md b/docs/Usage.md index ab69d66..2c26824 100644 --- a/docs/Usage.md +++ b/docs/Usage.md @@ -143,9 +143,9 @@ user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py -V DEBUG user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG ``` -If you wish to get KMS server from DNS server: (ie perform a DNS resolution on _vlmcs._tcp.domain.tld). If ever there are several answers, only the first one is selected. +If you wish to get KMS server from DNS server: (ie perform a DNS resolution on _vlmcs._tcp.domain.tld, if ever there are several answers, only the first one is selected.) ``` -user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py -V DEBUG -F STDOUT -D contoso.com +user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG -F STDOUT -D contoso.com user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG -F STDOUT -D contoso.com ``` diff --git a/py-kms/pykms_Client.py b/py-kms/pykms_Client.py index b203a6f..109f83a 100644 --- a/py-kms/pykms_Client.py +++ b/py-kms/pykms_Client.py @@ -198,11 +198,17 @@ def client_connect(): if clt_config['discovery'] is not None: loggerclt.info(f'Using Domain: {clt_config["discovery"]}') - r = dns.resolver.query('_vlmcs._tcp.' + clt_config['discovery'], dns.rdatatype.SRV) - for a in r: - loggerclt.debug(f'answer KMS server: {a.target} , port: {a.port}') - clt_config['ip'] = socket.gethostbyname(r[0].target.to_text()) - clt_config['port'] = r[0].port + r= None + try: + r = dns.resolver.resolve('_vlmcs._tcp.' + clt_config['discovery'], dns.rdatatype.SRV) + for a in r: + loggerclt.debug(f'answer KMS server: {a.target} , port: {a.port}') + clt_config['ip'] = socket.gethostbyname(r[0].target.to_text()) + clt_config['port'] = r[0].port + except (dns.exception.Timeout, dns.resolver.NXDOMAIN) as e: + pretty_printer(log_obj = loggerclt.warning, + put_text = "{reverse}{red}{bold}Cannot resolve '%s'. Error: '%s'...{end}" %(clt_config['discovery'], + str(e))) loggerclt.info("Connecting to %s on port %d" % (clt_config['ip'], clt_config['port'])) try: From 248c144e7acd37fbea31e5d7e1cffa5fbd0e4196 Mon Sep 17 00:00:00 2001 From: edgd1er Date: Fri, 15 Apr 2022 22:47:09 +0200 Subject: [PATCH 088/154] client: request #51 add automatic discovery. changes after review. --- docker/docker-py3-kms-minimal/Dockerfile | 2 +- docker/docker-py3-kms/Dockerfile | 2 +- docs/Usage.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 579e4ba..dc6b54b 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -14,7 +14,7 @@ ENV LOGFILE STDOUT ENV LOGSIZE "" COPY ./py-kms /home/py-kms -#hadolint ignore=DL3013,DL3018 + RUN apk add --no-cache --update \ bash \ git \ diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 2a8689d..4075466 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -17,7 +17,7 @@ ENV LOGSIZE "" ENV TZ America/Chicago COPY py-kms /home/py-kms/ -#hadolint ignore=DL3013,DL3018 + RUN apk add --no-cache --update \ bash \ git \ diff --git a/docs/Usage.md b/docs/Usage.md index 2c26824..0a14598 100644 --- a/docs/Usage.md +++ b/docs/Usage.md @@ -143,7 +143,7 @@ user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py -V DEBUG user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG ``` -If you wish to get KMS server from DNS server: (ie perform a DNS resolution on _vlmcs._tcp.domain.tld, if ever there are several answers, only the first one is selected.) +If you wish to get KMS server from DNS server: (ie perform a DNS resolution on _vlmcs._tcp.domain.tld, if ever there are several answers, only the first one is selected.). Althought that mode is supposed to be specific to devices connect to an Active Directory domain, setting a fully qualified name and a workgroup may help to use that automatic KMS discovery feature. ``` user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG -F STDOUT -D contoso.com user@host ~/path/to/folder/py-kms $ python3 pykms_Client.py -V DEBUG -F STDOUT -D contoso.com From 5d13d098517c580d59cc09d9fa44bad8b6be3be4 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Thu, 12 May 2022 13:55:20 +0200 Subject: [PATCH 089/154] Removed useless CMD statement (entrypoint does not even respect that) --- docker/docker-py3-kms-minimal/Dockerfile | 3 +-- docker/docker-py3-kms/Dockerfile | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index dc6b54b..b8b2f3e 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -48,5 +48,4 @@ EXPOSE ${PORT}/tcp HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z ${IP%% *} ${PORT} || exit 1 -ENTRYPOINT ["/usr/bin/python3", "-u","/usr/bin/entrypoint.py"] -CMD ["/usr/bin/start.py"] +ENTRYPOINT ["/usr/bin/python3", "-u", "/usr/bin/entrypoint.py"] diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 4075466..75630b0 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -58,5 +58,4 @@ EXPOSE 8080 HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z ${IP%% *} ${PORT} || exit 1 -ENTRYPOINT [ "/usr/bin/python3","-u","/usr/bin/entrypoint.py" ] -CMD ["/usr/bin/start.py"] +ENTRYPOINT [ "/usr/bin/python3", "-u", "/usr/bin/entrypoint.py" ] From c216e50dad89d8c961304778beb5e8ca4bf11752 Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Thu, 12 May 2022 14:07:26 +0200 Subject: [PATCH 090/154] Implemented graceful shutdown --- docker/entrypoint.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 30f51bb..25fef14 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -8,6 +8,7 @@ import pwd import subprocess import sys +import signal PYTHON3 = '/usr/bin/python3' dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db') # Do not include the database file name, as we must correct the folder permissions (the db file is recursively reachable) @@ -69,9 +70,13 @@ def change_tz(): f.write(tz) f.close() - # Main if (__name__ == "__main__"): loggersrv.info("Log level: %s" % log_level) change_tz() - subprocess.call(PYTHON3 + " -u /usr/bin/start.py", preexec_fn=change_uid_grp(), shell=True) + childProcess = subprocess.Popen(PYTHON3 + " -u /usr/bin/start.py", preexec_fn=change_uid_grp(), shell=True) + def shutdown(signum, frame): + loggersrv.info("Received signal %s, shutting down..." % signum) + childProcess.terminate() # This will also cause communicate() from below to continue + signal.signal(signal.SIGTERM, shutdown) # This signal will be sent by Docker to request shutdown + childProcess.communicate() From 90b4af2627b623a9ba2f7790d877fabf1075c133 Mon Sep 17 00:00:00 2001 From: edgd1er Date: Fri, 22 Apr 2022 23:41:55 +0200 Subject: [PATCH 091/154] move requirements from Dockerfile to txt file. #67 import sqlite_web as package change tz through python conditionnal import for sqlite_web --- docker/docker-py3-kms-minimal/Dockerfile | 22 +++++++++------------- docker/docker-py3-kms/Dockerfile | 20 +++++++------------- docker/entrypoint.py | 10 +++++----- docker/requirements.txt | 6 ++++++ docker/requirements_minimal.txt | 5 +++++ docker/start.py | 10 +++++++--- 6 files changed, 39 insertions(+), 34 deletions(-) create mode 100644 docker/requirements.txt create mode 100644 docker/requirements_minimal.txt diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index b8b2f3e..a4483d9 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -12,27 +12,23 @@ ENV HWID RANDOM ENV LOGLEVEL INFO ENV LOGFILE STDOUT ENV LOGSIZE "" +ENV TYPE MINIMAL COPY ./py-kms /home/py-kms - +COPY docker/requirements_minimal.txt /home/py-kms/requirements.txt RUN apk add --no-cache --update \ - bash \ - git \ - py3-argparse \ - py3-flask \ - py3-pygments \ - python3-tkinter \ - sqlite-libs \ +bash \ + python3 \ py3-pip \ - tzdata \ + python3-tkinter \ + ca-certificates \ shadow \ + tzdata \ netcat-openbsd \ - build-base python3-dev \ - && pip3 install --no-cache-dir peewee tzlocal pytz wheel dnspython \ - && apk del git build-base python3-dev \ + && pip3 install --no-cache-dir -r /home/py-kms/requirements.txt \ && addgroup power_users \ && adduser -S py-kms -G users -s /bin/bash \ - && usermod -a -G power_users py-kms \ + && usermod -aG power_users py-kms \ && chown py-kms:users /home/py-kms \ # Fix undefined timezone, in case the user did not mount the /etc/localtime && ln -sf /usr/share/zoneinfo/UTC /etc/localtime diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 75630b0..501da5b 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -17,32 +17,26 @@ ENV LOGSIZE "" ENV TZ America/Chicago COPY py-kms /home/py-kms/ - +COPY docker/requirements.txt /home/py-kms/ RUN apk add --no-cache --update \ bash \ - git \ python3 \ - py3-argparse \ - py3-flask \ - py3-pygments \ + py3-pip \ python3-tkinter \ sqlite-libs \ - py3-pip \ - build-base python3-dev \ ca-certificates \ tzdata \ shadow \ + sudo \ netcat-openbsd \ - && git clone --branch master --depth 1 https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web \ - && mv /tmp/sqlite_web/sqlite_web /home/ \ - && rm -rf /tmp/sqlite_web \ - && pip3 install --no-cache-dir peewee tzlocal pytz pysqlite3 wheel dnspython \ - && apk del git build-base python3-dev \ + && pip3 install --no-cache-dir -r /home/py-kms/requirements.txt \ + #&& apk del git build-base python3-dev \ && mkdir /db/ \ && addgroup power_users \ && adduser -S py-kms -G users -s /bin/bash \ - && usermod -a -G power_users py-kms \ + && usermod -aG power_users py-kms \ && chown py-kms:users /home/py-kms \ + && echo "py-kms ALL= NOPASSWD: /bin/usermod -u py-kms *" >/etc/sudoers.d/py-kms \ # Fix undefined timezone, in case the user did not mount the /etc/localtime && ln -sf /usr/share/zoneinfo/UTC /etc/localtime diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 25fef14..575e32c 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -9,6 +9,7 @@ import subprocess import sys import signal +import time PYTHON3 = '/usr/bin/python3' dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db') # Do not include the database file name, as we must correct the folder permissions (the db file is recursively reachable) @@ -26,6 +27,9 @@ def change_uid_grp(): + if os.geteuid() != 0: + loggersrv.info(f'not root user, cannot change uid/gid.') + return None user_db_entries = pwd.getpwnam("py-kms") user_grp_db_entries = grp.getgrnam("power_users") uid = int(user_db_entries.pw_uid) @@ -64,11 +68,7 @@ def change_tz(): # TZ is not symlinked and defined TZ exists if tz not in os.readlink('/etc/localtime') and os.path.isfile('/usr/share/zoneinfo/' + tz): loggersrv.info("Setting timzeone to %s" % tz ) - os.remove('/etc/localtime') - os.symlink(os.path.join('/usr/share/zoneinfo/', tz), '/etc/localtime') - f = open("/etc/timezone", "w") - f.write(tz) - f.close() + time.tzset() # Main if (__name__ == "__main__"): diff --git a/docker/requirements.txt b/docker/requirements.txt new file mode 100644 index 0000000..f5b6c76 --- /dev/null +++ b/docker/requirements.txt @@ -0,0 +1,6 @@ +argparse +flask +pygments +dnspython +tzlocal +sqlite-web \ No newline at end of file diff --git a/docker/requirements_minimal.txt b/docker/requirements_minimal.txt new file mode 100644 index 0000000..1edfc1c --- /dev/null +++ b/docker/requirements_minimal.txt @@ -0,0 +1,5 @@ +argparse +flask +pygments +dnspython +tzlocal \ No newline at end of file diff --git a/docker/start.py b/docker/start.py index 807906c..90de633 100644 --- a/docker/start.py +++ b/docker/start.py @@ -21,7 +21,8 @@ } sqliteWebPath = '/home/sqlite_web/sqlite_web.py' -enableSQLITE = os.path.isfile(sqliteWebPath) and os.environ.get('SQLITE', 'false').lower() == 'true' +enableSQLITE = os.environ.get('SQLITE', 'false').lower() == 'true' +enableSQLITE = os.getenv('TYPE') != 'MINIMAL' dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db', 'pykms_database.db') log_level_bootstrap = log_level = os.getenv('LOGLEVEL', 'INFO') if log_level_bootstrap == "MININFO": @@ -57,7 +58,7 @@ def start_kms(): command.append(os.environ.get(env)) if len(listen_ip) > 1: command.append("connect") - for i in range(1,len(listen_ip)): + for i in range(1, len(listen_ip)): command.append("-n") command.append(listen_ip[i] + "," + listen_port) @@ -74,7 +75,7 @@ def start_kms(): if enableSQLITE: time.sleep(5) # The server may take a while to start start_kms_client() - sqlite_cmd = [PYTHON3, '-u', '/home/sqlite_web/sqlite_web.py', '-H', listen_ip[0], '--read-only', '-x', + sqlite_cmd = ['sqlite_web', '-H', listen_ip[0], '--read-only', '-x', dbPath, '-p', sqlite_port] loggersrv.debug("sqlite_cmd: %s" % (" ".join(str(x) for x in sqlite_cmd).strip())) @@ -95,6 +96,9 @@ def start_kms(): # Main if (__name__ == "__main__"): + # Do not import for minimal + if os.getenv('TYPE', '') != "MINIMAL": + import sqlite_web loggersrv = logging.getLogger('logsrv') loggersrv.setLevel(log_level_bootstrap) streamhandler = logging.StreamHandler(sys.stdout) From 17bc78f53431ae026b33e46bee2bce67b17de665 Mon Sep 17 00:00:00 2001 From: edgd1er Date: Mon, 2 May 2022 20:39:21 +0200 Subject: [PATCH 092/154] add versions, removed sudo, powerusers group, --- docker/docker-py3-kms-minimal/Dockerfile | 2 -- docker/docker-py3-kms/Dockerfile | 4 ---- docker/entrypoint.py | 6 ++++-- docker/requirements.txt | 11 +++++------ docker/requirements_minimal.txt | 9 ++++----- docker/start.py | 6 +++--- 6 files changed, 16 insertions(+), 22 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index a4483d9..7000606 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -26,9 +26,7 @@ bash \ tzdata \ netcat-openbsd \ && pip3 install --no-cache-dir -r /home/py-kms/requirements.txt \ - && addgroup power_users \ && adduser -S py-kms -G users -s /bin/bash \ - && usermod -aG power_users py-kms \ && chown py-kms:users /home/py-kms \ # Fix undefined timezone, in case the user did not mount the /etc/localtime && ln -sf /usr/share/zoneinfo/UTC /etc/localtime diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 501da5b..a2f4c27 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -27,16 +27,12 @@ RUN apk add --no-cache --update \ ca-certificates \ tzdata \ shadow \ - sudo \ netcat-openbsd \ && pip3 install --no-cache-dir -r /home/py-kms/requirements.txt \ #&& apk del git build-base python3-dev \ && mkdir /db/ \ - && addgroup power_users \ && adduser -S py-kms -G users -s /bin/bash \ - && usermod -aG power_users py-kms \ && chown py-kms:users /home/py-kms \ - && echo "py-kms ALL= NOPASSWD: /bin/usermod -u py-kms *" >/etc/sudoers.d/py-kms \ # Fix undefined timezone, in case the user did not mount the /etc/localtime && ln -sf /usr/share/zoneinfo/UTC /etc/localtime diff --git a/docker/entrypoint.py b/docker/entrypoint.py index 575e32c..34a7e9a 100755 --- a/docker/entrypoint.py +++ b/docker/entrypoint.py @@ -31,7 +31,7 @@ def change_uid_grp(): loggersrv.info(f'not root user, cannot change uid/gid.') return None user_db_entries = pwd.getpwnam("py-kms") - user_grp_db_entries = grp.getgrnam("power_users") + user_grp_db_entries = grp.getgrnam("users") uid = int(user_db_entries.pw_uid) gid = int(user_grp_db_entries.gr_gid) new_gid = int(os.getenv('GID', str(gid))) @@ -66,13 +66,15 @@ def change_uid_grp(): def change_tz(): tz = os.getenv('TZ', 'etc/UTC') # TZ is not symlinked and defined TZ exists - if tz not in os.readlink('/etc/localtime') and os.path.isfile('/usr/share/zoneinfo/' + tz): + if tz not in os.readlink('/etc/localtime') and os.path.isfile('/usr/share/zoneinfo/' + tz) and hasattr(time, 'tzset'): loggersrv.info("Setting timzeone to %s" % tz ) + # time.tzet() should be called on Unix, but doesn't exist on Windows. time.tzset() # Main if (__name__ == "__main__"): loggersrv.info("Log level: %s" % log_level) + loggersrv.debug("user id: %s" % os.getuid()) change_tz() childProcess = subprocess.Popen(PYTHON3 + " -u /usr/bin/start.py", preexec_fn=change_uid_grp(), shell=True) def shutdown(signum, frame): diff --git a/docker/requirements.txt b/docker/requirements.txt index f5b6c76..bad41ef 100644 --- a/docker/requirements.txt +++ b/docker/requirements.txt @@ -1,6 +1,5 @@ -argparse -flask -pygments -dnspython -tzlocal -sqlite-web \ No newline at end of file +Flask==2.1.2 +Pygments==2.12.0 +dnspython==2.2.1 +tzlocal==4.2 +sqlite-web==0.4.0 \ No newline at end of file diff --git a/docker/requirements_minimal.txt b/docker/requirements_minimal.txt index 1edfc1c..509c137 100644 --- a/docker/requirements_minimal.txt +++ b/docker/requirements_minimal.txt @@ -1,5 +1,4 @@ -argparse -flask -pygments -dnspython -tzlocal \ No newline at end of file +Flask==2.1.2 +Pygments==2.12.0 +dnspython==2.2.1 +tzlocal==4.2 \ No newline at end of file diff --git a/docker/start.py b/docker/start.py index 90de633..84463ba 100644 --- a/docker/start.py +++ b/docker/start.py @@ -21,10 +21,9 @@ } sqliteWebPath = '/home/sqlite_web/sqlite_web.py' -enableSQLITE = os.environ.get('SQLITE', 'false').lower() == 'true' -enableSQLITE = os.getenv('TYPE') != 'MINIMAL' +enableSQLITE = os.environ.get('SQLITE', 'false').lower() == 'true' and os.environ.get('TYPE') != 'MINIMAL' dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db', 'pykms_database.db') -log_level_bootstrap = log_level = os.getenv('LOGLEVEL', 'INFO') +log_level_bootstrap = log_level = os.environ.get('LOGLEVEL', 'INFO') if log_level_bootstrap == "MININFO": log_level_bootstrap = "INFO" log_file = os.environ.get('LOGFILE', 'STDOUT') @@ -107,4 +106,5 @@ def start_kms(): datefmt='%a, %d %b %Y %H:%M:%S') streamhandler.setFormatter(formatter) loggersrv.addHandler(streamhandler) + loggersrv.debug("user id: %s" % os.getuid()) start_kms() From 6e5ad3c00bec607d1d263b878a3c9dba12f9cdc0 Mon Sep 17 00:00:00 2001 From: edgd1er Date: Fri, 13 May 2022 07:12:19 +0200 Subject: [PATCH 093/154] remove unused import --- docker/start.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/docker/start.py b/docker/start.py index 84463ba..591ed02 100644 --- a/docker/start.py +++ b/docker/start.py @@ -95,9 +95,6 @@ def start_kms(): # Main if (__name__ == "__main__"): - # Do not import for minimal - if os.getenv('TYPE', '') != "MINIMAL": - import sqlite_web loggersrv = logging.getLogger('logsrv') loggersrv.setLevel(log_level_bootstrap) streamhandler = logging.StreamHandler(sys.stdout) From ffc1bf61f5018bbdf0034f303afe90448dbe70d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zhaofeng=20Yang=20=28=E6=A5=8A=E8=82=87=E5=B3=B0=29?= Date: Tue, 12 Jul 2022 17:05:43 +0800 Subject: [PATCH 094/154] Do not run py-kms on the same machine to activate --- docs/Troubleshooting.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Troubleshooting.md b/docs/Troubleshooting.md index 0cc4805..3d5efae 100644 --- a/docs/Troubleshooting.md +++ b/docs/Troubleshooting.md @@ -6,6 +6,7 @@ If you not follow this, do not expect that we can or want to help you! * Are you activating a legit Windows copy checked with `sha256`, `md5` or is it maybe a warez torrent version ? * Did you tried a clean installation (format all) ? You skipped entering any key during installation, turning off internet connection, first activating and then updating Windows (and eventually later upgrading) ? +* Are you activating Windows or Office on a different machine (physical or virtual) where py-kms runs? * Have you installed all latest packages ? Especially before upgrading ? Are you upgrading using the "Update Assistant"/"Media Creation" tool to switch from Windows 7 / 8 / 8.1 to 10 (for me has always worked) ? * If isn't a clean install, so far as you have kept activated your Windows copy ? Have you used some other activator (maybe not trusted) that injects or changes .dll files and therefore may have corrupted something ? * Have you forgot to reactivate at least once before 180 (45 or 30, depending on your version) days ? From 9d4d8b66b13db2756ea9a0958d885194fda1f0c1 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Sun, 6 Nov 2022 15:22:50 +0100 Subject: [PATCH 095/154] Added workaround from #76 See #76 --- docs/Getting Started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Getting Started.md b/docs/Getting Started.md index 2ad3ec8..a9c6628 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -174,7 +174,7 @@ They might be useful to you: - Installation example on Ubuntu / Mint: - `sudo apt-get update` - `sudo apt-get install python3-tk python3-pip` - - `sudo pip3 install tzlocal pysqlite3` + - `sudo pip3 install tzlocal pysqlite3` (on Ubuntu Server 22, you'll need `pysqlite3-binary` - see [this issue](https://github.com/Py-KMS-Organization/py-kms/issues/76)) ### Startup A Linux user with `ip addr` command can get his KMS IP (Windows users can try `ipconfig /all`). From 01ad610e8e001b551936d051c8e12d8f68156066 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 25 Nov 2022 17:11:49 +0100 Subject: [PATCH 096/154] Added useage note and removed old badge --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a0d10a4..e4a479d 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,12 @@ ![repo-size](https://img.shields.io/github/repo-size/Py-KMS-Organization/py-kms) ![open-issues](https://img.shields.io/github/issues/Py-KMS-Organization/py-kms) ![last-commit](https://img.shields.io/github/last-commit/Py-KMS-Organization/py-kms/master) -![docker-status](https://img.shields.io/docker/cloud/build/pykmsorg/py-kms) ![docker-pulls](https://img.shields.io/docker/pulls/pykmsorg/py-kms) ![read-the-docs](https://img.shields.io/readthedocs/py-kms) *** +_Keep in mind that this project is not intended for production use. Feel free to use it to test your own systems or maybe even learn something from the protocol structure. :)_ + ## History _py-kms_ is a port of node-kms created by [cyrozap](http://forums.mydigitallife.info/members/183074-markedsword), which is a port of either the C#, C++, or .NET implementations of KMS Emulator. The original version was written by [CODYQX4](http://forums.mydigitallife.info/members/89933-CODYQX4) and is derived from the reverse-engineered code of Microsoft's official KMS. This version of _py-kms_ is for itself a fork of the original implementation by [SystemRage](https://github.com/SystemRage/py-kms), which was abandoned early 2021. From 537f7a75ab5da578b6e2d698bbe9b1895d301773 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 25 Nov 2022 17:16:19 +0100 Subject: [PATCH 097/154] Added missing package --- docs/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index a42efae..322d350 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,3 +2,4 @@ sphinx==3.4.3 sphinx_rtd_theme==0.5.1 readthedocs-sphinx-search==0.1.0 sphinx_markdown_tables==0.0.15 +recommonmark==0.7.1 From e8c2fb7e50ec64329c5a4ca28de3b1cdafaa7a2f Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 25 Nov 2022 17:26:10 +0100 Subject: [PATCH 098/154] Updated packages --- docs/requirements.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 322d350..866f6f5 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ -sphinx==3.4.3 -sphinx_rtd_theme==0.5.1 -readthedocs-sphinx-search==0.1.0 -sphinx_markdown_tables==0.0.15 +Sphinx==5.3.0 +sphinx-rtd-theme==1.1.1 +readthedocs-sphinx-search==0.1.2 +sphinx-markdown-tables==0.0.17 recommonmark==0.7.1 From d8c1d75be1f2dcf0d932d2ce6bab5530eccf1678 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Wed, 7 Dec 2022 11:42:05 +0100 Subject: [PATCH 099/154] Migrated to use "::" by default for #71 --- README.md | 2 +- charts/py-kms/README.md | 2 +- charts/py-kms/values.yaml | 2 +- docker/docker-py3-kms-minimal/Dockerfile | 2 +- docker/docker-py3-kms/Dockerfile | 2 +- docker/start.py | 2 +- docs/Getting Started.md | 6 +++--- docs/Usage.md | 20 ++++++++++---------- py-kms/pykms_Client.py | 2 +- py-kms/pykms_Server.py | 2 +- 10 files changed, 21 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index e4a479d..da78b78 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ This version of _py-kms_ is for itself a fork of the original implementation by The wiki has been completly reworked and is now available on [readthedocs.com](https://py-kms.readthedocs.io/en/latest/). It should you provide all necessary information how to setup and to use _py-kms_ , all without clumping this readme. The documentation also houses more details about activation with _py-kms_ and how to get GVLK keys. ## Quick start -- To start the server, execute `python3 pykms_Server.py [IPADDRESS] [PORT]`, the default _IPADDRESS_ is `0.0.0.0` ( all interfaces ) and the default _PORT_ is `1688`. Note that both the address and port are optional. It's allowed to use IPv4 and IPv6 addresses. If you have a IPv6-capable dual-stack OS, a dual-stack socket is created when using a IPv6 address. +- To start the server, execute `python3 pykms_Server.py [IPADDRESS] [PORT]`, the default _IPADDRESS_ is `::` ( all interfaces ) and the default _PORT_ is `1688`. Note that both the address and port are optional. It's allowed to use IPv4 and IPv6 addresses. If you have a IPv6-capable dual-stack OS, a dual-stack socket is created when using a IPv6 address. **In case your OS does not support IPv6, make sure to explicitly specify the legacy IPv4 of `0.0.0.0`!** - To start the server automatically using Docker, execute `docker run -d --name py-kms --restart always -p 1688:1688 ghcr.io/py-kms-organization/py-kms`. - To show the help pages type: `python3 pykms_Server.py -h` and `python3 pykms_Client.py -h`. - For launching _py-kms_ GUI make the file `pykms_Server.py` executable with `chmod +x /path/to/folder/py-kms/pykms_Server.py`, then simply run `pykms_Server.py` by double-clicking. diff --git a/charts/py-kms/README.md b/charts/py-kms/README.md index 00fd65d..cd8c8d3 100644 --- a/charts/py-kms/README.md +++ b/charts/py-kms/README.md @@ -44,7 +44,7 @@ For more information please refer to the Helm Install command documentation loca | podAnnotations | object | `{}` | | | podSecurityContext | object | `{}` | | | py-kms.environment.HWID | string | `"RANDOM"` | | -| py-kms.environment.IP | string | `"0.0.0.0"` | | +| py-kms.environment.IP | string | `"::"` | | | py-kms.environment.LOGLEVEL | string | `"INFO"` | | | py-kms.environment.LOGSIZE | int | `2` | | | py-kms.environment.SQLITE | bool | `true` | | diff --git a/charts/py-kms/values.yaml b/charts/py-kms/values.yaml index 4b03894..84e0cd1 100644 --- a/charts/py-kms/values.yaml +++ b/charts/py-kms/values.yaml @@ -21,7 +21,7 @@ py-kms: LOGFILE: /var/log/py-kms.log HWID: RANDOM SQLITE: true - IP: 0.0.0.0 + IP: '::' serviceAccount: {} # # Specifies whether a service account should be created diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 7000606..ff6199e 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -1,7 +1,7 @@ # This is a minimized version from docker/docker-py3-kms/Dockerfile without SQLite support to further reduce image size FROM alpine:3.15 -ENV IP 0.0.0.0 +ENV IP :: ENV PORT 1688 ENV EPID "" ENV LCID 1033 diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index a2f4c27..4b7dab0 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -1,7 +1,7 @@ # Switch to the target image FROM alpine:3.15 -ENV IP 0.0.0.0 +ENV IP :: ENV PORT 1688 ENV EPID "" ENV LCID 1033 diff --git a/docker/start.py b/docker/start.py index 591ed02..54f943e 100644 --- a/docker/start.py +++ b/docker/start.py @@ -27,7 +27,7 @@ if log_level_bootstrap == "MININFO": log_level_bootstrap = "INFO" log_file = os.environ.get('LOGFILE', 'STDOUT') -listen_ip = os.environ.get('IP', '0.0.0.0').split() +listen_ip = os.environ.get('IP', '::').split() listen_port = os.environ.get('PORT', '1688') sqlite_port = os.environ.get('SQLITE_PORT', '8080') diff --git a/docs/Getting Started.md b/docs/Getting Started.md index a9c6628..d83401b 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -48,7 +48,7 @@ services: - 1688:1688 - 8080:8080 environment: - - IP=0.0.0.0 + - IP='::' - SQLITE=true - HWID=RANDOM - LOGLEVEL=INFO @@ -84,7 +84,7 @@ Restart=always RestartSec=1 KillMode=process User=root -ExecStart=/usr/bin/python3 /py-kms/pykms_Server.py 0.0.0.0 1688 -V DEBUG -F /pykms_logserver.log +ExecStart=/usr/bin/python3 /py-kms/pykms_Server.py :: 1688 -V DEBUG -F /pykms_logserver.log [Install] WantedBy=multi-user.target @@ -107,7 +107,7 @@ env PYKMSPATH=/py-kms env LOGPATH=/pykms_logserver.log start on runlevel [2345] stop on runlevel [016] -exec $PYTHONPATH/python3 $PYKMSPATH/pykms_Server.py 0.0.0.0 1688 -V DEBUG -F $LOGPATH +exec $PYTHONPATH/python3 $PYKMSPATH/pykms_Server.py :: 1688 -V DEBUG -F $LOGPATH respawn ``` Check syntax with `sudo init-checkconf -d /etc/init/py3-kms.conf`, then reload upstart to recognise this process `sudo initctl reload-configuration`. Now start the service `sudo start py3-kms`, and you can see the logfile diff --git a/docs/Usage.md b/docs/Usage.md index 0a14598..289a3e6 100644 --- a/docs/Usage.md +++ b/docs/Usage.md @@ -7,7 +7,7 @@ Follows a list of usable parameters: ip -> Instructs py-kms to listen on _IPADDRESS_ (can be an hostname too). If this option is not specified, _IPADDRESS_ 0.0.0.0 is used. +> Instructs py-kms to listen on _IPADDRESS_ (can be an hostname too). If this option is not specified, _IPADDRESS_ `::` is used. port > Define TCP _PORT_ the KMS service is listening on. Default is 1688. @@ -75,7 +75,7 @@ user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py -V INFO ``` creates _pykms_logserver.log_ with these initial messages: ``` -Mon, 12 Jun 2017 22:09:00 INFO TCP server listening at 0.0.0.0 on port 1688. +Mon, 12 Jun 2017 22:09:00 INFO TCP server listening at :: on port 1688. Mon, 12 Jun 2017 22:09:00 INFO HWID: 364F463A8863D35F ``` @@ -125,14 +125,14 @@ examples (with fictitious addresses and ports): | command | address (main) | backlog (main) | reuse port (main) | address (listen) | backlog (listen) | reuse port (listen) | dualstack (main / listen) | | --- | --- | --- | --- | --- | --- | --- | --- | -| `python3 pykms_Server.py connect -b 12` | ('0.0.0.0', 1688) | 12 | True | [] | [] | [] | False | +| `python3 pykms_Server.py connect -b 12` | ('::', 1688) | 12 | True | [] | [] | [] | False | | `python3 pykms_Server.py :: connect -b 12 -u -d` | ('::', 1688) | 12 | False | [] | [] | [] | True | -| `python3 pykms_Server.py connect -n 1.1.1.1,1699 -b 10` | ('0.0.0.0', 1688) | 5 | True | [('1.1.1.1', 1699)] | [10] | [True] | False | +| `python3 pykms_Server.py connect -n 1.1.1.1,1699 -b 10` | ('::', 1688) | 5 | True | [('1.1.1.1', 1699)] | [10] | [True] | False | | `python3 pykms_Server.py :: 1655 connect -n 2001:db8:0:200::7,1699 -d -b 10 -n 2.2.2.2,1677 -u` | ('::', 1655) | 5 | True | [('2001:db8:0:200::7', 1699), ('2.2.2.2', 1677)] | [10, 5] | [True, False] | True | -| `python3 pykms_Server.py connect -b 12 -u -n 1.1.1.1,1699 -b 10 -n 2.2.2.2,1677 -b 15` | ('0.0.0.0', 1688) | 12 | False | [('1.1.1.1', 1699), ('2.2.2.2', 1677)] | [10, 15] | [False, False] | False | -| `python3 pykms_Server.py connect -b 12 -n 1.1.1.1,1699 -u -n 2.2.2.2,1677` | ('0.0.0.0', 1688) | 12 | True | [('1.1.1.1', 1699), ('2.2.2.2', 1677)] | [12, 12] | [False, True] | False | -| `python3 pykms_Server.py connect -d -u -b 8 -n 1.1.1.1,1699 -n 2.2.2.2,1677 -b 12` | ('0.0.0.0', 1688) | 8 | False | [('1.1.1.1', 1699), ('2.2.2.2', 1677)] | [8, 12] | [False, False] | True | -| `python3 pykms_Server.py connect -b 11 -u -n ::,1699 -n 2.2.2.2,1677` | ('0.0.0.0', 1688) | 11 | False | [('::', 1699), ('2.2.2.2', 1677)] | [11, 11] | [False, False] | False | +| `python3 pykms_Server.py connect -b 12 -u -n 1.1.1.1,1699 -b 10 -n 2.2.2.2,1677 -b 15` | ('::', 1688) | 12 | False | [('1.1.1.1', 1699), ('2.2.2.2', 1677)] | [10, 15] | [False, False] | False | +| `python3 pykms_Server.py connect -b 12 -n 1.1.1.1,1699 -u -n 2.2.2.2,1677` | ('::', 1688) | 12 | True | [('1.1.1.1', 1699), ('2.2.2.2', 1677)] | [12, 12] | [False, True] | False | +| `python3 pykms_Server.py connect -d -u -b 8 -n 1.1.1.1,1699 -n 2.2.2.2,1677 -b 12` | ('::', 1688) | 8 | False | [('1.1.1.1', 1699), ('2.2.2.2', 1677)] | [8, 12] | [False, False] | True | +| `python3 pykms_Server.py connect -b 11 -u -n ::,1699 -n 2.2.2.2,1677` | ('::', 1688) | 11 | False | [('::', 1699), ('2.2.2.2', 1677)] | [11, 11] | [False, False] | False | ### pykms_Client.py If _py-kms_ server doesn't works correctly, you can test it with the KMS client `pykms_Client.py`, running on the same machine where you started `pykms_Server.py`. @@ -202,8 +202,8 @@ You can enable same _pykms_Server.py_ suboptions of `-F`. This are the currently used `ENV` statements from the Dockerfile(s). For further references what exactly the parameters mean, please see the start parameters for the [server](Usage.html#pykms-server-py). ``` # IP-address -# The IP address to listen on. The default is "0.0.0.0" (all interfaces). -ENV IP 0.0.0.0 +# The IP address to listen on. The default is "::" (all interfaces). +ENV IP :: # TCP-port # The network port to listen on. The default is "1688". diff --git a/py-kms/pykms_Client.py b/py-kms/pykms_Client.py index 109f83a..749ae4c 100644 --- a/py-kms/pykms_Client.py +++ b/py-kms/pykms_Client.py @@ -56,7 +56,7 @@ def run(self): # 'help' string - 'default' value - 'dest' string. clt_options = { - 'ip' : {'help' : 'The IP address or hostname of the KMS server.', 'def' : "0.0.0.0", 'des' : "ip"}, + 'ip' : {'help' : 'The IP address or hostname of the KMS server.', 'def' : "::", 'des' : "ip"}, 'port' : {'help' : 'The port the KMS service is listening on. The default is \"1688\".', 'def' : 1688, 'des' : "port"}, 'mode' : {'help' : 'Use this flag to manually specify a Microsoft product for testing the server. The default is \"Windows81\"', 'def' : "Windows8.1", 'des' : "mode", diff --git a/py-kms/pykms_Server.py b/py-kms/pykms_Server.py index 20066af..0f9e04a 100755 --- a/py-kms/pykms_Server.py +++ b/py-kms/pykms_Server.py @@ -184,7 +184,7 @@ def run(self): # 'help' string - 'default' value - 'dest' string. srv_options = { - 'ip' : {'help' : 'The IP address (IPv4 or IPv6) to listen on. The default is \"0.0.0.0\" (all interfaces).', 'def' : "0.0.0.0", 'des' : "ip"}, + 'ip' : {'help' : 'The IP address (IPv4 or IPv6) to listen on. The default is \"::\" (all interfaces).', 'def' : "::", 'des' : "ip"}, 'port' : {'help' : 'The network port to listen on. The default is \"1688\".', 'def' : 1688, 'des' : "port"}, 'epid' : {'help' : 'Use this option to manually specify an ePID to use. If no ePID is specified, a random ePID will be auto generated.', 'def' : None, 'des' : "epid"}, From 57f2159be364832d7b7604bbc218995ae9907026 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Wed, 7 Dec 2022 11:53:24 +0100 Subject: [PATCH 100/154] Default dual-stack socket --- py-kms/pykms_Server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-kms/pykms_Server.py b/py-kms/pykms_Server.py index 0f9e04a..2b6e42a 100755 --- a/py-kms/pykms_Server.py +++ b/py-kms/pykms_Server.py @@ -220,7 +220,7 @@ def run(self): 'reuse' : {'help' : 'Do not allows binding / listening to the same address and port. Reusing port is activated by default.', 'def' : True, 'des': "reuse"}, 'dual' : {'help' : 'Allows listening to an IPv6 address also accepting connections via IPv4. Deactivated by default.', - 'def' : False, 'des': "dual"} + 'def' : True, 'des': "dual"} } def server_options(): From e5a7f7744085b4c902cdee0e386a611ab1eff02a Mon Sep 17 00:00:00 2001 From: simonmicro Date: Wed, 7 Dec 2022 12:19:32 +0100 Subject: [PATCH 101/154] Added warning about removal of Etrigan support Added warning about removal of Etrigan GUI support --- README.md | 6 ++---- docs/Getting Started.md | 3 +-- py-kms/pykms_Server.py | 3 +++ 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e4a479d..4a765c6 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,8 @@ This version of _py-kms_ is for itself a fork of the original implementation by - Microsoft Office 2019 ( Volume License ) - Microsoft Office 2021 ( Volume License ) - It's written in Python (tested with Python 3.10.1). - - Supports execution by `Docker`, `systemd`, `Upstart` and many more... - - Includes a GUI for simple managing. - - Uses `sqlite` for persistent data storage. + - Supports execution by `Docker`, `systemd` and many more... + - Uses `sqlite` for persistent data storage (with a simple web-based explorer). ## Documentation The wiki has been completly reworked and is now available on [readthedocs.com](https://py-kms.readthedocs.io/en/latest/). It should you provide all necessary information how to setup and to use _py-kms_ , all without clumping this readme. The documentation also houses more details about activation with _py-kms_ and how to get GVLK keys. @@ -46,7 +45,6 @@ The wiki has been completly reworked and is now available on [readthedocs.com](h - To start the server, execute `python3 pykms_Server.py [IPADDRESS] [PORT]`, the default _IPADDRESS_ is `0.0.0.0` ( all interfaces ) and the default _PORT_ is `1688`. Note that both the address and port are optional. It's allowed to use IPv4 and IPv6 addresses. If you have a IPv6-capable dual-stack OS, a dual-stack socket is created when using a IPv6 address. - To start the server automatically using Docker, execute `docker run -d --name py-kms --restart always -p 1688:1688 ghcr.io/py-kms-organization/py-kms`. - To show the help pages type: `python3 pykms_Server.py -h` and `python3 pykms_Client.py -h`. -- For launching _py-kms_ GUI make the file `pykms_Server.py` executable with `chmod +x /path/to/folder/py-kms/pykms_Server.py`, then simply run `pykms_Server.py` by double-clicking. ## License - _py-kms_ is [![Unlicense](https://img.shields.io/badge/license-unlicense-lightgray.svg)](https://github.com/SystemRage/py-kms/blob/master/LICENSE) diff --git a/docs/Getting Started.md b/docs/Getting Started.md index a9c6628..0b6dd36 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -93,7 +93,7 @@ Check syntax with `sudo systemd-analyze verify py3-kms.service`, correct file pe start the daemon `sudo systemctl start py3-kms.service` and view its status `sudo systemctl status py3-kms.service`. Check if daemon is correctly running with `cat /pykms_logserver.log`. Finally a few generic commands useful for interact with your daemon [here](https://linoxide.com/linux-how-to/enable-disable-services-ubuntu-systemd-upstart/). -### Etrigan +### Etrigan (deprecated) You can run py-kms daemonized (via [Etrigan](https://github.com/SystemRage/Etrigan)) using a command like `python3 pykms_Server.py etrigan start` and stop it with `python3 pykms_Server.py etrigan stop`. With Etrigan you have another way to launch py-kms GUI (specially suitable if you're using a virtualenv), so `python3 pykms_Server.py etrigan start -g` and stop the GUI with `python3 pykms_Server.py etrigan stop` (or interact with the `EXIT` button). @@ -168,7 +168,6 @@ They might be useful to you: ### Dependencies - Python 3.x. -- Tkinter module (for the GUI). - If the `tzlocal` module is installed, the "Request Time" in the verbose output will be converted into local time. Otherwise, it will be in UTC. - It can use the `sqlite3` module, storing activation data in a database so it can be recalled again. - Installation example on Ubuntu / Mint: diff --git a/py-kms/pykms_Server.py b/py-kms/pykms_Server.py index 20066af..8062d20 100755 --- a/py-kms/pykms_Server.py +++ b/py-kms/pykms_Server.py @@ -556,11 +556,14 @@ def server_main_terminal(): else: # (with or without GUI) and (with daemon) # Setup daemon (eventually). + pretty_printer(log_obj = loggersrv.warning, put_text = "{reverse}{yellow}{bold}Etrigan support is deprecated and will be removed in the future!{end}") server_daemon() def server_with_gui(): import pykms_GuiBase + pretty_printer(log_obj = loggersrv.warning, put_text = "{reverse}{yellow}{bold}Etrigan GUI support is deprecated and will be removed in the future!{end}") + root = pykms_GuiBase.KmsGui() root.title(pykms_GuiBase.gui_description + ' (' + pykms_GuiBase.gui_version + ')') root.mainloop() From bc25dd58b0de912cafd8f79ef533ba4296d9e99b Mon Sep 17 00:00:00 2001 From: simonmicro Date: Wed, 7 Dec 2022 12:23:08 +0100 Subject: [PATCH 102/154] Removed two old badges from docs --- docs/Getting Started.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/Getting Started.md b/docs/Getting Started.md index a9c6628..6edf934 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -6,8 +6,6 @@ What follows are some guides how to start the `pykms_Server.py` script, which pr You can simply manage a daemon that runs as a background process. This can be achieved by using any of the notes below or by writing your own solution. ### Docker -![docker-auto](https://img.shields.io/docker/cloud/automated/pykmsorg/py-kms) -![docker-status](https://img.shields.io/docker/cloud/build/pykmsorg/py-kms) ![docker-pulls](https://img.shields.io/docker/pulls/pykmsorg/py-kms) ![docker-size](https://img.shields.io/docker/image-size/pykmsorg/py-kms) From 964dde625eb4f232b50fb2860b35905c923ec985 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Wed, 7 Dec 2022 13:16:40 +0100 Subject: [PATCH 103/154] Switched default log level to warning --- py-kms/pykms_Server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-kms/pykms_Server.py b/py-kms/pykms_Server.py index 8062d20..ab65e0a 100755 --- a/py-kms/pykms_Server.py +++ b/py-kms/pykms_Server.py @@ -208,7 +208,7 @@ def run(self): 'def' : None, 'des' : "timeoutsndrcv"}, 'asyncmsg' : {'help' : 'Prints pretty / logging messages asynchronously. Deactivated by default.', 'def' : False, 'des' : "asyncmsg"}, - 'llevel' : {'help' : 'Use this option to set a log level. The default is \"ERROR\".', 'def' : "ERROR", 'des' : "loglevel", + 'llevel' : {'help' : 'Use this option to set a log level. The default is \"WARNING\".', 'def' : "WARNING", 'des' : "loglevel", 'choi' : ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG", "MININFO"]}, 'lfile' : {'help' : 'Use this option to set an output log file. The default is \"pykms_logserver.log\". \ Type \"STDOUT\" to view log info on stdout. Type \"FILESTDOUT\" to combine previous actions. \ From f88ada340dc7226d57bc571891296fb7ea7f4eaf Mon Sep 17 00:00:00 2001 From: simonmicro Date: Tue, 21 Feb 2023 14:00:26 +0100 Subject: [PATCH 104/154] Added workflow for different stages --- .../{main.yml => bake_to_latest.yml} | 7 +-- .github/workflows/bake_to_next.yml | 50 +++++++++++++++++++ .github/workflows/bake_to_test.yml | 32 ++++++++++++ 3 files changed, 84 insertions(+), 5 deletions(-) rename .github/workflows/{main.yml => bake_to_latest.yml} (95%) create mode 100644 .github/workflows/bake_to_next.yml create mode 100644 .github/workflows/bake_to_test.yml diff --git a/.github/workflows/main.yml b/.github/workflows/bake_to_latest.yml similarity index 95% rename from .github/workflows/main.yml rename to .github/workflows/bake_to_latest.yml index f1b995e..6a2fbb3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/bake_to_latest.yml @@ -1,16 +1,13 @@ -name: Build Image On Release +name: Build release-tags on: workflow_dispatch: push: branches: - master - pull_request: - branches: - - master jobs: - bake: + bake-latest: runs-on: ubuntu-latest permissions: packages: write diff --git a/.github/workflows/bake_to_next.yml b/.github/workflows/bake_to_next.yml new file mode 100644 index 0000000..8f6e43c --- /dev/null +++ b/.github/workflows/bake_to_next.yml @@ -0,0 +1,50 @@ +name: Build next-tags + +on: + workflow_dispatch: + push: + branches: + - next + +jobs: + bake-next: + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - name: Checkout + uses: actions/checkout@v2.3.4 + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + with: + platforms: all + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1.6.0 + - name: Login to DockerHub + uses: docker/login-action@v1.10.0 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Login to GitHub Container Registry + uses: docker/login-action@v1.10.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build + uses: docker/build-push-action@v2 + with: + context: . + file: ./docker/docker-py3-kms/Dockerfile + platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 + push: true + tags: pykmsorg/py-kms:python3-next,ghcr.io/py-kms-organization/py-kms:python3-next + - name: Build + uses: docker/build-push-action@v2 + with: + context: . + file: ./docker/docker-py3-kms-minimal/Dockerfile + platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 + push: true + tags: pykmsorg/py-kms:latest-next,ghcr.io/py-kms-organization/py-kms:latest-next,pykmsorg/py-kms:minimal-next,ghcr.io/py-kms-organization/py-kms:minimal-next diff --git a/.github/workflows/bake_to_test.yml b/.github/workflows/bake_to_test.yml new file mode 100644 index 0000000..4daf711 --- /dev/null +++ b/.github/workflows/bake_to_test.yml @@ -0,0 +1,32 @@ +name: Test-Build Docker Image + +on: + workflow_dispatch: + push: + +jobs: + bake-test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2.3.4 + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + with: + platforms: all + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1.6.0 + - name: Build + uses: docker/build-push-action@v2 + with: + context: . + file: ./docker/docker-py3-kms/Dockerfile + platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 + push: false + - name: Build + uses: docker/build-push-action@v2 + with: + context: . + file: ./docker/docker-py3-kms-minimal/Dockerfile + platforms: linux/amd64,linux/386,linux/arm64/v8,linux/arm/v7,linux/arm/v6 + push: false \ No newline at end of file From 77e545d0fea7d000fd0ec77436b24562b419580d Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 9 Dec 2022 19:37:18 +0100 Subject: [PATCH 105/154] Removed Etrigan support --- .gitignore | 1 - docs/Getting Started.md | 4 - py-kms/Etrigan.py | 609 ---------------------------------------- py-kms/pykms_Server.py | 134 ++------- 4 files changed, 16 insertions(+), 732 deletions(-) delete mode 100644 py-kms/Etrigan.py diff --git a/.gitignore b/.gitignore index 874f86a..6f4050f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ pykms_logserver.log* pykms_logclient.log* pykms_database.db* -etrigan.log* # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/docs/Getting Started.md b/docs/Getting Started.md index 6669c26..129a674 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -91,10 +91,6 @@ Check syntax with `sudo systemd-analyze verify py3-kms.service`, correct file pe start the daemon `sudo systemctl start py3-kms.service` and view its status `sudo systemctl status py3-kms.service`. Check if daemon is correctly running with `cat /pykms_logserver.log`. Finally a few generic commands useful for interact with your daemon [here](https://linoxide.com/linux-how-to/enable-disable-services-ubuntu-systemd-upstart/). -### Etrigan (deprecated) -You can run py-kms daemonized (via [Etrigan](https://github.com/SystemRage/Etrigan)) using a command like `python3 pykms_Server.py etrigan start` and stop it with `python3 pykms_Server.py etrigan stop`. With Etrigan you have another -way to launch py-kms GUI (specially suitable if you're using a virtualenv), so `python3 pykms_Server.py etrigan start -g` and stop the GUI with `python3 pykms_Server.py etrigan stop` (or interact with the `EXIT` button). - ### Upstart (deprecated) If you are running a Linux distro using `upstart` (deprecated), create the file: `sudo nano /etc/init/py3-kms.conf`, then add the following (change it where needed) and save: ``` diff --git a/py-kms/Etrigan.py b/py-kms/Etrigan.py deleted file mode 100644 index c9cf193..0000000 --- a/py-kms/Etrigan.py +++ /dev/null @@ -1,609 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import atexit -import errno -import os -import sys -import time -import signal -import logging -import argparse -from collections.abc import Sequence - -__version__ = "0.1" -__license__ = "MIT License" -__author__ = u"Matteo ℱan " -__copyright__ = "© Copyright 2020" -__url__ = "https://github.com/SystemRage/Etrigan" -__description__ = "Etrigan: a python daemonizer that rocks." - - -class Etrigan(object): - """ - Daemonizer based on double-fork method - -------------------------------------- - Each option can be passed as a keyword argument or modified by assigning - to an attribute on the instance: - - jasonblood = Etrigan(pidfile, - argument_example_1 = foo, - argument_example_2 = bar) - - that is equivalent to: - - jasonblood = Etrigan(pidfile) - jasonblood.argument_example_1 = foo - jasonblood.argument_example_2 = bar - - Object constructor expects always `pidfile` argument. - `pidfile` - Path to the pidfile. - - The following other options are defined: - `stdin` - `stdout` - `stderr` - :Default: `os.devnull` - File objects used as the new file for the standard I/O streams - `sys.stdin`, `sys.stdout`, and `sys.stderr` respectively. - - `funcs_to_daemonize` - :Default: `[]` - Define a list of your custom functions - which will be executed after daemonization. - If None, you have to subclass Etrigan `run` method. - Note that these functions can return elements that will be - added to Etrigan object (`etrigan_add` list) so the other subsequent - ones can reuse them for further processing. - You only have to provide indexes of `etrigan_add` list, - (an int (example: 2) for single index or a string (example: '1:4') for slices) - as first returning element. - - `want_quit` - :Default: `False` - If `True`, runs Etrigan `quit_on_start` or `quit_on_stop` - lists of your custom functions at the end of `start` or `stop` operations. - These can return elements as `funcs_to_daemonize`. - - `logfile` - :Default: `None` - Path to the output log file. - - `loglevel` - :Default: `None` - Set the log level of logging messages. - - `mute` - :Default: `False` - Disable all stdout and stderr messages (before double forking). - - `pause_loop` - :Default: `None` - Seconds of pause between the calling, in an infinite loop, - of every function in `funcs_to_daemonize` list. - If `-1`, no pause between the calling, in an infinite loop, - of every function in `funcs_to_daemonize` list. - If `None`, only one run (no infinite loop) of functions in - `funcs_to_daemonize` list, without pause. - """ - - def __init__(self, pidfile, - stdin = os.devnull, stdout = os.devnull, stderr = os.devnull, - funcs_to_daemonize = [], want_quit = False, - logfile = None, loglevel = None, - mute = False, pause_loop = None): - - self.pidfile = pidfile - self.funcs_to_daemonize = funcs_to_daemonize - self.stdin = stdin - self.stdout = stdout - self.stderr = stderr - self.logfile = logfile - self.loglevel = loglevel - self.mute = mute - self.want_quit = want_quit - self.pause_loop = pause_loop - # internal only. - self.homedir = '/' - self.umask = 0o22 - self.etrigan_restart, self.etrigan_reload = (False for _ in range(2)) - self.etrigan_alive = True - self.etrigan_add = [] - self.etrigan_index = None - # seconds of pause between stop and start during the restart of the daemon. - self.pause_restart = 5 - # when terminate a process, seconds to wait until kill the process with signal. - # self.pause_kill = 3 - - # create logfile. - self.setup_files() - - def handle_terminate(self, signum, frame): - if os.path.exists(self.pidfile): - self.etrigan_alive = False - # eventually run quit (on stop) function/s. - if self.want_quit: - if not isinstance(self.quit_on_stop, (list, tuple)): - self.quit_on_stop = [self.quit_on_stop] - self.execute(self.quit_on_stop) - # then always run quit standard. - self.quit_standard() - else: - self.view(self.logdaemon.error, self.emit_error, "Failed to stop the daemon process: can't find PIDFILE '%s'" %self.pidfile) - sys.exit(0) - - def handle_reload(self, signum, frame): - self.etrigan_reload = True - - def setup_files(self): - self.pidfile = os.path.abspath(self.pidfile) - - if self.logfile is not None: - self.logdaemon = logging.getLogger('logdaemon') - self.logdaemon.setLevel(self.loglevel) - - filehandler = logging.FileHandler(self.logfile) - filehandler.setLevel(self.loglevel) - formatter = logging.Formatter(fmt = '[%(asctime)s] [%(levelname)8s] --- %(message)s', - datefmt = '%Y-%m-%d %H:%M:%S') - filehandler.setFormatter(formatter) - self.logdaemon.addHandler(filehandler) - else: - nullhandler = logging.NullHandler() - self.logdaemon.addHandler(nullhandler) - - def emit_error(self, message, to_exit = True): - """ Print an error message to STDERR. """ - if not self.mute: - sys.stderr.write(message + '\n') - sys.stderr.flush() - if to_exit: - sys.exit(1) - - def emit_message(self, message, to_exit = False): - """ Print a message to STDOUT. """ - if not self.mute: - sys.stdout.write(message + '\n') - sys.stdout.flush() - if to_exit: - sys.exit(0) - - def view(self, logobj, emitobj, msg, **kwargs): - options = {'to_exit' : False, - 'silent' : False - } - options.update(kwargs) - - if logobj: - logobj(msg) - if emitobj: - if not options['silent']: - emitobj(msg, to_exit = options['to_exit']) - - def daemonize(self): - """ - Double-forks the process to daemonize the script. - see Stevens' "Advanced Programming in the UNIX Environment" for details (ISBN 0201563177) - http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16 - """ - self.view(self.logdaemon.debug, None, "Attempting to daemonize the process...") - - # First fork. - self.fork(msg = "First fork") - # Decouple from parent environment. - self.detach() - # Second fork. - self.fork(msg = "Second fork") - # Write the PID file. - self.create_pidfile() - self.view(self.logdaemon.info, self.emit_message, "The daemon process has started.") - # Redirect standard file descriptors. - sys.stdout.flush() - sys.stderr.flush() - self.attach('stdin', mode = 'r') - self.attach('stdout', mode = 'a+') - - try: - self.attach('stderr', mode = 'a+', buffering = 0) - except ValueError: - # Python 3 can't have unbuffered text I/O. - self.attach('stderr', mode = 'a+', buffering = 1) - - # Handle signals. - signal.signal(signal.SIGINT, self.handle_terminate) - signal.signal(signal.SIGTERM, self.handle_terminate) - signal.signal(signal.SIGHUP, self.handle_reload) - #signal.signal(signal.SIGKILL....) - - def fork(self, msg): - try: - pid = os.fork() - if pid > 0: - self.view(self.logdaemon.debug, None, msg + " success with PID %d." %pid) - # Exit from parent. - sys.exit(0) - except Exception as e: - msg += " failed: %s." %str(e) - self.view(self.logdaemon.error, self.emit_error, msg) - - def detach(self): - # cd to root for a guarenteed working dir. - try: - os.chdir(self.homedir) - except Exception as e: - msg = "Unable to change working directory: %s." %str(e) - self.view(self.logdaemon.error, self.emit_error, msg) - - # clear the session id to clear the controlling tty. - pid = os.setsid() - if pid == -1: - sys.exit(1) - - # set the umask so we have access to all files created by the daemon. - try: - os.umask(self.umask) - except Exception as e: - msg = "Unable to change file creation mask: %s." %str(e) - self.view(self.logdaemon.error, self.emit_error, msg) - - def attach(self, name, mode, buffering = -1): - with open(getattr(self, name), mode, buffering) as stream: - os.dup2(stream.fileno(), getattr(sys, name).fileno()) - - def checkfile(self, path, typearg, typefile): - filename = os.path.basename(path) - pathname = os.path.dirname(path) - if not os.path.isdir(pathname): - msg = "argument %s: invalid directory: '%s'. Exiting..." %(typearg, pathname) - self.view(self.logdaemon.error, self.emit_error, msg) - elif not filename.lower().endswith(typefile): - msg = "argument %s: not a %s file, invalid extension: '%s'. Exiting..." %(typearg, typefile, filename) - self.view(self.logdaemon.error, self.emit_error, msg) - - def create_pidfile(self): - atexit.register(self.delete_pidfile) - pid = os.getpid() - try: - with open(self.pidfile, 'w+') as pf: - pf.write("%s\n" %pid) - self.view(self.logdaemon.debug, None, "PID %d written to '%s'." %(pid, self.pidfile)) - except Exception as e: - msg = "Unable to write PID to PIDFILE '%s': %s" %(self.pidfile, str(e)) - self.view(self.logdaemon.error, self.emit_error, msg) - - def delete_pidfile(self, pid): - # Remove the PID file. - try: - os.remove(self.pidfile) - self.view(self.logdaemon.debug, None, "Removing PIDFILE '%s' with PID %d." %(self.pidfile, pid)) - except Exception as e: - if e.errno != errno.ENOENT: - self.view(self.logdaemon.error, self.emit_error, str(e)) - - def get_pidfile(self): - # Get the PID from the PID file. - if self.pidfile is None: - return None - if not os.path.isfile(self.pidfile): - return None - - try: - with open(self.pidfile, 'r') as pf: - pid = int(pf.read().strip()) - self.view(self.logdaemon.debug, None, "Found PID %d in PIDFILE '%s'" %(pid, self.pidfile)) - except Exception as e: - self.view(self.logdaemon.warning, None, "Empty or broken PIDFILE") - pid = None - - def pid_exists(pid): - # psutil _psposix.py. - if pid == 0: - return True - try: - os.kill(pid, 0) - except OSError as e: - if e.errno == errno.ESRCH: - return False - elif e.errno == errno.EPERM: - return True - else: - self.view(self.logdaemon.error, self.emit_error, str(e)) - else: - return True - - if pid is not None and pid_exists(pid): - return pid - else: - # Remove the stale PID file. - self.delete_pidfile(pid) - return None - - def start(self): - """ Start the daemon. """ - self.view(self.logdaemon.info, self.emit_message, "Starting the daemon process...", silent = self.etrigan_restart) - - # Check for a PID file to see if the Daemon is already running. - pid = self.get_pidfile() - if pid is not None: - msg = "A previous daemon process with PIDFILE '%s' already exists. Daemon already running ?" %self.pidfile - self.view(self.logdaemon.warning, self.emit_error, msg, to_exit = False) - return - - # Daemonize the main process. - self.daemonize() - # Start a infinitive loop that periodically runs `funcs_to_daemonize`. - self.loop() - # eventualy run quit (on start) function/s. - if self.want_quit: - if not isinstance(self.quit_on_start, (list, tuple)): - self.quit_on_start = [self.quit_on_start] - self.execute(self.quit_on_start) - - def stop(self): - """ Stop the daemon. """ - self.view(None, self.emit_message, "Stopping the daemon process...", silent = self.etrigan_restart) - - self.logdaemon.disabled = True - pid = self.get_pidfile() - self.logdaemon.disabled = False - if not pid: - # Just to be sure. A ValueError might occur - # if the PIDFILE is empty but does actually exist. - if os.path.exists(self.pidfile): - self.delete_pidfile(pid) - - msg = "Can't find the daemon process with PIDFILE '%s'. Daemon not running ?" %self.pidfile - self.view(self.logdaemon.warning, self.emit_error, msg, to_exit = False) - return - - # Try to kill the daemon process. - try: - while True: - os.kill(pid, signal.SIGTERM) - time.sleep(0.1) - except Exception as e: - if (e.errno != errno.ESRCH): - self.view(self.logdaemon.error, self.emit_error, "Failed to stop the daemon process: %s" %str(e)) - else: - self.view(None, self.emit_message, "The daemon process has ended correctly.", silent = self.etrigan_restart) - - def restart(self): - """ Restart the daemon. """ - self.view(self.logdaemon.info, self.emit_message, "Restarting the daemon process...") - self.etrigan_restart = True - self.stop() - if self.pause_restart: - time.sleep(self.pause_restart) - self.etrigan_alive = True - self.start() - - def reload(self): - pass - - def status(self): - """ Get status of the daemon. """ - self.view(self.logdaemon.info, self.emit_message, "Viewing the daemon process status...") - - if self.pidfile is None: - self.view(self.logdaemon.error, self.emit_error, "Cannot get the status of daemon without PIDFILE.") - - pid = self.get_pidfile() - if pid is None: - self.view(self.logdaemon.info, self.emit_message, "The daemon process is not running.", to_exit = True) - else: - try: - with open("/proc/%d/status" %pid, 'r') as pf: - pass - self.view(self.logdaemon.info, self.emit_message, "The daemon process is running.", to_exit = True) - except Exception as e: - msg = "There is not a process with the PIDFILE '%s': %s" %(self.pidfile, str(e)) - self.view(self.logdaemon.error, self.emit_error, msg) - - def flatten(self, alistoflists, ltypes = Sequence): - # https://stackoverflow.com/questions/2158395/flatten-an-irregular-list-of-lists/2158532#2158532 - alistoflists = list(alistoflists) - while alistoflists: - while alistoflists and isinstance(alistoflists[0], ltypes): - alistoflists[0:1] = alistoflists[0] - if alistoflists: yield alistoflists.pop(0) - - def exclude(self, func): - from inspect import getargspec - args = getargspec(func) - if callable(func): - try: - args[0].pop(0) - except IndexError: - pass - return args - else: - self.view(self.logdaemon.error, self.emit_error, "Not a function.") - return - - def execute(self, some_functions): - returned = None - if isinstance(some_functions, (list, tuple)): - for func in some_functions: - l_req = len(self.exclude(func)[0]) - - if l_req == 0: - returned = func() - else: - l_add = len(self.etrigan_add) - if l_req > l_add: - self.view(self.logdaemon.error, self.emit_error, - "Can't evaluate function: given %s, required %s." %(l_add, l_req)) - return - else: - arguments = self.etrigan_add[self.etrigan_index] - l_args = (len(arguments) if isinstance(arguments, list) else 1) - if (l_args > l_req) or (l_args < l_req): - self.view(self.logdaemon.error, self.emit_error, - "Can't evaluate function: given %s, required %s." %(l_args, l_req)) - return - else: - if isinstance(arguments, list): - returned = func(*arguments) - else: - returned = func(arguments) - - if returned: - if isinstance(returned, (list, tuple)): - if isinstance(returned[0], int): - self.etrigan_index = returned[0] - else: - self.etrigan_index = slice(*map(int, returned[0].split(':'))) - if returned[1:] != []: - self.etrigan_add.append(returned[1:]) - self.etrigan_add = list(self.flatten(self.etrigan_add)) - else: - self.view(self.logdaemon.error, self.emit_error, "Function should return list or tuple.") - returned = None - else: - if some_functions is None: - self.run() - - def loop(self): - try: - if self.pause_loop is None: - # one-shot. - self.execute(self.funcs_to_daemonize) - else: - if self.pause_loop >= 0: - # infinite with pause. - time.sleep(self.pause_loop) - while self.etrigan_alive: - self.execute(self.funcs_to_daemonize) - time.sleep(self.pause_loop) - elif self.pause_loop == -1: - # infinite without pause. - while self.etrigan_alive: - self.execute(self.funcs_to_daemonize) - except Exception as e: - msg = "The daemon process start method failed: %s" %str(e) - self.view(self.logdaemon.error, self.emit_error, msg) - - def quit_standard(self): - self.view(self.logdaemon.info, None, "Stopping the daemon process...") - self.delete_pidfile(self.get_pidfile()) - self.view(self.logdaemon.info, None, "The daemon process has ended correctly.") - - def quit_on_start(self): - """ - Override this method when you subclass Daemon. - """ - self.quit_standard() - - def quit_on_stop(self): - """ - Override this method when you subclass Daemon. - """ - pass - - def run(self): - """ - Override this method when you subclass Daemon. - It will be called after the process has been - daemonized by start() or restart(). - """ - pass - -#----------------------------------------------------------------------------------------------------------------------------------------------------------- - -class JasonBlood(Etrigan): - def run(self): - jasonblood_func() - -def jasonblood_func(): - with open(os.path.join('.', 'etrigan_test.txt'), 'a') as file: - file.write("Yarva Demonicus Etrigan " + time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()) + '\n') - -def Etrigan_parser(parser = None): - if parser is None: - # create a new parser. - parser = argparse.ArgumentParser(description = __description__, epilog = __version__) - if not parser.add_help: - # create help argument. - parser.add_argument("-h", "--help", action = "help", help = "show this help message and exit") - - # attach to an existent parser. - parser.add_argument("operation", action = "store", choices = ["start", "stop", "restart", "status", "reload"], - help = "Select an operation for daemon.", type = str) - parser.add_argument("--etrigan-pid", - action = "store", dest = "etriganpid", default = "/tmp/etrigan.pid", - help = "Choose a pidfile path. Default is \"/tmp/etrigan.pid\".", type = str) #'/var/run/etrigan.pid' - parser.add_argument("--etrigan-log", - action = "store", dest = "etriganlog", default = os.path.join('.', "etrigan.log"), - help = "Use this option to choose an output log file; for not logging don't select it. Default is \"etrigan.log\".", type = str) - parser.add_argument("--etrigan-lev", - action = "store", dest = "etriganlev", default = "DEBUG", - choices = ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"], - help = "Use this option to set a log level. Default is \"DEBUG\".", type = str) - parser.add_argument("--etrigan-mute", - action = "store_const", dest = 'etriganmute', const = True, default = False, - help = "Disable all stdout and stderr messages.") - return parser - -class Etrigan_check(object): - def emit_opt_err(self, msg): - print(msg) - sys.exit(1) - - def checkfile(self, path, typearg, typefile): - filename, extension = os.path.splitext(path) - pathname = os.path.dirname(path) - if not os.path.isdir(pathname): - msg = "argument `%s`: invalid directory: '%s'. Exiting..." %(typearg, pathname) - self.emit_opt_err(msg) - elif not extension == typefile: - msg = "argument `%s`: not a %s file, invalid extension: '%s'. Exiting..." %(typearg, typefile, extension) - self.emit_opt_err(msg) - - def checkfunction(self, funcs, booleans): - if not isinstance(funcs, (list, tuple)): - if funcs is not None: - msg = "argument `funcs_to_daemonize`: provide list, tuple or None" - self.emit_opt_err(msg) - - for elem in booleans: - if not type(elem) == bool: - msg = "argument `want_quit`: not a boolean." - self.emit_opt_err(msg) - -def Etrigan_job(type_oper, daemon_obj): - Etrigan_check().checkfunction(daemon_obj.funcs_to_daemonize, - [daemon_obj.want_quit]) - if type_oper == "start": - daemon_obj.start() - elif type_oper == "stop": - daemon_obj.stop() - elif type_oper == "restart": - daemon_obj.restart() - elif type_oper == "status": - daemon_obj.status() - elif type_oper == "reload": - daemon_obj.reload() - sys.exit(0) - -def main(): - # Parse arguments. - parser = Etrigan_parser() - args = vars(parser.parse_args()) - # Check arguments. - Etrigan_check().checkfile(args['etriganpid'], '--etrigan-pid', '.pid') - Etrigan_check().checkfile(args['etriganlog'], '--etrigan-log', '.log') - - # Setup daemon. - jasonblood_1 = Etrigan(pidfile = args['etriganpid'], logfile = args['etriganlog'], loglevel = args['etriganlev'], - mute = args['etriganmute'], - funcs_to_daemonize = [jasonblood_func], pause_loop = 5) - -## jasonblood_2 = JasonBlood(pidfile = args['etriganpid'], logfile = args['etriganlog'], loglevel = args['etriganlev'], -## mute = args['etriganmute'], -## funcs_to_daemonize = None, pause_loop = 5) - # Do job. - Etrigan_job(args['operation'], jasonblood_1) - -if __name__ == '__main__': - main() diff --git a/py-kms/pykms_Server.py b/py-kms/pykms_Server.py index 9d244de..80e549e 100755 --- a/py-kms/pykms_Server.py +++ b/py-kms/pykms_Server.py @@ -23,7 +23,6 @@ from pykms_Misc import KmsParser, KmsParserException, KmsParserHelp from pykms_Misc import kms_parser_get, kms_parser_check_optionals, kms_parser_check_positionals, kms_parser_check_connect from pykms_Format import enco, deco, pretty_printer, justify -from Etrigan import Etrigan, Etrigan_parser, Etrigan_check, Etrigan_job from pykms_Connect import MultipleListener srv_version = "py-kms_2020-10-01" @@ -256,15 +255,6 @@ def server_options(): server_parser.add_argument("-h", "--help", action = "help", help = "show this help message and exit") - ## Daemon (Etrigan) parsing. - daemon_parser = KmsParser(description = "daemon options inherited from Etrigan", add_help = False) - daemon_subparser = daemon_parser.add_subparsers(dest = "mode") - - etrigan_parser = daemon_subparser.add_parser("etrigan", add_help = False) - etrigan_parser.add_argument("-g", "--gui", action = "store_const", dest = 'gui', const = True, default = False, - help = "Enable py-kms GUI usage.") - etrigan_parser = Etrigan_parser(parser = etrigan_parser) - ## Connection parsing. connection_parser = KmsParser(description = "connect options", add_help = False) connection_subparser = connection_parser.add_subparsers(dest = "mode") @@ -284,16 +274,14 @@ def server_options(): # Run help. if any(arg in ["-h", "--help"] for arg in userarg): - KmsParserHelp().printer(parsers = [server_parser, (daemon_parser, etrigan_parser), - (connection_parser, connect_parser)]) + KmsParserHelp().printer(parsers = [server_parser, (connection_parser, connect_parser)]) # Get stored arguments. pykmssrv_zeroarg, pykmssrv_onearg = kms_parser_get(server_parser) - etrigan_zeroarg, etrigan_onearg = kms_parser_get(etrigan_parser) connect_zeroarg, connect_onearg = kms_parser_get(connect_parser) - subdict = {'etrigan' : (etrigan_zeroarg, etrigan_onearg, daemon_parser.parse_args), - 'connect' : (connect_zeroarg, connect_onearg, connection_parser.parse_args) - } + subdict = { + 'connect' : (connect_zeroarg, connect_onearg, connection_parser.parse_args) + } subpars = list(subdict.keys()) pykmssrv_zeroarg += subpars # add subparsers @@ -309,14 +297,7 @@ def server_options(): if subindx: # Set `daemon options` and/or `connect options` for server dict config. # example cases: - # 1 python3 pykms_Server.py [1.2.3.4] [1234] [--pykms_optionals] etrigan daemon_positional [--daemon_optionals] \ - # connect [--connect_optionals] - # - # 2 python3 pykms_Server.py [1.2.3.4] [1234] [--pykms_optionals] connect [--connect_optionals] etrigan \ - # daemon_positional [--daemon_optionals] - # - # 3 python3 pykms_Server.py [1.2.3.4] [1234] [--pykms_optionals] etrigan daemon_positional [--daemon_optionals] - # 4 python3 pykms_Server.py [1.2.3.4] [1234] [--pykms_optionals] connect [--connect_optionals] + # 1 python3 pykms_Server.py [1.2.3.4] [1234] [--pykms_optionals] connect [--connect_optionals] first = subindx[0][0] # initial. kms_parser_check_optionals(userarg[0 : first], pykmssrv_zeroarg, pykmssrv_onearg, exclude_opt_len = exclude_kms) @@ -338,7 +319,7 @@ def server_options(): else: # Update `pykms options` for server dict config. # example case: - # 5 python3 pykms_Server.py [1.2.3.4] [1234] [--pykms_optionals] + # 2 python3 pykms_Server.py [1.2.3.4] [1234] [--pykms_optionals] kms_parser_check_optionals(userarg, pykmssrv_zeroarg, pykmssrv_onearg, exclude_opt_len = exclude_kms) kms_parser_check_positionals(srv_config, server_parser.parse_args) @@ -347,63 +328,6 @@ def server_options(): except KmsParserException as e: pretty_printer(put_text = "{reverse}{red}{bold}%s. Exiting...{end}" %str(e), to_exit = True) -class Etrigan_Check(Etrigan_check): - def emit_opt_err(self, msg): - pretty_printer(put_text = "{reverse}{red}{bold}%s{end}" %msg, to_exit = True) - -class Etrigan(Etrigan): - def emit_message(self, message, to_exit = False): - if not self.mute: - pretty_printer(put_text = "{reverse}{green}{bold}%s{end}" %message) - if to_exit: - sys.exit(0) - - def emit_error(self, message, to_exit = True): - if not self.mute: - pretty_printer(put_text = "{reverse}{red}{bold}%s{end}" %message, to_exit = True) - -def server_daemon(): - if 'etrigan' in srv_config.values(): - path = os.path.join(gettempdir(), 'pykms_config.pickle') - - if srv_config['operation'] in ['stop', 'restart', 'status'] and len(sys.argv[1:]) > 2: - pretty_printer(put_text = "{reverse}{red}{bold}too much arguments with etrigan '%s'. Exiting...{end}" %srv_config['operation'], - to_exit = True) - - # Check file arguments. - Etrigan_Check().checkfile(srv_config['etriganpid'], '--etrigan-pid', '.pid') - Etrigan_Check().checkfile(srv_config['etriganlog'], '--etrigan-log', '.log') - - if srv_config['gui']: - pass - else: - if srv_config['operation'] == 'start': - with open(path, 'wb') as file: - pickle.dump(srv_config, file, protocol = pickle.HIGHEST_PROTOCOL) - elif srv_config['operation'] in ['stop', 'status', 'restart']: - with open(path, 'rb') as file: - old_srv_config = pickle.load(file) - old_srv_config = {x: old_srv_config[x] for x in old_srv_config if x not in ['operation']} - srv_config.update(old_srv_config) - - serverdaemon = Etrigan(srv_config['etriganpid'], - logfile = srv_config['etriganlog'], loglevel = srv_config['etriganlev'], - mute = srv_config['etriganmute'], pause_loop = None) - - if srv_config['operation'] in ['start', 'restart']: - serverdaemon.want_quit = True - if srv_config['gui']: - serverdaemon.funcs_to_daemonize = [server_with_gui] - else: - server_without_gui = ServerWithoutGui() - serverdaemon.funcs_to_daemonize = [server_without_gui.start, server_without_gui.join] - indx_for_clean = lambda: (0, ) - serverdaemon.quit_on_stop = [indx_for_clean, server_without_gui.clean] - elif srv_config['operation'] == 'stop': - os.remove(path) - - Etrigan_job(srv_config['operation'], serverdaemon) - def server_check(): # Setup and some checks. check_setup(srv_config, srv_options, loggersrv, where = "srv") @@ -543,35 +467,15 @@ def server_main_terminal(): server_check() serverthread.checked = True - if 'etrigan' not in srv_config.values(): - # (without GUI) and (without daemon). - # Run threaded server. - serverqueue.put('start') - # Wait to finish. - try: - while serverthread.is_alive(): - serverthread.join(timeout = 0.5) - except (KeyboardInterrupt, SystemExit): - server_terminate(serverthread, exit_server = True, exit_thread = True) - else: - # (with or without GUI) and (with daemon) - # Setup daemon (eventually). - pretty_printer(log_obj = loggersrv.warning, put_text = "{reverse}{yellow}{bold}Etrigan support is deprecated and will be removed in the future!{end}") - server_daemon() - -def server_with_gui(): - import pykms_GuiBase - - pretty_printer(log_obj = loggersrv.warning, put_text = "{reverse}{yellow}{bold}Etrigan GUI support is deprecated and will be removed in the future!{end}") - - root = pykms_GuiBase.KmsGui() - root.title(pykms_GuiBase.gui_description + ' (' + pykms_GuiBase.gui_version + ')') - root.mainloop() - -def server_main_no_terminal(): - # Run tkinter GUI. - # (with GUI) and (without daemon). - server_with_gui() + # (without GUI) and (without daemon). + # Run threaded server. + serverqueue.put('start') + # Wait to finish. + try: + while serverthread.is_alive(): + serverthread.join(timeout = 0.5) + except (KeyboardInterrupt, SystemExit): + server_terminate(serverthread, exit_server = True, exit_thread = True) class kmsServerHandler(socketserver.BaseRequestHandler): def setup(self): @@ -636,10 +540,4 @@ def finish(self): serverthread.start() if __name__ == "__main__": - if sys.stdout.isatty(): - server_main_terminal() - else: - try: - server_main_no_terminal() - except: - server_main_terminal() + server_main_terminal() From f1fa5b794ff2f2d6241d5c0342bc69ae1aa5a612 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 9 Dec 2022 19:45:12 +0100 Subject: [PATCH 106/154] Removed Etrigan GUI support --- py-kms/pykms_Format.py | 7 +- py-kms/pykms_GuiBase.py | 948 ---------------------------------------- py-kms/pykms_GuiMisc.py | 517 ---------------------- 3 files changed, 1 insertion(+), 1471 deletions(-) delete mode 100644 py-kms/pykms_GuiBase.py delete mode 100644 py-kms/pykms_GuiMisc.py diff --git a/py-kms/pykms_Format.py b/py-kms/pykms_Format.py index dd968c0..d0d28c5 100644 --- a/py-kms/pykms_Format.py +++ b/py-kms/pykms_Format.py @@ -274,9 +274,7 @@ def execute(self): ShellMessage.indx += 1 def print_logging_setup(self, logger, async_flag, formatter = logging.Formatter('%(name)s %(message)s')): - from pykms_GuiBase import gui_redirector - stream = gui_redirector(StringIO()) - handler = logging.StreamHandler(stream) + handler = logging.StreamHandler(StringIO()) handler.name = 'LogStream' handler.setLevel(logging.INFO) handler.setFormatter(formatter) @@ -293,9 +291,6 @@ def print_logging_setup(self, logger, async_flag, formatter = logging.Formatter( def print_logging(self, toprint): if (self.nshell and ((0 in self.nshell) or (2 in self.nshell and not ShellMessage.viewclt))) or ShellMessage.indx == 0: - from pykms_GuiBase import gui_redirector_setup, gui_redirector_clear - gui_redirector_setup() - gui_redirector_clear() self.print_logging_setup(ShellMessage.loggersrv_pty, ShellMessage.asyncmsgsrv) self.print_logging_setup(ShellMessage.loggerclt_pty, ShellMessage.asyncmsgclt) diff --git a/py-kms/pykms_GuiBase.py b/py-kms/pykms_GuiBase.py deleted file mode 100644 index 30f5dec..0000000 --- a/py-kms/pykms_GuiBase.py +++ /dev/null @@ -1,948 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import os -import sys -import threading -from time import sleep -import tkinter as tk -from tkinter import ttk -from tkinter import messagebox -from tkinter import filedialog -import tkinter.font as tkFont - -from pykms_Server import srv_options, srv_version, srv_config, server_terminate, serverqueue, serverthread -from pykms_GuiMisc import ToolTip, TextDoubleScroll, TextRedirect, ListboxOfRadiobuttons -from pykms_GuiMisc import custom_background, custom_pages -from pykms_Client import clt_options, clt_version, clt_config, client_thread - -gui_version = "py-kms_gui_v3.0" -__license__ = "MIT License" -__author__ = u"Matteo ℱan " -__copyright__ = "© Copyright 2020" -__url__ = "https://github.com/SystemRage/py-kms" -gui_description = "A GUI for py-kms." - -##--------------------------------------------------------------------------------------------------------------------------------------------------------- -def get_ip_address(): - if os.name == 'posix': - import subprocess - ip = subprocess.getoutput("hostname -I") - elif os.name == 'nt': - import socket - ip = socket.gethostbyname(socket.gethostname()) - else: - ip = 'Unknown' - return ip - -def gui_redirector(stream, redirect_to = TextRedirect.Pretty, redirect_conditio = True, stderr_side = "srv"): - global txsrv, txclt, txcol - if redirect_conditio: - if stream == 'stdout': - sys.stdout = redirect_to(txsrv, txclt, txcol) - elif stream == 'stderr': - sys.stderr = redirect_to(txsrv, txclt, txcol, stderr_side) - else: - stream = redirect_to(txsrv, txclt, txcol) - return stream - -def gui_redirector_setup(): - TextRedirect.Pretty.tag_num = 0 - TextRedirect.Pretty.newlinecut = [-1, -2, -4, -5] - -def gui_redirector_clear(): - global txsrv, oysrv - try: - if oysrv: - txsrv.configure(state = 'normal') - txsrv.delete('1.0', 'end') - txsrv.configure(state = 'disabled') - except: - # self.onlysrv not defined (menu not used) - pass - -##----------------------------------------------------------------------------------------------------------------------------------------------------------- - -class KmsGui(tk.Tk): - def __init__(self, *args, **kwargs): - tk.Tk.__init__(self, *args, **kwargs) - self.wraplength = 200 - serverthread.with_gui = True - self.validation_int = (self.register(self.validate_int), "%S") - self.validation_float = (self.register(self.validate_float), "%P") - - ## Define fonts and colors. - self.customfonts = {'btn' : tkFont.Font(family = 'Fixedsys', size = 11, weight = 'bold'), - 'oth' : tkFont.Font(family = 'Times', size = 9, weight = 'bold'), - 'opt' : tkFont.Font(family = 'Fixedsys', size = 9, weight = 'bold'), - 'lst' : tkFont.Font(family = 'Fixedsys', size = 8, weight = 'bold', slant = 'italic'), - 'msg' : tkFont.Font(family = 'Monospace', size = 6), # need a monospaced type (like courier, etc..). - } - - self.customcolors = { 'black' : '#000000', - 'white' : '#FFFFFF', - 'green' : '#00EE76', - 'yellow' : '#FFFF00', - 'magenta' : '#CD00CD', - 'orange' : '#FFA500', - 'red' : '#FF4500', - 'blue' : '#1E90FF', - 'cyan' : '#AFEEEE', - 'lavender': '#E6E6FA', - 'brown' : '#A52A2A', - } - - self.option_add('*TCombobox*Listbox.font', self.customfonts['lst']) - - self.gui_create() - - def invert(self, widgets = []): - for widget in widgets: - if widget['state'] == 'normal': - widget.configure(state = 'disabled') - elif widget['state'] == 'disabled': - widget.configure(state = 'normal') - - def gui_menu(self): - self.onlysrv, self.onlyclt = (False for _ in range(2)) - menubar = tk.Menu(self) - prefmenu = tk.Menu(menubar, tearoff = 0, font = ("Noto Sans Regular", 10), borderwidth = 3, relief = 'ridge') - menubar.add_cascade(label = 'Preferences', menu = prefmenu) - prefmenu.add_command(label = 'Enable server-side mode', command = lambda: self.pref_onlysrv(prefmenu)) - prefmenu.add_command(label = 'Enable client-side mode', command = lambda: self.pref_onlyclt(prefmenu)) - self.config(menu = menubar) - - def pref_onlysrv(self, menu): - global oysrv - - if self.onlyclt or serverthread.is_running_server: - return - self.onlysrv = not self.onlysrv - if self.onlysrv: - menu.entryconfigure(0, label = 'Disable server-side mode') - self.clt_on_show(force_remove = True) - else: - menu.entryconfigure(0, label = 'Enable server-side mode') - self.invert(widgets = [self.shbtnclt]) - oysrv = self.onlysrv - - def pref_onlyclt(self, menu): - if self.onlysrv or serverthread.is_running_server: - return - self.onlyclt = not self.onlyclt - if self.onlyclt: - menu.entryconfigure(1, label = 'Disable client-side mode') - if self.shbtnclt['text'] == 'SHOW\nCLIENT': - self.clt_on_show(force_view = True) - self.optsrvwin.grid_remove() - self.msgsrvwin.grid_remove() - gui_redirector('stderr', redirect_to = TextRedirect.Stderr, stderr_side = "clt") - else: - menu.entryconfigure(1, label = 'Enable client-side mode') - self.optsrvwin.grid() - self.msgsrvwin.grid() - gui_redirector('stderr', redirect_to = TextRedirect.Stderr) - - self.invert(widgets = [self.runbtnsrv, self.shbtnclt, self.runbtnclt]) - - def gui_create(self): - ## Create server gui - self.gui_srv() - ## Create client gui + other operations. - self.gui_complete() - ## Create menu. - self.gui_menu() - ## Create globals for printing process (redirect stdout). - global txsrv, txclt, txcol - txsrv = self.textboxsrv.get() - txclt = self.textboxclt.get() - txcol = self.customcolors - ## Redirect stderr. - gui_redirector('stderr', redirect_to = TextRedirect.Stderr) - - def gui_pages_show(self, pagename, side): - # https://stackoverflow.com/questions/7546050/switch-between-two-frames-in-tkinter - # https://www.reddit.com/r/learnpython/comments/7xxtsy/trying_to_understand_tkinter_and_how_to_switch/ - pageside = self.pagewidgets[side] - tk.Misc.lift(pageside["PageWin"][pagename], aboveThis = None) - keylist = list(pageside["PageWin"].keys()) - - for elem in [pageside["BtnAni"], pageside["LblAni"]]: - if pagename == "PageStart": - elem["Left"].config(state = "disabled") - if len(keylist) == 2: - elem["Right"].config(state = "normal") - elif pagename == "PageEnd": - elem["Right"].config(state = "disabled") - if len(keylist) == 2: - elem["Left"].config(state = "normal") - else: - for where in ["Left", "Right"]: - elem[where].config(state = "normal") - - if pagename != "PageStart": - page_l = keylist[keylist.index(pagename) - 1] - pageside["BtnAni"]["Left"]['command'] = lambda pag=page_l, pos=side: self.gui_pages_show(pag, pos) - if pagename != "PageEnd": - page_r = keylist[keylist.index(pagename) + 1] - pageside["BtnAni"]["Right"]['command'] = lambda pag=page_r, pos=side: self.gui_pages_show(pag, pos) - - def gui_pages_buttons(self, parent, side): - btnwin = tk.Canvas(parent, background = self.customcolors['white'], borderwidth = 3, relief = 'ridge') - btnwin.grid(row = 14, column = 2, padx = 2, pady = 2, sticky = 'nsew') - btnwin.grid_columnconfigure(1, weight = 1) - self.pagewidgets[side]["BtnWin"] = btnwin - - for position in ["Left", "Right"]: - if position == "Left": - col = [0, 0, 1] - stick = 'e' - elif position == "Right": - col = [2, 1, 0] - stick = 'w' - - aniwin = tk.Canvas(btnwin, background = self.customcolors['white'], borderwidth = 0, relief = 'ridge') - aniwin.grid(row = 0, column = col[0], padx = 5, pady = 5, sticky = 'nsew') - self.pagewidgets[side]["AniWin"][position] = aniwin - - lblani = tk.Label(aniwin, width = 1, height = 1) - lblani.grid(row = 0, column = col[1], padx = 2, pady = 2, sticky = stick) - self.pagewidgets[side]["LblAni"][position] = lblani - - btnani = tk.Button(aniwin) - btnani.grid(row = 0, column = col[2], padx = 2, pady = 2, sticky = stick) - self.pagewidgets[side]["BtnAni"][position] = btnani - ## Customize buttons. - custom_pages(self, side) - - def gui_pages_create(self, parent, side, create = {}): - self.pagewidgets.update({side : {"PageWin" : create, - "BtnWin" : None, - "BtnAni" : {"Left" : None, - "Right" : None}, - "AniWin" : {"Left" : None, - "Right" : None}, - "LblAni" : {"Left" : None, - "Right" : None}, - } - }) - - for pagename in self.pagewidgets[side]["PageWin"].keys(): - page = tk.Canvas(parent, background = self.customcolors['white'], borderwidth = 3, relief = 'ridge') - self.pagewidgets[side]["PageWin"][pagename] = page - page.grid(row = 0, column = 2, padx = 2, pady = 2, sticky = "nsew") - page.grid_columnconfigure(1, weight = 1) - self.gui_pages_buttons(parent = parent, side = side) - self.gui_pages_show("PageStart", side = side) - - def gui_store(self, side, typewidgets): - stored = [] - for pagename in self.pagewidgets[side]["PageWin"].keys(): - for widget in self.pagewidgets[side]["PageWin"][pagename].winfo_children(): - if widget.winfo_class() in typewidgets: - stored.append(widget) - return stored - - def gui_srv(self): - ## Create main containers. ------------------------------------------------------------------------------------------------------------------ - self.masterwin = tk.Canvas(self, borderwidth = 3, relief = tk.RIDGE) - self.btnsrvwin = tk.Canvas(self.masterwin, background = self.customcolors['white'], borderwidth = 3, relief = 'ridge') - self.optsrvwin = tk.Canvas(self.masterwin, background = self.customcolors['white'], borderwidth = 3, relief = 'ridge') - self.msgsrvwin = tk.Frame(self.masterwin, background = self.customcolors['black'], relief = 'ridge', width = 300, height = 200) - - ## Layout main containers. - self.masterwin.grid(row = 0, column = 0, sticky = 'nsew') - self.btnsrvwin.grid(row = 0, column = 1, padx = 2, pady = 2, sticky = 'nw') - self.optsrvwin.grid(row = 0, column = 2, padx = 2, pady = 2, sticky = 'nsew') - self.optsrvwin.grid_rowconfigure(0, weight = 1) - self.optsrvwin.grid_columnconfigure(1, weight = 1) - - self.pagewidgets = {} - - ## Subpages of "optsrvwin". - self.gui_pages_create(parent = self.optsrvwin, side = "Srv", create = {"PageStart": None, - "PageEnd": None}) - - ## Continue to grid. - self.msgsrvwin.grid(row = 1, column = 2, padx = 1, pady = 1, sticky = 'nsew') - self.msgsrvwin.grid_propagate(False) - self.msgsrvwin.grid_columnconfigure(0, weight = 1) - self.msgsrvwin.grid_rowconfigure(0, weight = 1) - - ## Create widgets (btnsrvwin) --------------------------------------------------------------------------------------------------------------- - self.statesrv = tk.Label(self.btnsrvwin, text = 'Server\nState:\nStopped', font = self.customfonts['oth'], - foreground = self.customcolors['red']) - self.runbtnsrv = tk.Button(self.btnsrvwin, text = 'START\nSERVER', background = self.customcolors['green'], - foreground = self.customcolors['white'], relief = 'raised', font = self.customfonts['btn'], - command = self.srv_on_start) - self.shbtnclt = tk.Button(self.btnsrvwin, text = 'SHOW\nCLIENT', background = self.customcolors['magenta'], - foreground = self.customcolors['white'], relief = 'raised', font = self.customfonts['btn'], - command = self.clt_on_show) - self.defaubtnsrv = tk.Button(self.btnsrvwin, text = 'DEFAULTS', background = self.customcolors['brown'], - foreground = self.customcolors['white'], relief = 'raised', font = self.customfonts['btn'], - command = self.on_defaults) - self.clearbtnsrv = tk.Button(self.btnsrvwin, text = 'CLEAR', background = self.customcolors['orange'], - foreground = self.customcolors['white'], relief = 'raised', font = self.customfonts['btn'], - command = lambda: self.on_clear([txsrv, txclt])) - self.exitbtnsrv = tk.Button(self.btnsrvwin, text = 'EXIT', background = self.customcolors['black'], - foreground = self.customcolors['white'], relief = 'raised', font = self.customfonts['btn'], - command = self.on_exit) - - ## Layout widgets (btnsrvwin) - self.statesrv.grid(row = 0, column = 0, padx = 2, pady = 2, sticky = 'ew') - self.runbtnsrv.grid(row = 1, column = 0, padx = 2, pady = 2, sticky = 'ew') - self.shbtnclt.grid(row = 2, column = 0, padx = 2, pady = 2, sticky = 'ew') - self.defaubtnsrv.grid(row = 3, column = 0, padx = 2, pady = 2, sticky = 'ew') - self.clearbtnsrv.grid(row = 4, column = 0, padx = 2, pady = 2, sticky = 'ew') - self.exitbtnsrv.grid(row = 5, column = 0, padx = 2, pady = 2, sticky = 'ew') - - ## Create widgets (optsrvwin:Srv:PageWin:PageStart) ----------------------------------------------------------------------------------------- - # Version. - ver = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], - text = 'You are running server version: ' + srv_version, font = self.customfonts['oth'], - foreground = self.customcolors['red']) - # Ip Address. - srvipaddlbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'IP Address: ', font = self.customfonts['opt']) - self.srvipadd = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'ip') - self.srvipadd.insert('end', srv_options['ip']['def']) - ToolTip(self.srvipadd, text = srv_options['ip']['help'], wraplength = self.wraplength) - myipadd = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'Your IP address is: {}'.format(get_ip_address()), - font = self.customfonts['oth'], foreground = self.customcolors['red']) - # Port. - srvportlbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'Port: ', font = self.customfonts['opt']) - self.srvport = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'port', - validate = "key", validatecommand = self.validation_int) - self.srvport.insert('end', str(srv_options['port']['def'])) - ToolTip(self.srvport, text = srv_options['port']['help'], wraplength = self.wraplength) - # EPID. - epidlbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'EPID: ', font = self.customfonts['opt']) - self.epid = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'epid') - self.epid.insert('end', str(srv_options['epid']['def'])) - ToolTip(self.epid, text = srv_options['epid']['help'], wraplength = self.wraplength) - # LCID. - lcidlbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'LCID: ', font = self.customfonts['opt']) - self.lcid = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'lcid', - validate = "key", validatecommand = self.validation_int) - self.lcid.insert('end', str(srv_options['lcid']['def'])) - ToolTip(self.lcid, text = srv_options['lcid']['help'], wraplength = self.wraplength) - # HWID. - hwidlbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'HWID: ', font = self.customfonts['opt']) - self.hwid = ttk.Combobox(self.pagewidgets["Srv"]["PageWin"]["PageStart"], values = (str(srv_options['hwid']['def']), 'RANDOM'), - width = 17, height = 10, font = self.customfonts['lst'], name = 'hwid') - self.hwid.set(str(srv_options['hwid']['def'])) - ToolTip(self.hwid, text = srv_options['hwid']['help'], wraplength = self.wraplength) - # Client Count - countlbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'Client Count: ', font = self.customfonts['opt']) - self.count = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'count') - self.count.insert('end', str(srv_options['count']['def'])) - ToolTip(self.count, text = srv_options['count']['help'], wraplength = self.wraplength) - # Activation Interval. - activlbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'Activation Interval: ', font = self.customfonts['opt']) - self.activ = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'activation', - validate = "key", validatecommand = self.validation_int) - self.activ.insert('end', str(srv_options['activation']['def'])) - ToolTip(self.activ, text = srv_options['activation']['help'], wraplength = self.wraplength) - # Renewal Interval. - renewlbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'Renewal Interval: ', font = self.customfonts['opt']) - self.renew = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'renewal', - validate = "key", validatecommand = self.validation_int) - self.renew.insert('end', str(srv_options['renewal']['def'])) - ToolTip(self.renew, text = srv_options['renewal']['help'], wraplength = self.wraplength) - # Logfile. - srvfilelbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'Logfile Path / Name: ', font = self.customfonts['opt']) - self.srvfile = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'lfile') - self.srvfile.insert('end', srv_options['lfile']['def']) - self.srvfile.xview_moveto(1) - ToolTip(self.srvfile, text = srv_options['lfile']['help'], wraplength = self.wraplength) - srvfilebtnwin = tk.Button(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'Browse', font = self.customfonts['opt'], - command = lambda: self.on_browse(self.srvfile, srv_options)) - # Loglevel. - srvlevellbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'Loglevel: ', font = self.customfonts['opt']) - self.srvlevel = ttk.Combobox(self.pagewidgets["Srv"]["PageWin"]["PageStart"], values = tuple(srv_options['llevel']['choi']), - width = 10, height = 10, font = self.customfonts['lst'], state = "readonly", name = 'llevel') - self.srvlevel.set(srv_options['llevel']['def']) - ToolTip(self.srvlevel, text = srv_options['llevel']['help'], wraplength = self.wraplength) - # Logsize. - srvsizelbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'Logsize: ', font = self.customfonts['opt']) - self.srvsize = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'lsize', - validate = "key", validatecommand = self.validation_float) - self.srvsize.insert('end', srv_options['lsize']['def']) - ToolTip(self.srvsize, text = srv_options['lsize']['help'], wraplength = self.wraplength) - # Asynchronous messages. - self.chkvalsrvasy = tk.BooleanVar() - self.chkvalsrvasy.set(srv_options['asyncmsg']['def']) - chksrvasy = tk.Checkbutton(self.pagewidgets["Srv"]["PageWin"]["PageStart"], text = 'Async\nMsg', - font = self.customfonts['opt'], var = self.chkvalsrvasy, relief = 'groove', name = 'asyncmsg') - ToolTip(chksrvasy, text = srv_options['asyncmsg']['help'], wraplength = self.wraplength) - - # Listbox radiobuttons server. - self.chksrvfile = ListboxOfRadiobuttons(self.pagewidgets["Srv"]["PageWin"]["PageStart"], - ['FILE', 'FILEOFF', 'STDOUT', 'STDOUTOFF', 'FILESTDOUT'], - self.customfonts['lst'], - changed = [(self.srvfile, srv_options['lfile']['def']), - (srvfilebtnwin, ''), - (self.srvsize, srv_options['lsize']['def']), - (self.srvlevel, srv_options['llevel']['def'])], - width = 10, height = 1, borderwidth = 2, relief = 'ridge') - - ## Layout widgets (optsrvwin:Srv:PageWin:PageStart) - ver.grid(row = 0, column = 0, columnspan = 3, padx = 5, pady = 5, sticky = 'ew') - srvipaddlbl.grid(row = 1, column = 0, padx = 5, pady = 5, sticky = 'e') - self.srvipadd.grid(row = 1, column = 1, padx = 5, pady = 5, sticky = 'ew') - myipadd.grid(row = 2, column = 1, columnspan = 2, padx = 5, pady = 5, sticky = 'ew') - srvportlbl.grid(row = 3, column = 0, padx = 5, pady = 5, sticky = 'e') - self.srvport.grid(row = 3, column = 1, padx = 5, pady = 5, sticky = 'ew') - epidlbl.grid(row = 4, column = 0, padx = 5, pady = 5, sticky = 'e') - self.epid.grid(row = 4, column = 1, padx = 5, pady = 5, sticky = 'ew') - lcidlbl.grid(row = 5, column = 0, padx = 5, pady = 5, sticky = 'e') - self.lcid.grid(row = 5, column = 1, padx = 5, pady = 5, sticky = 'ew') - hwidlbl.grid(row = 6, column = 0, padx = 5, pady = 5, sticky = 'e') - self.hwid.grid(row = 6, column = 1, padx = 5, pady = 5, sticky = 'ew') - countlbl.grid(row = 7, column = 0, padx = 5, pady = 5, sticky = 'e') - self.count.grid(row = 7, column = 1, padx = 5, pady = 5, sticky = 'ew') - activlbl.grid(row = 8, column = 0, padx = 5, pady = 5, sticky = 'e') - self.activ.grid(row = 8, column = 1, padx = 5, pady = 5, sticky = 'ew') - renewlbl.grid(row = 9, column = 0, padx = 5, pady = 5, sticky = 'e') - self.renew.grid(row = 9, column = 1, padx = 5, pady = 5, sticky = 'ew') - srvfilelbl.grid(row = 10, column = 0, padx = 5, pady = 5, sticky = 'e') - self.srvfile.grid(row = 10, column = 1, padx = 5, pady = 5, sticky = 'ew') - srvfilebtnwin.grid(row = 10, column = 2, padx = 5, pady = 5, sticky = 'ew') - self.chksrvfile.grid(row = 11, column = 1, padx = 5, pady = 5, sticky = 'ew') - chksrvasy.grid(row = 11, column = 2, padx = 5, pady = 5, sticky = 'ew') - srvlevellbl.grid(row = 12, column = 0, padx = 5, pady = 5, sticky = 'e') - self.srvlevel.grid(row = 12, column = 1, padx = 5, pady = 5, sticky = 'ew') - srvsizelbl.grid(row = 13, column = 0, padx = 5, pady = 5, sticky = 'e') - self.srvsize.grid(row = 13, column = 1, padx = 5, pady = 5, sticky = 'ew') - - ## Create widgets (optsrvwin:Srv:PageWin:PageEnd)------------------------------------------------------------------------------------------- - # Timeout connection. - srvtimeout0lbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageEnd"], text = 'Timeout connection: ', font = self.customfonts['opt']) - self.srvtimeout0 = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageEnd"], width = 16, font = self.customfonts['opt'], name = 'time0') - self.srvtimeout0.insert('end', str(srv_options['time0']['def'])) - ToolTip(self.srvtimeout0, text = srv_options['time0']['help'], wraplength = self.wraplength) - # Timeout send/recv. - srvtimeout1lbl = tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageEnd"], text = 'Timeout send-recv: ', font = self.customfonts['opt']) - self.srvtimeout1 = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageEnd"], width = 16, font = self.customfonts['opt'], name = 'time1') - self.srvtimeout1.insert('end', str(srv_options['time1']['def'])) - ToolTip(self.srvtimeout1, text = srv_options['time1']['help'], wraplength = self.wraplength) - # Sqlite database. - self.chkvalsql = tk.BooleanVar() - self.chkvalsql.set(srv_options['sql']['def']) - self.chkfilesql = tk.Entry(self.pagewidgets["Srv"]["PageWin"]["PageEnd"], width = 16, font = self.customfonts['opt'], name = 'sql') - self.chkfilesql.insert('end', srv_options['sql']['file']) - self.chkfilesql.xview_moveto(1) - self.chkfilesql.configure(state = 'disabled') - - chksql = tk.Checkbutton(self.pagewidgets["Srv"]["PageWin"]["PageEnd"], text = 'Create Sqlite\nDatabase', - font = self.customfonts['opt'], var = self.chkvalsql, relief = 'groove', - command = lambda: self.sql_status()) - ToolTip(chksql, text = srv_options['sql']['help'], wraplength = self.wraplength) - - ## Layout widgets (optsrvwin:Srv:PageWin:PageEnd) - # a label for vertical aligning with PageStart - tk.Label(self.pagewidgets["Srv"]["PageWin"]["PageEnd"], width = 0, - height = 0, bg = self.customcolors['lavender']).grid(row = 0, column = 0, padx = 5, pady = 5, sticky = 'nw') - srvtimeout0lbl.grid(row = 1, column = 0, padx = 5, pady = 5, sticky = 'e') - self.srvtimeout0.grid(row = 1, column = 1, padx = 5, pady = 5, sticky = 'w') - srvtimeout1lbl.grid(row = 2, column = 0, padx = 5, pady = 5, sticky = 'e') - self.srvtimeout1.grid(row = 2, column = 1, padx = 5, pady = 5, sticky = 'w') - chksql.grid(row = 3, column = 0, padx = 5, pady = 5, sticky = 'e') - self.chkfilesql.grid(row = 3, column = 1, padx = 5, pady = 5, sticky = 'w') - - # Store server-side widgets. - self.storewidgets_srv = self.gui_store(side = "Srv", typewidgets = ['Button', 'Entry', 'TCombobox', 'Checkbutton']) - self.storewidgets_srv.append(self.chksrvfile) - - ## Create widgets and layout (msgsrvwin) --------------------------------------------------------------------------------------------------- - self.textboxsrv = TextDoubleScroll(self.msgsrvwin, background = self.customcolors['black'], wrap = 'none', state = 'disabled', - relief = 'ridge', font = self.customfonts['msg']) - self.textboxsrv.put() - - def sql_status(self): - if self.chkvalsql.get(): - self.chkfilesql.configure(state = 'normal') - else: - self.chkfilesql.insert('end', srv_options['sql']['file']) - self.chkfilesql.xview_moveto(1) - self.chkfilesql.configure(state = 'disabled') - - def always_centered(self, geo, centered, refs): - x = (self.winfo_screenwidth() // 2) - (self.winfo_width() // 2) - y = (self.winfo_screenheight() // 2) - (self.winfo_height() // 2) - w, h, dx, dy = geo.split('+')[0].split('x') + geo.split('+')[1:] - - if w == refs[1]: - if centered: - self.geometry('+%d+%d' %(x, y)) - centered = False - elif w == refs[0]: - if not centered: - self.geometry('+%d+%d' %(x, y)) - centered = True - - if dx != str(x) or dy != str(y): - self.geometry('+%d+%d' %(x, 0)) - - self.after(200, self.always_centered, self.geometry(), centered, refs) - - def gui_complete(self): - ## Create client widgets (optcltwin, msgcltwin, btncltwin) - self.update_idletasks() # update Gui to get btnsrvwin values --> btncltwin. - minw, minh = self.winfo_width(), self.winfo_height() - self.iconify() - self.gui_clt() - maxw, minh = self.winfo_width(), self.winfo_height() - ## Main window custom background. - self.update_idletasks() # update Gui for custom background - self.iconify() - custom_background(self) - ## Main window other modifications. - self.eval('tk::PlaceWindow %s center' %self.winfo_pathname(self.winfo_id())) - self.wm_attributes("-topmost", True) - self.protocol("WM_DELETE_WINDOW", lambda: 0) - ## Disable maximize button. - self.resizable(False, False) - ## Centered window. - self.always_centered(self.geometry(), False, [minw, maxw]) - - def get_position(self, widget): - x, y = (widget.winfo_x(), widget.winfo_y()) - w, h = (widget.winfo_width(), widget.winfo_height()) - return x, y, w, h - - def gui_clt(self): - self.count_clear, self.keep_clear = (0, '0.0') - self.optcltwin = tk.Canvas(self.masterwin, background = self.customcolors['white'], borderwidth = 3, relief = 'ridge') - self.msgcltwin = tk.Frame(self.masterwin, background = self.customcolors['black'], relief = 'ridge', width = 300, height = 200) - self.btncltwin = tk.Canvas(self.masterwin, background = self.customcolors['white'], borderwidth = 3, relief = 'ridge') - - xb, yb, wb, hb = self.get_position(self.btnsrvwin) - self.btncltwin_X = xb - self.btncltwin_Y = yb + hb + 6 - self.btncltwin.place(x = self.btncltwin_X, y = self.btncltwin_Y, bordermode = 'outside', anchor = 'center') - - self.optcltwin.grid(row = 0, column = 4, padx = 2, pady = 2, sticky = 'nsew') - self.optcltwin.grid_rowconfigure(0, weight = 1) - self.optcltwin.grid_columnconfigure(1, weight = 1) - - ## Subpages of "optcltwin". - self.gui_pages_create(parent = self.optcltwin, side = "Clt", create = {"PageStart": None, - "PageEnd": None}) - - ## Continue to grid. - self.msgcltwin.grid(row = 1, column = 4, padx = 1, pady = 1, sticky = 'nsew') - self.msgcltwin.grid_propagate(False) - self.msgcltwin.grid_columnconfigure(0, weight = 1) - self.msgcltwin.grid_rowconfigure(0, weight = 1) - - ## Create widgets (btncltwin) ---------------------------------------------------------------------------------------------------------------- - self.runbtnclt = tk.Button(self.btncltwin, text = 'START\nCLIENT', background = self.customcolors['blue'], - foreground = self.customcolors['white'], relief = 'raised', font = self.customfonts['btn'], - state = 'disabled', command = self.clt_on_start, width = 8, height = 2) - - ## Layout widgets (btncltwin) - self.runbtnclt.grid(row = 0, column = 0, padx = 2, pady = 2, sticky = 'ew') - - ## Create widgets (optcltwin:Clt:PageWin:PageStart) ------------------------------------------------------------------------------------------ - # Version. - cltver = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'You are running client version: ' + clt_version, - font = self.customfonts['oth'], foreground = self.customcolors['red']) - # Ip Address. - cltipaddlbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'IP Address: ', font = self.customfonts['opt']) - self.cltipadd = tk.Entry(self.pagewidgets["Clt"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'ip') - self.cltipadd.insert('end', clt_options['ip']['def']) - ToolTip(self.cltipadd, text = clt_options['ip']['help'], wraplength = self.wraplength) - # Port. - cltportlbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'Port: ', font = self.customfonts['opt']) - self.cltport = tk.Entry(self.pagewidgets["Clt"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'port', - validate = "key", validatecommand = self.validation_int) - self.cltport.insert('end', str(clt_options['port']['def'])) - ToolTip(self.cltport, text = clt_options['port']['help'], wraplength = self.wraplength) - # Mode. - cltmodelbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'Mode: ', font = self.customfonts['opt']) - self.cltmode = ttk.Combobox(self.pagewidgets["Clt"]["PageWin"]["PageStart"], values = tuple(clt_options['mode']['choi']), - width = 17, height = 10, font = self.customfonts['lst'], state = "readonly", name = 'mode') - self.cltmode.set(clt_options['mode']['def']) - ToolTip(self.cltmode, text = clt_options['mode']['help'], wraplength = self.wraplength) - # CMID. - cltcmidlbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'CMID: ', font = self.customfonts['opt']) - self.cltcmid = tk.Entry(self.pagewidgets["Clt"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'cmid') - self.cltcmid.insert('end', str(clt_options['cmid']['def'])) - ToolTip(self.cltcmid, text = clt_options['cmid']['help'], wraplength = self.wraplength) - # Machine Name. - cltnamelbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'Machine Name: ', font = self.customfonts['opt']) - self.cltname = tk.Entry(self.pagewidgets["Clt"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'name') - self.cltname.insert('end', str(clt_options['name']['def'])) - ToolTip(self.cltname, text = clt_options['name']['help'], wraplength = self.wraplength) - # Logfile. - cltfilelbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'Logfile Path / Name: ', font = self.customfonts['opt']) - self.cltfile = tk.Entry(self.pagewidgets["Clt"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'lfile') - self.cltfile.insert('end', clt_options['lfile']['def']) - self.cltfile.xview_moveto(1) - ToolTip(self.cltfile, text = clt_options['lfile']['help'], wraplength = self.wraplength) - cltfilebtnwin = tk.Button(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'Browse', font = self.customfonts['opt'], - command = lambda: self.on_browse(self.cltfile, clt_options)) - # Loglevel. - cltlevellbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'Loglevel: ', font = self.customfonts['opt']) - self.cltlevel = ttk.Combobox(self.pagewidgets["Clt"]["PageWin"]["PageStart"], values = tuple(clt_options['llevel']['choi']), - width = 10, height = 10, font = self.customfonts['lst'], state = "readonly", name = 'llevel') - self.cltlevel.set(clt_options['llevel']['def']) - ToolTip(self.cltlevel, text = clt_options['llevel']['help'], wraplength = self.wraplength) - # Logsize. - cltsizelbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'Logsize: ', font = self.customfonts['opt']) - self.cltsize = tk.Entry(self.pagewidgets["Clt"]["PageWin"]["PageStart"], width = 10, font = self.customfonts['opt'], name = 'lsize', - validate = "key", validatecommand = self.validation_float) - self.cltsize.insert('end', clt_options['lsize']['def']) - ToolTip(self.cltsize, text = clt_options['lsize']['help'], wraplength = self.wraplength) - # Asynchronous messages. - self.chkvalcltasy = tk.BooleanVar() - self.chkvalcltasy.set(clt_options['asyncmsg']['def']) - chkcltasy = tk.Checkbutton(self.pagewidgets["Clt"]["PageWin"]["PageStart"], text = 'Async\nMsg', - font = self.customfonts['opt'], var = self.chkvalcltasy, relief = 'groove', name = 'asyncmsg') - ToolTip(chkcltasy, text = clt_options['asyncmsg']['help'], wraplength = self.wraplength) - - # Listbox radiobuttons client. - self.chkcltfile = ListboxOfRadiobuttons(self.pagewidgets["Clt"]["PageWin"]["PageStart"], - ['FILE', 'FILEOFF', 'STDOUT', 'STDOUTOFF', 'FILESTDOUT'], - self.customfonts['lst'], - changed = [(self.cltfile, clt_options['lfile']['def']), - (cltfilebtnwin, ''), - (self.cltsize, clt_options['lsize']['def']), - (self.cltlevel, clt_options['llevel']['def'])], - width = 10, height = 1, borderwidth = 2, relief = 'ridge') - - ## Layout widgets (optcltwin:Clt:PageWin:PageStart) - cltver.grid(row = 0, column = 0, columnspan = 3, padx = 5, pady = 5, sticky = 'ew') - cltipaddlbl.grid(row = 1, column = 0, padx = 5, pady = 5, sticky = 'e') - self.cltipadd.grid(row = 1, column = 1, padx = 5, pady = 5, sticky = 'ew') - cltportlbl.grid(row = 2, column = 0, padx = 5, pady = 5, sticky = 'e') - self.cltport.grid(row = 2, column = 1, padx = 5, pady = 5, sticky = 'ew') - cltmodelbl.grid(row = 3, column = 0, padx = 5, pady = 5, sticky = 'e') - self.cltmode.grid(row = 3, column = 1, padx = 5, pady = 5, sticky = 'ew') - cltcmidlbl.grid(row = 4, column = 0, padx = 5, pady = 5, sticky = 'e') - self.cltcmid.grid(row = 4, column = 1, padx = 5, pady = 5, sticky = 'ew') - cltnamelbl.grid(row = 5, column = 0, padx = 5, pady = 5, sticky = 'e') - self.cltname.grid(row = 5, column = 1, padx = 5, pady = 5, sticky = 'ew') - cltfilelbl.grid(row = 6, column = 0, padx = 5, pady = 5, sticky = 'e') - self.cltfile.grid(row = 6, column = 1, padx = 5, pady = 5, sticky = 'ew') - cltfilebtnwin.grid(row = 6, column = 2, padx = 5, pady = 5, sticky = 'ew') - self.chkcltfile.grid(row = 7, column = 1, padx = 5, pady = 5, sticky = 'ew') - chkcltasy.grid(row = 7, column = 2, padx = 5, pady = 5, sticky = 'ew') - cltlevellbl.grid(row = 8, column = 0, padx = 5, pady = 5, sticky = 'e') - self.cltlevel.grid(row = 8, column = 1, padx = 5, pady = 5, sticky = 'ew') - cltsizelbl.grid(row = 9, column = 0, padx = 5, pady = 5, sticky = 'e') - self.cltsize.grid(row = 9, column = 1, padx = 5, pady = 5, sticky = 'ew') - - # ugly fix when client-side mode is activated. - templbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageStart"], - bg = self.customcolors['lavender']).grid(row = 10, column = 0, - padx = 35, pady = 54, sticky = 'e') - - ## Create widgets (optcltwin:Clt:PageWin:PageEnd) ------------------------------------------------------------------------------------------- - # Timeout connection. - clttimeout0lbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageEnd"], text = 'Timeout connection: ', font = self.customfonts['opt']) - self.clttimeout0 = tk.Entry(self.pagewidgets["Clt"]["PageWin"]["PageEnd"], width = 16, font = self.customfonts['opt'], name = 'time0') - self.clttimeout0.insert('end', str(clt_options['time0']['def'])) - ToolTip(self.clttimeout0, text = clt_options['time0']['help'], wraplength = self.wraplength) - # Timeout send/recv. - clttimeout1lbl = tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageEnd"], text = 'Timeout send-recv: ', font = self.customfonts['opt']) - self.clttimeout1 = tk.Entry(self.pagewidgets["Clt"]["PageWin"]["PageEnd"], width = 16, font = self.customfonts['opt'], name = 'time1') - self.clttimeout1.insert('end', str(clt_options['time1']['def'])) - ToolTip(self.clttimeout1, text = clt_options['time1']['help'], wraplength = self.wraplength) - - ## Layout widgets (optcltwin:Clt:PageWin:PageEnd) - # a label for vertical aligning with PageStart - tk.Label(self.pagewidgets["Clt"]["PageWin"]["PageEnd"], width = 0, - height = 0, bg = self.customcolors['lavender']).grid(row = 0, column = 0, padx = 5, pady = 5, sticky = 'nw') - clttimeout0lbl.grid(row = 1, column = 0, padx = 5, pady = 5, sticky = 'e') - self.clttimeout0.grid(row = 1, column = 1, padx = 5, pady = 5, sticky = 'w') - clttimeout1lbl.grid(row = 2, column = 0, padx = 5, pady = 5, sticky = 'e') - self.clttimeout1.grid(row = 2, column = 1, padx = 5, pady = 5, sticky = 'w') - - ## Store client-side widgets. - self.storewidgets_clt = self.gui_store(side = "Clt", typewidgets = ['Button', 'Entry', 'TCombobox', 'Checkbutton']) - self.storewidgets_clt.append(self.chkcltfile) - - ## Create widgets and layout (msgcltwin) ----------------------------------------------------------------------------------------------------- - self.textboxclt = TextDoubleScroll(self.msgcltwin, background = self.customcolors['black'], wrap = 'none', state = 'disabled', - relief = 'ridge', font = self.customfonts['msg']) - self.textboxclt.put() - - def prep_option(self, value): - try: - # is an INT - return int(value) - except (TypeError, ValueError): - try: - # is a FLOAT - return float(value) - except (TypeError, ValueError): - # is a STRING. - return value - - def prep_logfile(self, filepath, status): - # FILE (pretty on, log view off, logfile yes) - # FILEOFF (pretty on, log view off, no logfile) - # STDOUT (pretty off, log view on, no logfile) - # STDOUTOFF (pretty off, log view off, logfile yes) - # FILESTDOUT (pretty off, log view on, logfile yes) - - if status == 'FILE': - return filepath - elif status in ['FILESTDOUT', 'STDOUTOFF']: - return [status, filepath] - elif status in ['STDOUT', 'FILEOFF']: - return status - - def validate_int(self, value): - return value == "" or value.isdigit() - - def validate_float(self, value): - if value == "": - return True - try: - float(value) - return True - except ValueError: - return False - - def clt_on_show(self, force_remove = False, force_view = False): - if self.optcltwin.winfo_ismapped() or force_remove: - self.shbtnclt.configure(text = 'SHOW\nCLIENT', relief = 'raised') - self.optcltwin.grid_remove() - self.msgcltwin.grid_remove() - self.btncltwin.place_forget() - elif not self.optcltwin.winfo_ismapped() or force_view: - self.shbtnclt.configure(text = 'HIDE\nCLIENT', relief = 'sunken') - self.optcltwin.grid() - self.msgcltwin.grid() - self.btncltwin.place(x = self.btncltwin_X, y = self.btncltwin_Y, bordermode = 'inside', anchor = 'nw') - - def srv_on_start(self): - if self.runbtnsrv['text'] == 'START\nSERVER': - self.on_clear([txsrv, txclt]) - self.srv_actions_start() - # wait for switch. - while not serverthread.is_running_server: - pass - - self.srv_toggle_all(on_start = True) - # run thread for interrupting server when an error happens. - self.srv_eject_thread = threading.Thread(target = self.srv_eject, name = "Thread-SrvEjt") - self.srv_eject_thread.setDaemon(True) - self.srv_eject_thread.start() - - elif self.runbtnsrv['text'] == 'STOP\nSERVER': - serverthread.terminate_eject() - - def srv_eject(self): - while not serverthread.eject: - sleep(0.1) - self.srv_actions_stop() - - def srv_actions_start(self): - srv_config[srv_options['ip']['des']] = self.srvipadd.get() - srv_config[srv_options['port']['des']] = self.prep_option(self.srvport.get()) - srv_config[srv_options['epid']['des']] = self.epid.get() - srv_config[srv_options['lcid']['des']] = self.prep_option(self.lcid.get()) - srv_config[srv_options['hwid']['des']] = self.hwid.get() - srv_config[srv_options['count']['des']] = self.prep_option(self.count.get()) - srv_config[srv_options['activation']['des']] = self.prep_option(self.activ.get()) - srv_config[srv_options['renewal']['des']] = self.prep_option(self.renew.get()) - srv_config[srv_options['lfile']['des']] = self.prep_logfile(self.srvfile.get(), self.chksrvfile.state()) - srv_config[srv_options['asyncmsg']['des']] = self.chkvalsrvasy.get() - srv_config[srv_options['llevel']['des']] = self.srvlevel.get() - srv_config[srv_options['lsize']['des']] = self.prep_option(self.srvsize.get()) - - srv_config[srv_options['time0']['des']] = self.prep_option(self.srvtimeout0.get()) - srv_config[srv_options['time1']['des']] = self.prep_option(self.srvtimeout1.get()) - srv_config[srv_options['sql']['des']] = (self.chkfilesql.get() if self.chkvalsql.get() else self.chkvalsql.get()) - - ## Redirect stdout. - gui_redirector('stdout', redirect_to = TextRedirect.Log, - redirect_conditio = (srv_config[srv_options['lfile']['des']] in ['STDOUT', 'FILESTDOUT'])) - serverqueue.put('start') - - def srv_actions_stop(self): - if serverthread.is_running_server: - if serverthread.server is not None: - server_terminate(serverthread, exit_server = True) - # wait for switch. - while serverthread.is_running_server: - pass - else: - serverthread.is_running_server = False - self.srv_toggle_all(on_start = False) - self.count_clear, self.keep_clear = (0, '0.0') - - def srv_toggle_all(self, on_start = True): - self.srv_toggle_state() - if on_start: - self.runbtnsrv.configure(text = 'STOP\nSERVER', background = self.customcolors['red'], - foreground = self.customcolors['white'], relief = 'sunken') - for widget in self.storewidgets_srv: - widget.configure(state = 'disabled') - self.runbtnclt.configure(state = 'normal') - else: - self.runbtnsrv.configure(text = 'START\nSERVER', background = self.customcolors['green'], - foreground = self.customcolors['white'], relief = 'raised') - for widget in self.storewidgets_srv: - widget.configure(state = 'normal') - if isinstance(widget, ListboxOfRadiobuttons): - widget.change() - self.runbtnclt.configure(state = 'disabled') - - def srv_toggle_state(self): - if serverthread.is_running_server: - txt, color = ('Server\nState:\nServing', self.customcolors['green']) - else: - txt, color = ('Server\nState:\nStopped', self.customcolors['red']) - - self.statesrv.configure(text = txt, foreground = color) - - def clt_on_start(self): - if self.onlyclt: - self.on_clear([txclt]) - else: - rng, add_newline = self.on_clear_setup() - self.on_clear([txsrv, txclt], clear_range = [rng, None], newline_list = [add_newline, False]) - - self.runbtnclt.configure(relief = 'sunken') - self.clt_actions_start() - # run thread for disabling interrupt server and client, when client running. - self.clt_eject_thread = threading.Thread(target = self.clt_eject, name = "Thread-CltEjt") - self.clt_eject_thread.setDaemon(True) - self.clt_eject_thread.start() - - for widget in self.storewidgets_clt + [self.runbtnsrv, self.runbtnclt, self.defaubtnsrv]: - widget.configure(state = 'disabled') - self.runbtnclt.configure(relief = 'raised') - - def clt_actions_start(self): - clt_config[clt_options['ip']['des']] = self.cltipadd.get() - clt_config[clt_options['port']['des']] = self.prep_option(self.cltport.get()) - clt_config[clt_options['mode']['des']] = self.cltmode.get() - clt_config[clt_options['cmid']['des']] = self.cltcmid.get() - clt_config[clt_options['name']['des']] = self.cltname.get() - clt_config[clt_options['lfile']['des']] = self.prep_logfile(self.cltfile.get(), self.chkcltfile.state()) - clt_config[clt_options['asyncmsg']['des']] = self.chkvalcltasy.get() - clt_config[clt_options['llevel']['des']] = self.cltlevel.get() - clt_config[clt_options['lsize']['des']] = self.prep_option(self.cltsize.get()) - - clt_config[clt_options['time0']['des']] = self.prep_option(self.clttimeout0.get()) - clt_config[clt_options['time1']['des']] = self.prep_option(self.clttimeout1.get()) - - ## Redirect stdout. - gui_redirector('stdout', redirect_to = TextRedirect.Log, - redirect_conditio = (clt_config[clt_options['lfile']['des']] in ['STDOUT', 'FILESTDOUT'])) - - # run client (in a thread). - self.clientthread = client_thread(name = "Thread-Clt") - self.clientthread.setDaemon(True) - self.clientthread.with_gui = True - self.clientthread.start() - - def clt_eject(self): - while self.clientthread.is_alive(): - sleep(0.1) - - widgets = self.storewidgets_clt + [self.runbtnclt] + [self.defaubtnsrv] - if not self.onlyclt: - widgets += [self.runbtnsrv] - - for widget in widgets: - if isinstance(widget, ttk.Combobox): - widget.configure(state = 'readonly') - else: - widget.configure(state = 'normal') - if isinstance(widget, ListboxOfRadiobuttons): - widget.change() - - def on_browse(self, entrywidget, options): - path = filedialog.askdirectory() - if os.path.isdir(path): - entrywidget.delete('0', 'end') - entrywidget.insert('end', path + os.sep + os.path.basename(options['lfile']['def'])) - - def on_exit(self): - if serverthread.is_running_server: - if serverthread.server is not None: - server_terminate(serverthread, exit_server = True) - else: - serverthread.is_running_server = False - server_terminate(serverthread, exit_thread = True) - self.destroy() - - def on_clear_setup(self): - if any(opt in ['STDOUT', 'FILESTDOUT'] for opt in srv_config[srv_options['lfile']['des']]): - add_newline = True - if self.count_clear == 0: - self.keep_clear = txsrv.index('end-1c') - else: - add_newline = False - if self.count_clear == 0: - self.keep_clear = txsrv.index('end') - - rng = [self.keep_clear, 'end'] - self.count_clear += 1 - - return rng, add_newline - - def on_clear(self, widget_list, clear_range = None, newline_list = []): - if newline_list == []: - newline_list = len(widget_list) * [False] - - for num, couple in enumerate(zip(widget_list, newline_list)): - widget, add_n = couple - try: - ini, fin = clear_range[num] - except TypeError: - ini, fin = '1.0', 'end' - - widget.configure(state = 'normal') - widget.delete(ini, fin) - if add_n: - widget.insert('end', '\n') - widget.configure(state = 'disabled') - - def on_defaults(self): - - def put_defaults(widgets, chkasy, listofradio, options): - for widget in widgets: - wclass, wname = widget.winfo_class(), widget.winfo_name() - if wname == '!checkbutton': - continue - - opt = options[wname]['def'] - if wclass == 'Entry': - widget.delete(0, 'end') - if wname == 'sql': - self.chkvalsql.set(opt) - self.sql_status() - else: - widget.insert('end', (opt if isinstance(opt, str) else str(opt))) - elif wclass == 'Checkbutton': - if wname == 'asyncmsg': - chkasy.set(opt) - elif wclass == 'TCombobox': - widget.set(str(opt)) - - # ListboxOfRadiobuttons default. - listofradio.radiovar.set('FILE') - listofradio.textbox.yview_moveto(0) - listofradio.change() - - if self.runbtnsrv['text'] == 'START\nSERVER': - apply_default = zip(["Srv", "Clt"], - [self.chkvalsrvasy, self.chkvalcltasy], - [self.chksrvfile, self.chkcltfile], - [srv_options, clt_options]) - elif self.runbtnsrv['text'] == 'STOP\nSERVER': - apply_default = zip(*[("Clt",), - (self.chkvalcltasy,), - (self.chkcltfile,), - (clt_options,)]) - - for side, chkasy, listofradio, options in apply_default: - widgets = self.gui_store(side = side, typewidgets = ['Entry', 'TCombobox', 'Checkbutton']) - put_defaults(widgets, chkasy, listofradio, options) diff --git a/py-kms/pykms_GuiMisc.py b/py-kms/pykms_GuiMisc.py deleted file mode 100644 index 97b1cc1..0000000 --- a/py-kms/pykms_GuiMisc.py +++ /dev/null @@ -1,517 +0,0 @@ -#!/usr/bin/env python3 - -import os -import re -import sys -from collections import Counter -from time import sleep -import threading -import tkinter as tk -from tkinter import ttk -import tkinter.font as tkFont - -from pykms_Format import MsgMap, unshell_message, unformat_message - -#------------------------------------------------------------------------------------------------------------------------------------------------------------ - -# https://stackoverflow.com/questions/3221956/how-do-i-display-tooltips-in-tkinter -class ToolTip(object): - """ Create a tooltip for a given widget """ - def __init__(self, widget, bg = '#FFFFEA', pad = (5, 3, 5, 3), text = 'widget info', waittime = 400, wraplength = 250): - self.waittime = waittime # ms - self.wraplength = wraplength # pixels - self.widget = widget - self.text = text - self.widget.bind("", self.onEnter) - self.widget.bind("", self.onLeave) - self.widget.bind("", self.onLeave) - self.bg = bg - self.pad = pad - self.id = None - self.tw = None - - def onEnter(self, event = None): - self.schedule() - - def onLeave(self, event = None): - self.unschedule() - self.hide() - - def schedule(self): - self.unschedule() - self.id = self.widget.after(self.waittime, self.show) - - def unschedule(self): - id_ = self.id - self.id = None - if id_: - self.widget.after_cancel(id_) - - def show(self): - def tip_pos_calculator(widget, label, tip_delta = (10, 5), pad = (5, 3, 5, 3)): - w = widget - s_width, s_height = w.winfo_screenwidth(), w.winfo_screenheight() - width, height = (pad[0] + label.winfo_reqwidth() + pad[2], - pad[1] + label.winfo_reqheight() + pad[3]) - mouse_x, mouse_y = w.winfo_pointerxy() - x1, y1 = mouse_x + tip_delta[0], mouse_y + tip_delta[1] - x2, y2 = x1 + width, y1 + height - - x_delta = x2 - s_width - if x_delta < 0: - x_delta = 0 - y_delta = y2 - s_height - if y_delta < 0: - y_delta = 0 - - offscreen = (x_delta, y_delta) != (0, 0) - - if offscreen: - if x_delta: - x1 = mouse_x - tip_delta[0] - width - if y_delta: - y1 = mouse_y - tip_delta[1] - height - - offscreen_again = y1 < 0 # out on the top - - if offscreen_again: - # No further checks will be done. - - # TIP: - # A further mod might automagically augment the - # wraplength when the tooltip is too high to be - # kept inside the screen. - y1 = 0 - - return x1, y1 - - bg = self.bg - pad = self.pad - widget = self.widget - - # creates a toplevel window - self.tw = tk.Toplevel(widget) - - # leaves only the label and removes the app window - self.tw.wm_overrideredirect(True) - - win = tk.Frame(self.tw, background = bg, borderwidth = 0) - label = ttk.Label(win, text = self.text, justify = tk.LEFT, background = bg, relief = tk.SOLID, borderwidth = 0, - wraplength = self.wraplength) - label.grid(padx = (pad[0], pad[2]), pady = (pad[1], pad[3]), sticky=tk.NSEW) - win.grid() - - x, y = tip_pos_calculator(widget, label) - - self.tw.wm_geometry("+%d+%d" % (x, y)) - - def hide(self): - tw = self.tw - if tw: - tw.destroy() - self.tw = None - -##----------------------------------------------------------------------------------------------------------------------------------------------------------- - -class TextRedirect(object): - class Pretty(object): - grpmsg = unformat_message([MsgMap[1], MsgMap[7], MsgMap[12], MsgMap[20]]) - arrows = [ item[0] for item in grpmsg ] - clt_msg_nonewline = [ item[1] for item in grpmsg ] - arrows = list(set(arrows)) - lenarrow = len(arrows[0]) - srv_msg_nonewline = [ item[0] for item in unformat_message([MsgMap[2], MsgMap[5], MsgMap[13], MsgMap[18]]) ] - msg_align = [ msg[0].replace('\t', '').replace('\n', '') for msg in unformat_message([MsgMap[-2], MsgMap[-4]]) ] - - def __init__(self, srv_text_space, clt_text_space, customcolors): - self.srv_text_space = srv_text_space - self.clt_text_space = clt_text_space - self.customcolors = customcolors - - def textbox_write(self, tag, message, color, extras): - widget = self.textbox_choose(message) - self.w_maxpix, self.h_maxpix = widget.winfo_width(), widget.winfo_height() - self.xfont = tkFont.Font(font = widget['font']) - widget.configure(state = 'normal') - widget.insert('end', self.textbox_format(message), tag) - self.textbox_color(tag, widget, color, self.customcolors['black'], extras) - widget.after(100, widget.see('end')) - widget.configure(state = 'disabled') - - def textbox_choose(self, message): - if any(item.startswith('logsrv') for item in [message, self.str_to_print]): - self.srv_text_space.focus_set() - self.where = "srv" - return self.srv_text_space - elif any(item.startswith('logclt') for item in [message, self.str_to_print]): - self.clt_text_space.focus_set() - self.where = "clt" - return self.clt_text_space - - def textbox_color(self, tag, widget, forecolor = 'white', backcolor = 'black', extras = []): - for extra in extras: - if extra == 'bold': - self.xfont.configure(weight = "bold") - elif extra == 'italic': - self.xfont.configure(slant = "italic") - elif extra == 'underlined': - self.xfont.text_font.configure(underline = True) - elif extra == 'strike': - self.xfont.configure(overstrike = True) - elif extra == 'reverse': - forecolor, backcolor = backcolor, forecolor - - widget.tag_configure(tag, foreground = forecolor, background = backcolor, font = self.xfont) - widget.tag_add(tag, "insert linestart", "insert lineend") - - def textbox_newline(self, message): - if not message.endswith('\n'): - return message + '\n' - else: - return message - - def textbox_format(self, message): - # vertical align. - self.w_maxpix = self.w_maxpix - 5 # pixel reduction for distance from border. - w_fontpix, h_fontpix = (self.xfont.measure('0'), self.xfont.metrics('linespace')) - msg_unformat = message.replace('\t', '').replace('\n', '') - lenfixed_chars = int((self.w_maxpix / w_fontpix) - len(msg_unformat)) - - if message in self.srv_msg_nonewline + self.clt_msg_nonewline: - lung = lenfixed_chars - self.lenarrow - if message in self.clt_msg_nonewline: - message = self.textbox_newline(message) - else: - lung = lenfixed_chars - if (self.where == "srv") or (self.where == "clt" and message not in self.arrows): - message = self.textbox_newline(message) - # horizontal align. - if msg_unformat in self.msg_align: - msg_strip = message.lstrip('\n') - message = '\n' * (len(message) - len(msg_strip) + TextRedirect.Pretty.newlinecut[0]) + msg_strip - TextRedirect.Pretty.newlinecut.pop(0) - - count = Counter(message) - countab = (count['\t'] if count['\t'] != 0 else 1) - message = message.replace('\t' * countab, ' ' * lung) - return message - - def textbox_do(self): - msgs, TextRedirect.Pretty.tag_num = unshell_message(self.str_to_print, TextRedirect.Pretty.tag_num) - for tag in msgs: - self.textbox_write(tag, msgs[tag]['text'], self.customcolors[msgs[tag]['color']], msgs[tag]['extra']) - - def flush(self): - pass - - def write(self, string): - if string != '\n': - self.str_to_print = string - self.textbox_do() - - class Stderr(Pretty): - def __init__(self, srv_text_space, clt_text_space, customcolors, side): - self.srv_text_space = srv_text_space - self.clt_text_space = clt_text_space - self.customcolors = customcolors - self.side = side - self.tag_err = 'STDERR' - self.xfont = tkFont.Font(font = self.srv_text_space['font']) - - def textbox_choose(self, message): - if self.side == "srv": - return self.srv_text_space - elif self.side == "clt": - return self.clt_text_space - - def write(self, string): - widget = self.textbox_choose(string) - self.textbox_color(self.tag_err, widget, self.customcolors['red'], self.customcolors['black']) - self.srv_text_space.configure(state = 'normal') - self.srv_text_space.insert('end', string, self.tag_err) - self.srv_text_space.see('end') - self.srv_text_space.configure(state = 'disabled') - - class Log(Pretty): - def textbox_format(self, message): - if message.startswith('logsrv'): - message = message.replace('logsrv ', '') - if message.startswith('logclt'): - message = message.replace('logclt ', '') - return message + '\n' - -##----------------------------------------------------------------------------------------------------------------------------------------------------------- -class TextDoubleScroll(tk.Frame): - def __init__(self, master, **kwargs): - """ Initialize. - - horizontal scrollbar - - vertical scrollbar - - text widget - """ - tk.Frame.__init__(self, master) - self.master = master - - self.textbox = tk.Text(self.master, **kwargs) - self.sizegrip = ttk.Sizegrip(self.master) - self.hs = ttk.Scrollbar(self.master, orient = "horizontal", command = self.on_scrollbar_x) - self.vs = ttk.Scrollbar(self.master, orient = "vertical", command = self.on_scrollbar_y) - self.textbox.configure(yscrollcommand = self.on_textscroll, xscrollcommand = self.hs.set) - - def on_scrollbar_x(self, *args): - """ Horizontally scrolls text widget. """ - self.textbox.xview(*args) - - def on_scrollbar_y(self, *args): - """ Vertically scrolls text widget. """ - self.textbox.yview(*args) - - def on_textscroll(self, *args): - """ Moves the scrollbar and scrolls text widget when the mousewheel is moved on a text widget. """ - self.vs.set(*args) - self.on_scrollbar_y('moveto', args[0]) - - def put(self, **kwargs): - """ Grid the scrollbars and textbox correctly. """ - self.textbox.grid(row = 0, column = 0, padx = 3, pady = 3, sticky = "nsew") - self.vs.grid(row = 0, column = 1, sticky = "ns") - self.hs.grid(row = 1, column = 0, sticky = "we") - self.sizegrip.grid(row = 1, column = 1, sticky = "news") - - def get(self): - """ Return the "frame" useful to place inner controls. """ - return self.textbox - -##----------------------------------------------------------------------------------------------------------------------------------------------------------- -def custom_background(window): - # first level canvas. - allwidgets = window.grid_slaves(0,0)[0].grid_slaves() + window.grid_slaves(0,0)[0].place_slaves() - widgets_alphalow = [ widget for widget in allwidgets if widget.winfo_class() == 'Canvas'] - widgets_alphahigh = [] - # sub-level canvas. - for side in ["Srv", "Clt"]: - widgets_alphahigh.append(window.pagewidgets[side]["BtnWin"]) - for position in ["Left", "Right"]: - widgets_alphahigh.append(window.pagewidgets[side]["AniWin"][position]) - for pagename in window.pagewidgets[side]["PageWin"].keys(): - widgets_alphalow.append(window.pagewidgets[side]["PageWin"][pagename]) - - try: - from PIL import Image, ImageTk - - # Open Image. - img = Image.open(os.path.dirname(os.path.abspath( __file__ )) + "/graphics/pykms_Keys.gif") - img = img.convert('RGBA') - # Resize image. - img.resize((window.winfo_width(), window.winfo_height()), Image.ANTIALIAS) - # Put semi-transparent background chunks. - window.backcrops_alphalow, window.backcrops_alphahigh = ([] for _ in range(2)) - - def cutter(master, image, widgets, crops, alpha): - for widget in widgets: - x, y, w, h = master.get_position(widget) - cropped = image.crop((x, y, x + w, y + h)) - cropped.putalpha(alpha) - crops.append(ImageTk.PhotoImage(cropped)) - # Not in same loop to prevent reference garbage. - for crop, widget in zip(crops, widgets): - widget.create_image(1, 1, image = crop, anchor = 'nw') - - cutter(window, img, widgets_alphalow, window.backcrops_alphalow, 36) - cutter(window, img, widgets_alphahigh, window.backcrops_alphahigh, 96) - - # Put semi-transparent background overall. - img.putalpha(128) - window.backimg = ImageTk.PhotoImage(img) - window.masterwin.create_image(1, 1, image = window.backimg, anchor = 'nw') - - except ImportError: - for widget in widgets_alphalow + widgets_alphahigh: - widget.configure(background = window.customcolors['lavender']) - - # Hide client. - window.clt_on_show(force_remove = True) - # Show Gui. - window.deiconify() - -##----------------------------------------------------------------------------------------------------------------------------------------------------------- -class Animation(object): - def __init__(self, gifpath, master, widget, loop = False): - from PIL import Image, ImageTk, ImageSequence - - self.master = master - self.widget = widget - self.loop = loop - self.cancelid = None - self.flagstop = False - self.index = 0 - self.frames = [] - - img = Image.open(gifpath) - size = img.size - for frame in ImageSequence.Iterator(img): - static_img = ImageTk.PhotoImage(frame.convert('RGBA')) - try: - static_img.delay = int(frame.info['duration']) - except KeyError: - static_img.delay = 100 - self.frames.append(static_img) - - self.widget.configure(width = size[0], height = size[1]) - self.initialize() - - def initialize(self): - self.widget.configure(image = self.frames[0]) - self.widget.image = self.frames[0] - - def deanimate(self): - while not self.flagstop: - pass - self.flagstop = False - self.index = 0 - self.widget.configure(relief = "raised") - - def animate(self): - frame = self.frames[self.index] - self.widget.configure(image = frame, relief = "sunken") - self.index += 1 - self.cancelid = self.master.after(frame.delay, self.animate) - if self.index == len(self.frames): - if self.loop: - self.index = 0 - else: - self.stop() - - def start(self, event = None): - if str(self.widget['state']) != 'disabled': - if self.cancelid is None: - if not self.loop: - self.btnani_thread = threading.Thread(target = self.deanimate, name = "Thread-BtnAni") - self.btnani_thread.setDaemon(True) - self.btnani_thread.start() - self.cancelid = self.master.after(self.frames[0].delay, self.animate) - - def stop(self, event = None): - if self.cancelid: - self.master.after_cancel(self.cancelid) - self.cancelid = None - self.flagstop = True - self.initialize() - - -def custom_pages(window, side): - buttons = window.pagewidgets[side]["BtnAni"] - labels = window.pagewidgets[side]["LblAni"] - - for position in buttons.keys(): - buttons[position].config(anchor = "center", - font = window.customfonts['btn'], - background = window.customcolors['white'], - activebackground = window.customcolors['white'], - borderwidth = 2) - - try: - anibtn = Animation(os.path.dirname(os.path.abspath( __file__ )) + "/graphics/pykms_Keyhole_%s.gif" %position, - window, buttons[position], loop = False) - anilbl = Animation(os.path.dirname(os.path.abspath( __file__ )) + "/graphics/pykms_Arrow_%s.gif" %position, - window, labels[position], loop = True) - - def animationwait(master, button, btn_animation, lbl_animation): - while btn_animation.cancelid: - pass - sleep(1) - x, y = master.winfo_pointerxy() - if master.winfo_containing(x, y) == button: - lbl_animation.start() - - def animationcombo(master, button, btn_animation, lbl_animation): - wait_thread = threading.Thread(target = animationwait, - args = (master, button, btn_animation, lbl_animation), - name = "Thread-WaitAni") - wait_thread.setDaemon(True) - wait_thread.start() - lbl_animation.stop() - btn_animation.start() - - buttons[position].bind("", lambda event, anim1 = anibtn, anim2 = anilbl, - bt = buttons[position], win = window: - animationcombo(win, bt, anim1, anim2)) - buttons[position].bind("", anilbl.start) - buttons[position].bind("", anilbl.stop) - - except ImportError: - buttons[position].config(activebackground = window.customcolors['blue'], - foreground = window.customcolors['blue']) - labels[position].config(background = window.customcolors['lavender']) - - if position == "Left": - buttons[position].config(text = '<<') - elif position == "Right": - buttons[position].config(text = '>>') - -##----------------------------------------------------------------------------------------------------------------------------------------------------------- -class ListboxOfRadiobuttons(tk.Frame): - def __init__(self, master, radios, font, changed, **kwargs): - tk.Frame.__init__(self, master) - - self.master = master - self.radios = radios - self.font = font - self.changed = changed - - self.scrollv = tk.Scrollbar(self, orient = "vertical") - self.textbox = tk.Text(self, yscrollcommand = self.scrollv.set, **kwargs) - self.scrollv.config(command = self.textbox.yview) - # layout. - self.scrollv.pack(side = "right", fill = "y") - self.textbox.pack(side = "left", fill = "both", expand = True) - # create radiobuttons. - self.radiovar = tk.StringVar() - self.radiovar.set('FILE') - self.create() - - def create(self): - self.rdbtns = [] - for n, nameradio in enumerate(self.radios): - rdbtn = tk.Radiobutton(self, text = nameradio, value = nameradio, variable = self.radiovar, - font = self.font, indicatoron = 0, width = 15, - borderwidth = 3, selectcolor = 'yellow', command = self.change) - self.textbox.window_create("end", window = rdbtn) - # to force one checkbox per line - if n != len(self.radios) - 1: - self.textbox.insert("end", "\n") - self.rdbtns.append(rdbtn) - self.textbox.configure(state = "disabled") - - def change(self): - st = self.state() - for widget, default in self.changed: - wclass = widget.winfo_class() - if st in ['STDOUT', 'FILEOFF']: - if wclass == 'Entry': - widget.delete(0, 'end') - widget.configure(state = "disabled") - elif wclass == 'TCombobox': - if st == 'STDOUT': - widget.set(default) - widget.configure(state = "readonly") - elif st == 'FILEOFF': - widget.set('') - widget.configure(state = "disabled") - elif st in ['FILE', 'FILESTDOUT', 'STDOUTOFF']: - if wclass == 'Entry': - widget.configure(state = "normal") - widget.delete(0, 'end') - widget.insert('end', default) - widget.xview_moveto(1) - elif wclass == 'TCombobox': - widget.configure(state = "readonly") - widget.set(default) - elif wclass == 'Button': - widget.configure(state = "normal") - - def configure(self, state): - for rb in self.rdbtns: - rb.configure(state = state) - - def state(self): - return self.radiovar.get() From 4bd60959f1b9abdf3cd0d904cb176ee46c6b0918 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 9 Dec 2022 19:51:18 +0100 Subject: [PATCH 107/154] Removed old gui code references and variables --- LICENSE.gui.md | 21 --------------------- README.md | 3 +-- py-kms/pykms_Client.py | 12 +++++------- py-kms/pykms_Format.py | 1 - py-kms/pykms_Misc.py | 7 ++----- py-kms/pykms_Server.py | 15 +++------------ 6 files changed, 11 insertions(+), 48 deletions(-) delete mode 100644 LICENSE.gui.md diff --git a/LICENSE.gui.md b/LICENSE.gui.md deleted file mode 100644 index 1d06073..0000000 --- a/LICENSE.gui.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Matteo ℱan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md index c52406b..ead2964 100644 --- a/README.md +++ b/README.md @@ -47,5 +47,4 @@ The wiki has been completly reworked and is now available on [readthedocs.com](h - To show the help pages type: `python3 pykms_Server.py -h` and `python3 pykms_Client.py -h`. ## License - - _py-kms_ is [![Unlicense](https://img.shields.io/badge/license-unlicense-lightgray.svg)](https://github.com/SystemRage/py-kms/blob/master/LICENSE) - - _py-kms GUI_ is [![MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/SystemRage/py-kms/blob/master/LICENSE.gui.md) © Matteo ℱan + - _py-kms_ is [![Unlicense](https://img.shields.io/badge/license-unlicense-lightgray.svg)](https://github.com/SystemRage/py-kms/blob/master/LICENSE) \ No newline at end of file diff --git a/py-kms/pykms_Client.py b/py-kms/pykms_Client.py index 749ae4c..d2fe1b5 100644 --- a/py-kms/pykms_Client.py +++ b/py-kms/pykms_Client.py @@ -45,10 +45,9 @@ class client_thread(threading.Thread): def __init__(self, name): threading.Thread.__init__(self) self.name = name - self.with_gui = False def run(self): - clt_main(with_gui = self.with_gui) + clt_main() #--------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -297,11 +296,10 @@ def client_create(clt_sock): pretty_printer(log_obj = loggerclt.warning, to_exit = True, where = "clt", put_text = "{reverse}{magenta}{bold}Something went wrong. Exiting...{end}") -def clt_main(with_gui = False): +def clt_main(): try: - if not with_gui: - # Parse options. - client_options() + # Parse options. + client_options() # Check options. client_check() @@ -393,4 +391,4 @@ def readKmsResponseV6(data): return message if __name__ == "__main__": - clt_main(with_gui = False) + clt_main() diff --git a/py-kms/pykms_Format.py b/py-kms/pykms_Format.py index d0d28c5..ee37363 100644 --- a/py-kms/pykms_Format.py +++ b/py-kms/pykms_Format.py @@ -400,7 +400,6 @@ def pretty_printer(**kwargs): if None `put_text` must be defined for printing process. `to_exit ` --> if True system exit is called. `where` --> specifies if message is server-side or client-side - (useful for GUI redirect). """ # Set defaults for not defined options. options = {'log_obj' : None, diff --git a/py-kms/pykms_Misc.py b/py-kms/pykms_Misc.py index f948d44..c96f094 100644 --- a/py-kms/pykms_Misc.py +++ b/py-kms/pykms_Misc.py @@ -194,9 +194,6 @@ def logger_create(log_obj, config, mode = 'a'): frmt_name = '%(name)s ' from pykms_Server import serverthread - if serverthread.with_gui: - frmt_std = frmt_name + frmt_std - frmt_min = frmt_name + frmt_min def apply_formatter(levelnum, formats, handler, color = False): levelformdict = {} @@ -521,7 +518,7 @@ def check_setup(config, options, logger, where): # Check logfile. config['logfile'] = check_logfile(config['logfile'], options['lfile']['def'], where = where) - # Check logsize (py-kms Gui). + # Check logsize if config['logsize'] == "": if any(opt in ['STDOUT', 'FILEOFF'] for opt in config['logfile']): # set a recognized size never used. @@ -530,7 +527,7 @@ def check_setup(config, options, logger, where): pretty_printer(put_text = "{reverse}{red}{bold}argument `-S/--logsize`: invalid with: '%s'. Exiting...{end}" %config['logsize'], where = where, to_exit = True) - # Check loglevel (py-kms Gui). + # Check loglevel if config['loglevel'] == "": # set a recognized level never used. config['loglevel'] = 'ERROR' diff --git a/py-kms/pykms_Server.py b/py-kms/pykms_Server.py index 80e549e..543fe79 100755 --- a/py-kms/pykms_Server.py +++ b/py-kms/pykms_Server.py @@ -134,7 +134,8 @@ def __init__(self, queue, name): self.name = name self.queue = queue self.server = None - self.is_running_server, self.with_gui, self.checked = [False for _ in range(3)] + self.is_running_server = False + self.checked = False self.is_running_thread = threading.Event() def terminate_serve(self): @@ -169,13 +170,7 @@ def run(self): self.server.pykms_serve() except (SystemExit, Exception) as e: self.eject = True - if not self.with_gui: - raise - else: - if isinstance(e, SystemExit): - continue - else: - raise + raise ##--------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -385,9 +380,6 @@ def server_check(): opts = [('clientcount', '-c/--client-count'), ('timeoutidle', '-t0/--timeout-idle'), ('timeoutsndrcv', '-t1/--timeout-sndrcv')] - if serverthread.with_gui: - opts += [('activation', '-a/--activation-interval'), - ('renewal', '-r/--renewal-interval')] check_other(srv_config, opts, loggersrv, where = 'srv') # Check further addresses / ports. @@ -467,7 +459,6 @@ def server_main_terminal(): server_check() serverthread.checked = True - # (without GUI) and (without daemon). # Run threaded server. serverqueue.put('start') # Wait to finish. From fdf14451878551389c4716317036f19236326ad0 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 9 Dec 2022 20:16:01 +0100 Subject: [PATCH 108/154] Removed docs dependencies from requirements.txt Moved requirement-files into respective docker folders --- docker/docker-py3-kms-minimal/Dockerfile | 3 +-- docker/docker-py3-kms-minimal/requirements.txt | 2 ++ docker/docker-py3-kms/Dockerfile | 3 +-- docker/docker-py3-kms/requirements.txt | 2 ++ docker/requirements.txt | 5 ----- docker/requirements_minimal.txt | 4 ---- requirements.txt | 1 + 7 files changed, 7 insertions(+), 13 deletions(-) create mode 100644 docker/docker-py3-kms-minimal/requirements.txt create mode 100644 docker/docker-py3-kms/requirements.txt delete mode 100644 docker/requirements.txt delete mode 100644 docker/requirements_minimal.txt create mode 120000 requirements.txt diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index ff6199e..789d562 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -15,12 +15,11 @@ ENV LOGSIZE "" ENV TYPE MINIMAL COPY ./py-kms /home/py-kms -COPY docker/requirements_minimal.txt /home/py-kms/requirements.txt +COPY docker/docker-py3-kms-minimal/requirements.txt /home/py-kms/requirements.txt RUN apk add --no-cache --update \ bash \ python3 \ py3-pip \ - python3-tkinter \ ca-certificates \ shadow \ tzdata \ diff --git a/docker/docker-py3-kms-minimal/requirements.txt b/docker/docker-py3-kms-minimal/requirements.txt new file mode 100644 index 0000000..4159f71 --- /dev/null +++ b/docker/docker-py3-kms-minimal/requirements.txt @@ -0,0 +1,2 @@ +dnspython==2.2.1 +tzlocal==4.2 \ No newline at end of file diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 4b7dab0..c316ab2 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -17,12 +17,11 @@ ENV LOGSIZE "" ENV TZ America/Chicago COPY py-kms /home/py-kms/ -COPY docker/requirements.txt /home/py-kms/ +COPY docker/docker-py3-kms/requirements.txt /home/py-kms/ RUN apk add --no-cache --update \ bash \ python3 \ py3-pip \ - python3-tkinter \ sqlite-libs \ ca-certificates \ tzdata \ diff --git a/docker/docker-py3-kms/requirements.txt b/docker/docker-py3-kms/requirements.txt new file mode 100644 index 0000000..4159f71 --- /dev/null +++ b/docker/docker-py3-kms/requirements.txt @@ -0,0 +1,2 @@ +dnspython==2.2.1 +tzlocal==4.2 \ No newline at end of file diff --git a/docker/requirements.txt b/docker/requirements.txt deleted file mode 100644 index bad41ef..0000000 --- a/docker/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -Flask==2.1.2 -Pygments==2.12.0 -dnspython==2.2.1 -tzlocal==4.2 -sqlite-web==0.4.0 \ No newline at end of file diff --git a/docker/requirements_minimal.txt b/docker/requirements_minimal.txt deleted file mode 100644 index 509c137..0000000 --- a/docker/requirements_minimal.txt +++ /dev/null @@ -1,4 +0,0 @@ -Flask==2.1.2 -Pygments==2.12.0 -dnspython==2.2.1 -tzlocal==4.2 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 120000 index 0000000..bec651b --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +docker/docker-py3-kms/requirements.txt \ No newline at end of file From 5a8a21abda936fd06531470a7e2631aedc0e35b6 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 9 Dec 2022 20:27:27 +0100 Subject: [PATCH 109/154] Removed sqliteweb support --- charts/py-kms/README.md | 1 - charts/py-kms/values.yaml | 1 - docker/docker-py3-kms/Dockerfile | 3 --- docker/start.py | 24 +----------------------- docs/Getting Started.md | 2 -- docs/Usage.md | 8 -------- 6 files changed, 1 insertion(+), 38 deletions(-) diff --git a/charts/py-kms/README.md b/charts/py-kms/README.md index cd8c8d3..5c812c4 100644 --- a/charts/py-kms/README.md +++ b/charts/py-kms/README.md @@ -47,7 +47,6 @@ For more information please refer to the Helm Install command documentation loca | py-kms.environment.IP | string | `"::"` | | | py-kms.environment.LOGLEVEL | string | `"INFO"` | | | py-kms.environment.LOGSIZE | int | `2` | | -| py-kms.environment.SQLITE | bool | `true` | | | replicaCount | int | `1` | | | resources | object | `{}` | | | securityContext | object | `{}` | | diff --git a/charts/py-kms/values.yaml b/charts/py-kms/values.yaml index 84e0cd1..84de8ff 100644 --- a/charts/py-kms/values.yaml +++ b/charts/py-kms/values.yaml @@ -20,7 +20,6 @@ py-kms: LOGSIZE: 2 LOGFILE: /var/log/py-kms.log HWID: RANDOM - SQLITE: true IP: '::' serviceAccount: {} diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index c316ab2..70a5b9b 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -8,8 +8,6 @@ ENV LCID 1033 ENV CLIENT_COUNT 26 ENV ACTIVATION_INTERVAL 120 ENV RENEWAL_INTERVAL 10080 -ENV SQLITE true -ENV SQLITE_PORT 8080 ENV HWID RANDOM ENV LOGLEVEL INFO ENV LOGFILE STDOUT @@ -43,7 +41,6 @@ RUN chmod 755 /usr/bin/entrypoint.py WORKDIR /home/py-kms EXPOSE ${PORT}/tcp -EXPOSE 8080 HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z ${IP%% *} ${PORT} || exit 1 diff --git a/docker/start.py b/docker/start.py index 54f943e..51337c2 100644 --- a/docker/start.py +++ b/docker/start.py @@ -20,8 +20,6 @@ '-e': 'EPID' } -sqliteWebPath = '/home/sqlite_web/sqlite_web.py' -enableSQLITE = os.environ.get('SQLITE', 'false').lower() == 'true' and os.environ.get('TYPE') != 'MINIMAL' dbPath = os.path.join(os.sep, 'home', 'py-kms', 'db', 'pykms_database.db') log_level_bootstrap = log_level = os.environ.get('LOGLEVEL', 'INFO') if log_level_bootstrap == "MININFO": @@ -29,7 +27,6 @@ log_file = os.environ.get('LOGFILE', 'STDOUT') listen_ip = os.environ.get('IP', '::').split() listen_port = os.environ.get('PORT', '1688') -sqlite_port = os.environ.get('SQLITE_PORT', '8080') def start_kms_client(): @@ -48,7 +45,6 @@ def start_kms_client(): def start_kms(): - sqlite_process = None # Build the command to execute command = [PYTHON3, '-u', 'pykms_Server.py', listen_ip[0], listen_port] for (arg, env) in argumentVariableMapping.items(): @@ -61,25 +57,9 @@ def start_kms(): command.append("-n") command.append(listen_ip[i] + "," + listen_port) - if enableSQLITE: - loggersrv.info("Storing database file to %s" % dbPath) - command.append('-s') - command.append(dbPath) - os.makedirs(os.path.dirname(dbPath), exist_ok=True) - loggersrv.debug("server_cmd: %s" % (" ".join(str(x) for x in command).strip())) pykms_process = subprocess.Popen(command) - # In case SQLITE is defined: Start the web interface - if enableSQLITE: - time.sleep(5) # The server may take a while to start - start_kms_client() - sqlite_cmd = ['sqlite_web', '-H', listen_ip[0], '--read-only', '-x', - dbPath, '-p', sqlite_port] - - loggersrv.debug("sqlite_cmd: %s" % (" ".join(str(x) for x in sqlite_cmd).strip())) - sqlite_process = subprocess.Popen(sqlite_cmd) - try: pykms_process.wait() except Exception: @@ -88,9 +68,7 @@ def start_kms(): except KeyboardInterrupt: pass - if enableSQLITE: - if None != sqlite_process: sqlite_process.terminate() - pykms_process.terminate() + pykms_process.terminate() # Main diff --git a/docs/Getting Started.md b/docs/Getting Started.md index 129a674..5ff48f7 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -47,7 +47,6 @@ services: - 8080:8080 environment: - IP='::' - - SQLITE=true - HWID=RANDOM - LOGLEVEL=INFO restart: always @@ -62,7 +61,6 @@ Below is a little bit more extended run command, detailing all the different sup docker run -it -d --name py3-kms \ -p 8080:8080 \ -p 1688:1688 \ - -e SQLITE=true \ -v /etc/localtime:/etc/localtime:ro \ --restart unless-stopped ghcr.io/py-kms-organization/py-kms:[TAG] ``` diff --git a/docs/Usage.md b/docs/Usage.md index 289a3e6..6902f26 100644 --- a/docs/Usage.md +++ b/docs/Usage.md @@ -230,14 +230,6 @@ ENV ACTIVATION_INTERVAL 120 # Use this flag to specify the renewal interval (in minutes). Default is 10080 minutes (7 days). ENV RENEWAL_INTERVAL 10080 -# Use SQLITE -# Use this flag to store request information from unique clients in an SQLite database. -ENV SQLITE false - -# TCP-port -# The network port to listen with the web interface on. The default is "8080". -ENV SQLITE_PORT 8080 - # hwid # Use this flag to specify a HWID. # The HWID must be an 16-character string of hex characters. From f15ed48f59381f32329c3b22f315c6d66d046757 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 9 Dec 2022 20:49:27 +0100 Subject: [PATCH 110/154] Switched sqlite parameter to point to file instead of dir --- docs/Getting Started.md | 2 +- docs/Usage.md | 1 - py-kms/pykms_Base.py | 4 +--- py-kms/pykms_Server.py | 19 ++++++++++--------- py-kms/pykms_Sql.py | 6 ++---- 5 files changed, 14 insertions(+), 18 deletions(-) diff --git a/docs/Getting Started.md b/docs/Getting Started.md index 5ff48f7..a562527 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -64,7 +64,7 @@ docker run -it -d --name py3-kms \ -v /etc/localtime:/etc/localtime:ro \ --restart unless-stopped ghcr.io/py-kms-organization/py-kms:[TAG] ``` -You can omit the `-e SQLITE=...` and `-p 8080:8080` option if you plan to use the `minimal` or `latest` image, which does not include the respective module support. +You can omit the `-p 8080:8080` option if you plan to use the `minimal` or `latest` image, which does not include the `sqlite` module support. ### Systemd If you are running a Linux distro using `systemd`, create the file: `sudo nano /etc/systemd/system/py3-kms.service`, then add the following (change it where needed) and save: diff --git a/docs/Usage.md b/docs/Usage.md index 6902f26..16e5743 100644 --- a/docs/Usage.md +++ b/docs/Usage.md @@ -53,7 +53,6 @@ e.g. because it could not reach the server. The default is 120 minutes (2 hours) -s or --sqlite [] > Use this option to store request information from unique clients in an SQLite database. Deactivated by default. -If enabled the default database file is _pykms_database.db_. You can also provide a specific location. -t0 or --timeout-idle > Maximum inactivity time (in seconds) after which the connection with the client is closed. diff --git a/py-kms/pykms_Base.py b/py-kms/pykms_Base.py index 1f38ba9..e0e9a6b 100644 --- a/py-kms/pykms_Base.py +++ b/py-kms/pykms_Base.py @@ -4,13 +4,12 @@ import logging import time import uuid -import socket from pykms_Structure import Structure from pykms_DB2Dict import kmsDB2Dict from pykms_PidGenerator import epidGenerator from pykms_Filetimes import filetime_to_dt -from pykms_Sql import sql_initialize, sql_update, sql_update_epid +from pykms_Sql import sql_update, sql_update_epid from pykms_Format import justify, byterize, enco, deco, pretty_printer #-------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -214,7 +213,6 @@ def serverLogic(self, kmsRequest): 'product' : infoDict["skuId"]}) # Create database. if self.srv_config['sqlite']: - sql_initialize(self.srv_config['sqlite']) sql_update(self.srv_config['sqlite'], infoDict) return self.createKmsResponse(kmsRequest, currentClientCount, appName) diff --git a/py-kms/pykms_Server.py b/py-kms/pykms_Server.py index 543fe79..f506455 100755 --- a/py-kms/pykms_Server.py +++ b/py-kms/pykms_Server.py @@ -9,21 +9,20 @@ import logging import os import threading -import pickle import socketserver import queue as Queue import selectors -from tempfile import gettempdir from time import monotonic as time import pykms_RpcBind, pykms_RpcRequest from pykms_RpcBase import rpcBase from pykms_Dcerpc import MSRPCHeader -from pykms_Misc import check_setup, check_lcid, check_dir, check_other +from pykms_Misc import check_setup, check_lcid, check_other from pykms_Misc import KmsParser, KmsParserException, KmsParserHelp from pykms_Misc import kms_parser_get, kms_parser_check_optionals, kms_parser_check_positionals, kms_parser_check_connect from pykms_Format import enco, deco, pretty_printer, justify from pykms_Connect import MultipleListener +from pykms_Sql import sql_initialize srv_version = "py-kms_2020-10-01" __license__ = "The Unlicense" @@ -190,8 +189,7 @@ def run(self): 'def' : 120, 'des': "activation"}, 'renewal' : {'help' : 'Use this option to specify the renewal interval (in minutes). Default is \"10080\" minutes (7 days).', 'def' : 1440 * 7, 'des' : "renewal"}, - 'sql' : {'help' : 'Use this option to store request information from unique clients in an SQLite database. Deactivated by default. \ -If enabled the default .db file is \"pykms_database.db\". You can also provide a specific location.', 'def' : False, + 'sql' : {'help' : 'Use this option to store request information from unique clients in an SQLite database. Deactivated by default.', 'def' : False, 'file': os.path.join('.', 'pykms_database.db'), 'des' : "sqlite"}, 'hwid' : {'help' : 'Use this option to specify a HWID. The HWID must be an 16-character string of hex characters. \ The default is \"364F463A8863D35F\" or type \"RANDOM\" to auto generate the HWID.', @@ -364,16 +362,19 @@ def server_check(): # Check sqlite. if srv_config['sqlite']: - if isinstance(srv_config['sqlite'], str): - check_dir(srv_config['sqlite'], 'srv', log_obj = loggersrv.error, argument = '-s/--sqlite') - elif srv_config['sqlite'] is True: + if srv_config['sqlite'] is True: # Resolve bool to the default path srv_config['sqlite'] = srv_options['sql']['file'] + if os.path.isdir(srv_config['sqlite']): + pretty_printer(log_obj = loggersrv.warning, + put_text = "{reverse}{yellow}{bold}You specified a folder instead of a database file! This behavior is not officially supported anymore, please change your start parameters soon.{end}") + srv_config['sqlite'] = os.path.join(srv_config['sqlite'], 'pykms_database.db') try: import sqlite3 + sql_initialize(srv_config['sqlite']) except ImportError: pretty_printer(log_obj = loggersrv.warning, - put_text = "{reverse}{yellow}{bold}Module 'sqlite3' not installed, database support disabled.{end}") + put_text = "{reverse}{yellow}{bold}Module 'sqlite3' not installed, database support disabled.{end}") srv_config['sqlite'] = False # Check other specific server options. diff --git a/py-kms/pykms_Sql.py b/py-kms/pykms_Sql.py index 6afa889..270d76a 100644 --- a/py-kms/pykms_Sql.py +++ b/py-kms/pykms_Sql.py @@ -23,12 +23,10 @@ def sql_initialize(dbName): try: con = sqlite3.connect(dbName) cur = con.cursor() - cur.execute("CREATE TABLE clients(clientMachineId TEXT, machineName TEXT, applicationId TEXT, skuId TEXT, \ -licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER)") + cur.execute("CREATE TABLE clients(clientMachineId TEXT, machineName TEXT, applicationId TEXT, skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER)") except sqlite3.Error as e: - pretty_printer(log_obj = loggersrv.error, to_exit = True, - put_text = "{reverse}{red}{bold}Sqlite Error: %s. Exiting...{end}" %str(e)) + pretty_printer(log_obj = loggersrv.error, to_exit = True, put_text = "{reverse}{red}{bold}Sqlite Error: %s. Exiting...{end}" %str(e)) finally: if con: con.commit() From 88f96a23b4d29f35f2a0efaad97a0aac4b590238 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 9 Dec 2022 20:54:21 +0100 Subject: [PATCH 111/154] Removed dummy client code --- docker/start.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/docker/start.py b/docker/start.py index 51337c2..f164fa7 100644 --- a/docker/start.py +++ b/docker/start.py @@ -29,21 +29,6 @@ listen_port = os.environ.get('PORT', '1688') -def start_kms_client(): - if not os.path.isfile(dbPath): - # Start a dummy activation to ensure the database file is created - client_cmd = [PYTHON3, '-u', 'pykms_Client.py', listen_ip[0], listen_port, - '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218', - '-V', log_level, '-F', log_file] - if os.environ.get('LOGSIZE', '') != "": - client_cmd.append('-S') - client_cmd.append(os.environ.get('LOGSIZE')) - loggersrv.info("Starting a dummy activation to ensure the database file is created") - loggersrv.debug("client_cmd: %s" % (" ".join(str(x) for x in client_cmd).strip())) - - subprocess.run(client_cmd) - - def start_kms(): # Build the command to execute command = [PYTHON3, '-u', 'pykms_Server.py', listen_ip[0], listen_port] From 767751c314a8ae037c3502f3916e36cc965f2a4e Mon Sep 17 00:00:00 2001 From: simonmicro Date: Fri, 9 Dec 2022 21:27:51 +0100 Subject: [PATCH 112/154] Removed old graphics --- py-kms/graphics/pykms_Arrow_Left.gif | Bin 45112 -> 0 bytes py-kms/graphics/pykms_Arrow_Right.gif | Bin 43022 -> 0 bytes py-kms/graphics/pykms_Keyhole_Left.gif | Bin 10240 -> 0 bytes py-kms/graphics/pykms_Keyhole_Right.gif | Bin 10233 -> 0 bytes py-kms/graphics/pykms_Keys.gif | Bin 537089 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 py-kms/graphics/pykms_Arrow_Left.gif delete mode 100644 py-kms/graphics/pykms_Arrow_Right.gif delete mode 100644 py-kms/graphics/pykms_Keyhole_Left.gif delete mode 100644 py-kms/graphics/pykms_Keyhole_Right.gif delete mode 100644 py-kms/graphics/pykms_Keys.gif diff --git a/py-kms/graphics/pykms_Arrow_Left.gif b/py-kms/graphics/pykms_Arrow_Left.gif deleted file mode 100644 index 731405dad7b82e777b7814ed4925734c9729d9de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45112 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 HmZbj$=ynq+ diff --git a/py-kms/graphics/pykms_Arrow_Right.gif b/py-kms/graphics/pykms_Arrow_Right.gif deleted file mode 100644 index 422583fdfbf6003d34adadfd9088f724fbeee406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43022 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 sGabkKW& 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 F{{hXHL4W`N diff --git a/py-kms/graphics/pykms_Keyhole_Left.gif b/py-kms/graphics/pykms_Keyhole_Left.gif deleted file mode 100644 index 5d2933caac82552ed5148581182df54285e5ae37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 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 diff --git a/py-kms/graphics/pykms_Keyhole_Right.gif b/py-kms/graphics/pykms_Keyhole_Right.gif deleted file mode 100644 index d7499bb5e0d8bf765e3901bbb5e9d2ff973c8bb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10233 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
0@rs%c78Tr{fT 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 D3}GaT diff --git a/py-kms/graphics/pykms_Keys.gif b/py-kms/graphics/pykms_Keys.gif deleted file mode 100644 index 540eadc3de9ed30de537966137e386e072ddbdd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537089 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%0A!zBBNU!Vq1U3DXfa>B^5XY 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%0DmjD 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

Z)eGp|gf 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Πa`SX3gv? zM2>oH)MIZOg)bS6E!{C>v>G!J@6)g%mb&`W;3mw`G5qj#Y@qIR?hcTAx<4>K#xYp}1WKDCO)c{VP_`6!a$ez zVh)`PnX^l1Q5rdkFj5hGgyq%?x2qA7_-tf703I&H6!0+u)l!JXQV5TnF7Y7_I*qXP zH%wsW0Pswfd8|>?82C#9^b1wLVl>HieceWCkWzbEc*opYLf$? zk?A`?H7ENUe2P?<5%!C5@KG5D5+LD}ajk)13x-gUJreJKLbBqCj{d*^IHzRsd52Y| zu^=BO!yfH4iq42|`2LieT_4;(=Ty(}SAw4PtM~}63r!oqX$q=>x%mpu^+CpD{HjM+SG> z^4-1C{Dczkbg-uy(iAv0iDu6n)X#V3l!(F#!QqzYWNIu zQsS&sQPdnxcA!5%Lh<96)dMLnK}f1W@HL`Gy~_H;fUA?GOZuQw)qsCWrIvh(tHN{m zN9XxH5{mRa_xT#S@6g}bk8SA#t|L!4WfHyg!PWC{n`w@3J=l}QF%G~G1=_kvju;waU>4Y|aoFEpD)-18u1gTZ;Hz|Ddjc z(zHNj<|JN!YG7IVh_1kjFgNJQ0Gju(op}E%S z$O6J6g+KZq0(>-6snwOsgL+E6ZIod1P9bUpu==P3Gsf}j8)S@tY=&5bF(Iy7L}_x|x<=y3 z7vK6@^7(Alyuy9{<26IpbGIubEDv(cT!>H9Nn(=lLS4YE2Z zj?hGOv%ud*Q!RV%nMg%F4_=#0#yeEpv-KI^W?PW}puU0`E+aR8N4V~1orD8ALEE;Q z-GQ+6=YvT}VykSi=?k&1?pj~#ucq}~FzYOfn2Q$WW zO9lrR;A&&Jh?_LvP91UuJTS*eoySDZlU(=bvGl(NXolhyn_}Fms-6u=R^>X{hnI4c zoWusU)`1N1M+{;y_1<$_dq1Ex;J^d?P`OjG-MGrifit9Y%aydKIj*&zxO4kczt09# z3i!e}Dl!pRpa^7EvG>IWE@!E{FoDahC8Uvy&ePdOo$UX5(bUBOr{z-TN#F~9>5;#o zy5He!GuY3X?Uw%3cI1K%$E9RRNcB(2f-N+g*G%=8Y2YCJ&xvJzTw~1rWe&1G*Ggm! zclk|&mIZA3B*=Sp;IbYS2?Lrb9Pso3<0d(-7?EK;bOjGASa+-?M55_cdGol~Nsd2x z&{z)j7l`d9C4!B~{!Y3X{PE*pg4#V&*aOsA^Vb!7yBo--HoWL`g#K z9TgJZfxQEi`90Zgb1(v)L+B{|y8F9NY;p4GgE_0Z^zv2M@Mv-;kQN(lG@{z(A%Y=d zRw(KCIBEg|;5@?h=YzKL7@RpaBxx|W1h@}S!3Kc09#oO(U$^vm*Ai7QKapO-I8x2| zRx7?aC(-dZJKuu5G0(z|-+tCn_1leSeP-*yh*x@@EMS(pq{q+2pe$`wzG^xqfnT`PCiaHO)COs(J*e zHckN2S%dVR3X2n?PguIQwLvz5Ym^|mv*UnQKFEY&>H%DB-NCUV514cU^G`Wa`O;;S z$EJL?bqm-B4?2}3rlgNvTr({=57I9F0Lcp^5kN7!K$5rDa>eNx0sZov0q9 zNe3JQTnxIwi+#kH6F-~&SDT!ZXCJOC%maAONe=NP=zc)Z^AIB+O}TIoRRfBq>2EJ> zn%^$jJ*VfAE!>l-WqI|2?RlBx7NNNl#J>|j9El=yTX?g82O+h)i$pk~*rY|tc_xO> zy`KN7`g-3suLkJ;>A9Y=X{F#;;epY5e-X)#tv{kH9~;1Y4{+WfF()$omE5oHgV7Jb z`WuzFT$aTKaME5K^9=Nx5~2VBUQy=VGwr1h*VIr#`gfnMZNE!ry3lhAa$g75S_j@7 z>1?B|a^3u(IX0?*Gpy%-p&p7ZacVl7RP?>CNvRk$vJShJ*|G3#W1X#QkCcrJfH!p1 zq%$h-l!9woLn1Nl@AQscPw~2i*Z?n%zKP&3G?41xO;u;Jl!w3lYxvQ>FYo=+OM8sA zt-F!)ulDZI-(Q^l1-{fJP%JM-!F;hWT=#fGbz9he7t)JfWX-Wv8>qV_@JbXlFt6x& z^XrkQHfH(#f_tTvp$g7E%6;bBu=~xri{Jkg(I>|0+*+zvTs&TO#qw^mmR<-(=r4qg zJgd?_(P?1zT&6x>2Of!cYnTi{31BNx&QH zi!{68$MO)aR@Ya#e0@Xy7PPt8Y{$+RNcF}dS{tcIQyx5s`$jlv3fwT$e&osma3j&N zyOZl0n81FZ7YG2Rd-JnHhA|0~Ot>Mlwuy#Jk~2$4?k?{;WU(m4U`=fFb_kXwy&G(* zb$nVDurj54J{`+^kTP76_W<|?#(Jqk90EJlJHBVh#*sZD~DhK;S+F%pF{*9}>W{uK6_3m|pZf@Mu^NyJV`Gkp1?44uDg%$hc zh%j`AyS60^o_vT}bfI&O>ra+(sx2#g6lR-q@186-ur$sf=bf$XOYVL@+E1bTWLj=F z7BEjDEuS_~;T+|JoLY4Dus~uNd1Iq_k@~B;)bgo36|_NPAKZv&O0fmmFU*vPqDLP| zz|=0~ag{wyIloaRsUM}}dUm(O5fXN7_I*kfg)H59jn5~HkvhJO!^5M@#8)STCNPcO~_$7r$TFErLbWqgvsZT zU^jev3E&ObT+S2k{qPtW(Ot4}oL}mlI(S4IM&Z_tj|A%!#HzJrvsjrBLddDnOJLEA zKC@;?=fTIUmn=z~*lOCE?UoT0uUG%RTC87(w_oq}-e3m+O#Z-tudP2$+AJI*zh;-Y zC?zI=fT5yMP_^eT4LO7UcI_w8!H}OCKlA25qqpBJn17EOzC?f-ppEx}>6<*3g+lVu z)6nrOPQzC@jP_Jk@i%dn@LXC_^7d;pBR>;!C3E$a&h%pMdK;qvP0)()7=)u5Pt0io zR|9IKp1mA$t38@wsZ%%+X~fM`4vi&3Zw+ARXO&6mn)3teV%e;`8N>M5nkqYa23ATh z>8{qT*X7gnKda-9teYCxt{s}ilxBhr`jsX7|8vv{jsu=$DGaH-lOuLd!jNtJ`N|F1 zX=cC4{v59hwO`lu%)@sN^&4c{T7_*Na->*&GKfCkFy}!Q{{(D`GJy&oi?Bzo9yOr}H2Md2+UH9|y zvm3{XmKD8re6`dpyZPh)?m>^N|L@D8TmMBV_Wuv92B4>k!8>Up^duX+@v9OM*&{X@ zQ^S@os_@keq>Wz+YV~3wdb8H0B;jxhc3ab+8K|vv<#Ygk!{b3qbAm-kQmVl*^00mU z*NPt#vn|)?0gQ^8s*Hd%#_rJ|?}4c5Q1i zeb{m8exd?*taj?EkN~fa0gKLRw?E0Kd{}zg&PE_{( zkU{aPeGAZ>`M-}AW^#-gg|}Lo(jnHoQ1Xkl(qrGHR*Qiqq-%Hyx&9!kojQbYP|&ur zM8G(mFJb8l++1Hwv~B`=57ktL&e7ljn)M_f>ZM&nA9Gz-uUz+KrYNO%08^15*_=HQ z_&mvypy?X4t9LgE>_a^Tfg>}l$~w57Nl-5o(341WRS%+wGvsiveqr&<3!45*Dift4 zJY|_q0`K>W5WZH%>jGS5Lxxjq(?Z?&1sS3hcy|NL=T(%>f6&wvj+$$l%}!i{)Ed2{ z5?p}Tmn>`$P~XXlbd5#+05t3t7-WE%@vrsH&i$wrEoQU5{>bsEA*Q`R{8l--R@IUZ zz)pscI|ZSmvxe7{JQPh^KdASiEU|tFbJkw3f@+#`f}8N3LB#u0QVjmcaV#LQ6{znE zHO!~8G;B&IKtJ2T_@xk6VQ-!xLa=~%bG9pWhH9BfY*tq!s0{O|`d$GaU$O`}LxHk% zoFEiCrJ|0CPMEU|h_te9svBx1Dm@MR5@6IRTG>CtxG=AKesikA-dAc8Nj2BC6f{%K z1P8K)*f=!{M+dg(EJx}LvQ-(hMnR@23^JkjoTC2BX#s|{BE()=qFRaBhrrin!5)f! zDpL&dX3$9ly}$3S8dcU%fywdq`eF%ZaZ}cJmHDHs|ILHUVr_ID8DT67KP4cX6=FFe zs6!lU2x-jU}HaUNq+$Sj0*Is}u-5|*jqYfAB6f~w0UzyfzSZ+NGsRU<^)X{31*+gk=+-ZxJ$2jYrm zjC)+QNQ5G?bw-b94H$i;A#y z1Zu+#c@Pl!N5HKChtyJ$PiV&ZRAiEke*7r|MwGTKbmcxf(~9wM1Tgu50`x#<( zcAhsXC(Y6$=Y(@2wyuWS-bSlB+A#Wf+RdJF6&!2E#%gHOXXz0rR=ZkW1>I4Q!{DdA>;)zp;y zUIlvkH7{6U*L;!jlpgX@Z8%*^3{rlY2U79@lnXRdU3T>g+u~=6{(h}aELKtWva3f0 zn5LO24vF|dj;Ut2zowaQ9X*9oL=oFLY98+UStkTdU+nOa)rlyyS?AGVb^%Ci+(4Yw zJ)eU`kP0ImG%6CIUa-wk-`}kJ602bwonprorr@V_E`{po3pKt#MREh`HLyw+ zvEn{L2R%wV^~O3T*Jka4O)}0R{gH9zBirrKcDwb{_UhA%Yw4THO{(>8)#@V~YmJ*1 z?Avp@PT9Uawcv2^0_ySw$6IbrH3Fx53r>$~=bm10e&y!!&JF%y!R1@-vgHKF|1Cg3 zd5n#6#>^}uneJ+I(bdA;!ZOdzF^22n?(SLUzQVxc`X&!;*f)=uJkPb?JoBht8!vio zbNAkL(R;tUPiY;o;^H0;kh1n7s<95${Ec}e#<%Mts@q`srMl%ezU}I!`Q3TkU;SYJ z__w@0v*@Xdi0O;gvw8j>zxjX5TlxFjO0WmO{c`4>1(tzFQoV$2M&ww1XV=X6In`&) z)40wOuH9=c_j@ZZKk}(MASOT1^={xc*P#1?pv~Wd*3yD^^#;G`^hVKmyCuA|IbL0U zh$kfQm`6=VJ-%}?^n7esX?Ga+yS_5tx2Qb)qbhtNHsbkY#4|u7w1e`t7ysdVStD)R}Pb(g7+vu}+w{SCtq8Tywl(4R&_T#T{#} z|5!V?BkA6cq{lmwKPr-6T|&?9SXZoA_mAh}mz|`aKP0_h)<2=@+SCPLNdi7T#rSCo zEk4!$X=-I-7O^31#nYp#`1BAji*UmYag9j65bl>kU;tk&(1`s?bVZ6;6~Ms1)11sk z1t`p0*qAlXjk6D!C#euGSSAH*3YP)YykRgGB2b{b1U}{Q=RF{f7icOeaI4j5 zhsuI>1Iu3Q8Ra8Q3QY@4r2pRLYiLUB22`#iGuO;ed;-WjPoalYW{ePW{%c-6q%8W>xkQ&j+v@7TDxeQk2C`94r5LP&;}-lmZ$w{XSIP&BZlZql0IDXxKO^jWDLf zPuZ9=atz*5kpiH{@r7j`kifY)ee;w=R0>uAynJ#Ea8D-jBTc`0N3lkAd2_q_FEBy~ zG(jmaQXqwzf-#Ke%G+J5XOQXk?zI5ol&Ic3CH2_raNSH|9|HTu6xSj)Z_Wz(dEMy& zO>0~P)OHHO&Tf-itwpDYXWHhEYS4i)Q_DCq>}BrRApTM1kTh=rb{o>1vyW=+2cEf1@4y05$d7>u?V_6w1XGe(9gM4yhiu0>LAlb5k7%3^3r3XdPtlz7se1FYi~9w~KdPXXahz3lW6VfQ!I zo&`YiAJ6SgY_my`aE_WAyY=*G0DaN!R&?Z>eAddqPW0_{Rs+iKWvl-9D0lJSytx_o z^wxnalpkh|s_HGZ(xKg>`w(|I+q8Oyd`(&AD^1akS{mcHOnt7Kc|Ljzt!EFCI6jaw(mh^02*36Gnba<=c)K&t5Rvbou zwHg9OPt6br0bc!zRhw->C@BFkD$}VM_jT$6D|vcJPvUbgHJwd0?}d>+AHu$q>ay&2 z&bOH<*&dh~a=blKJXu?t<+3h_D`n%f(y#%ciE_p;Krex&A_jNkvqnwF_8JV&pfM>P zCaxCyTr2`e)JCFPOpvL6k#;^XI*)PeGIIz13E{SjMK|-1@A2sG^U*Zc=4)f`J>Fsa zB#Y_;A1(w54s2M#lfQEZby=k?4DSLV8bP&DPN?b3X5F~`=z$KvzC zOy!+V_v_qBuJQLIMq1bK#%8fDVzlDcy(ag~FUPKa%V>I)(>J;rU8=w7aOA6RSE|wH z3LA!czUKG5RHQBy?!G&B`##<(=u7%QUSO!RpQ7;m_HPyUz3UNr`_l4<4;)(l@z0r` zV>hn<`;YqitL5Y^1I-3)Irryl(+9ev?9zqpw`U+-1^mcA^mkttu4}ZPF6s$?tGS_s ztoa@oDL_il^`hrT1sc4x&U;|AK3!`Chu5dOhZ+R(MS-~8GvFA1L^l#2bE?6}sG{zO5AY zW@rR!7&b2pkG7iwNMWPuIz1Z-%PJglVU9Zr3FNmwFmj{TKuEr0vH(d~HcO0g6Cm!< z13gqK=Y9Vvg-&1RVuq0vhSjR@z!v_n;LRMk3e60d+DPUB6q^pa0#qB#SLP^b49a}X zq+W!_cHMZrXd;ym@+lHY9W>Q?y1Y{3SFrmX)A%8*f2?B!Cu?Swq;hiA!uFsdJ z4d3he*YrL@kt(zuPwu+DDCiimF+cvJ%IifFaDas13W~>tbrjvNsEB zdxp2EA2s^sHZ?R_ZtGWtS~e3GVD5_;x|P4OtY($pWCy3zvZA0JN8gqoU1k}5?)uqf zFO(dp^$*H{RbEn-Tku00l>*24w`%nRBZx)as113?qq|HS*qOJc!hS^wW1uMo9nv#b z9GT%h8}op^ZEmj2_>A=%AII)V*By3;eA*g)Z(0Kn2tE@t%AD`eErYFPb6`Ec@jo*o zwuh!t+nTkyGNmcztXxBJ@uxY^7hjC0v(s`mp`X z)=g-S`zo$!y}G=J_!@jk39r$lNZEZesMMU{y!ohuCRJdIvweeRFZh*3-Gk)Tz5$YK z5aN||$G1u_;8-wIwJCp)@{t#s*Pm0S+H^-Mz`Wk|Qlz)LN&#u(-=XKrq?YrFJguD% zduyu2{I?Ir-blZxWrXnxu|#g#gIuUMhf{%ZJD*wAhB-2rI_fW2Vk z9n5~RaN@-aoPW;w5>J*TDJCYs;engy&cv!s`xm)u028RB088u546a>5%K6sw_w*|I z%=i~Z&jl~0I&J_2KC5LH$M?@{03QbbGg(`o7Yj7HDU=vLiZ0!|cNXSdSYqsDd8O;d zflV>H103BrwY5sIFhduYO%fm6Gxgf-y8vdaR-D-Abbq7n&Y9YMyO&dtj?3)PMbH4K zEuE5`?HktET~k(N%d%Wu#c)~^YVyco6{@&wC{>W!)}6p6_wYEXKe9%b5n?cQ$;9b{ z@CgTRWVD-khxvi#5=k9ME!OQYliv~e!U6h0fOgAOVRY%o18pSM`QlME0P*-On7FwU z?h|yrWaS?m{$@`xjiNv*+zwvLzAgUp-=K z+h=R>s#8Vd&sJ|EtI(1WFz&3V-CWBk<2wES)GFWOYx%meS>ow}VW+ogmC60#7OJt# zEj1HWnXy);eEeW*Qj6LP{_8ZuTyHaNUBF~j}X;e(lmDa}v%GrX=mzrU@- z9rN1h9rN+k2Rm=Nx8^q4*?-vmu;|OhV;zedS@1RE65D(Qc5h}t7h|Ggokx4%RA%tX zU&XSD@2mH_*&p2fsk^~eaeUc<_u-^1kAs%`joo;wORbLfD%y^(4~`3nKJ;Sp4k~hC!n2GNjZ8*Dg*wO#{=(AJ*UE2T3w0ruk zAYsU%@qBf0ce?!%y?c$01b!4roa5O zxd}a+Lt;;J$VN8B2H{?fe@(v&+I8*8jjdOE@BPgwFzTO;KnILfzFazU<;I7CZAI_a zzWV)k*RB8lF3SQ}`GQQzDpW>~L;*}$%WEPL8}Do1ctjcn>B%$ZxFH|B!-nrijtInxeKgDG?u%tSp`-1eoGx$^%<0;1)bKwn|z2 zbG-=L#MhI2vzS~hoOb0dQgJ3)-MOR(xJm<}ux!Tg!F>RoXGVACK;0N&@F?L`U5jfk zP!SEqfgq$f$N&Siew-Ia1rNydQZ--=6(waMSi07GSG~96xTOh5E(16|1UR09|Ez=? z;E}GgI!Y6%Bd==4AG9+Bn_KuN{$-N3Q3ZT%o8o+g9^fG9g)*EopSRLk!yFoz0R(n#(CaCUOw zV2S=L1LVqwyrJsR4N6y1$-9*RKEEU#4^Gj5yK9M`#&Nj}@O=)1A_wVQ!|Oz+01ZeR zB5)eEgi{9`AJ1;P@twL^nPxpq4dFX}`l@Rb%+Y&dQ~6f!ms}5)DLkE`SF?kEMwSq5 z6_=aF@F^i2lE-B*R<{Oj4+!?$UT2U4CSGaZk)!cC%7+~Tpq2R5o3<|>+QGgfTzh8R zQ!R(d0PvfP1hbuKSD?rjGF&vl`%Nw47T1&gCMllg$cB=7$I&hJJ z;R~E^vf!gE#p3Dj4W)?y%SoR5kdoIIH{0j*=vF8xOR~Nm?n9#CU3834QD}##( zo6f^>SZUqk$Q52F6jDjFp-ktWwalPjfg^faubApKeF!pJ%R8q(6Iu zEmIRUa_liBvQgsQ#ei4mr1^h~yCXoqe1bA;GzZ06TY}rbK#k4D3BEAI-Lg=}L>2)D|x<9K{zJ&oj7BS+Kxy zrw|s({ShwT8g43sbj(I)=YuXVJpNHvRlUV6TB9g@q*7+zj$d`K1NH%rG|)h6SfH$N za~+oX5&)6P9NehT;xsJI6RebB2};Z-7OY4Pyvov3=74m*>T@NWuXG4|(ZL_LX>`?# zB?qMj!LG9MI&wfPDtxI?ml1}T0H9e6a3BD^WD6q!B|I6`T!4iuV7zfioE#RXffdh% zbx-kTAdo<6a=jc-++?+=#1im8sf^yEfgYT)r?Zj55gObTLtr6wXefaNtF1x1un-g( z`Uf6(mCDtYSbviyw{OXl_%sQ%9W_2q}bPS`T-l48`h!rHW*$BIU6&G>Jro}xS@nXL*irP z8Cjaf6W+EV*6cFjvP_R;zhc!4HbA+8Uy^L~R9CsFcM||B;Ug|3ro{r`C+>P&yMjD| z-%!2__i8FO0Pn*@oEZIo9Nl|7)BXQH@SRV#ne&-#hUGZtL((?G2#r*dG$jdTq>@Xu zlk;gr326?MikedCcx`i*YL%o?ZAjALTE~m(+UK|L?;n5o!)Oi!T_yLM7s`2*IJiVWE4|C9oH)%2)kCVtlxEmFF~C+o$lB zt07HdjDmws!^bs>5TsUPNEj62xp4>J*e;dEQ^?g30Ss3a>NJPZphr>U)a^~mm12PI z#1GgH_NI!Xy03Araw+--M@J%taj6nxPkq34_rn|{SF|Y|YWQ+p*OfxVpKZ{{r%*AA z*RM#>uIWGG(E)1yCl2}z8NCIp!=GHUsF&eEZ9H% zq!k-_YDBt=?2BD2!~0+>Y|koclVScNO6E@3ucPR*cId5A<4GxI{2t~V6(euQ)Cdq? zJr0fgX>X^oA0+h03hxLGJXG0YFNgamVC71*Knk6eghz9AhdA&-z|M&;m}fXhq(X;J z)7`TlJ|u#tP|)8F!YegDTrdO_U5SDxlf1pVU+&Uc4DjG9EJzN(xltb(A_X$=W$qNzdMfI< z2>!P{_#n5iPJz{9`>hsXj`G7;EYw@7u9iPEl3_M;^#j(gDG!yKRKzI7a1W98+EL~z z25%8%9g-Wzd6bS5Vb2sK(DC9Z7W2s0aJ-+5t{s^91?;NeF=ntCbfkkKREunmi=u0R z2Hmj&11aVU6=u#hvBZNftMysh0X{Kk2NS8s#xj;zSDSPr@^tFectKqG?_LLC?wE$C zJ-jS~2n=EI+*V_|@Ntn_9us0A1)59GJ{pt091Z^>(q4*C9EIl*>gE5{8&}>#s~;nC zm3n__5pC~unw0QUO8B}R$r*UKM3na&fHLm)dnjE6Nokt0^X5E<3e`~Dy;YNH%)(oQ z;l^yO1pn=A)rP&u=`M^KfGPp(jr(@uDHy?E8-jcMhpCY3cmoU&ou{Y!Ndc|@c3riQ zILtxsqFqdrqTq9z=&e}lQ)HZw7wMcuCtet4WyGa*7} ziM5A@NNbhh4>63%eELI-B>^dJ>s+t<8!893obH=l~me zU8ws*iLzI=NE6?LejUCHD1S|YcZkrZG!t2_S7C?r&Azw7ePikO5ZO&M(k|Q7NhL^6 z3TG^VwQv#jCS99gUNcx08v(n7s?h7PL>dAC_3i&68?wd9o-D*m(HHtpu28Ylr0PSU5UNH0!RS{*A->YIoP^IjDhmLzt|>j z6;t2i-6f6tVtn6s20|FfT%1d`yWuldgptOp~GLDZs%s5(|0khcLszx-|e@8WNMwE*8QK7!2(xxM7MAF#HZ^79oB_0hKjp^r*X6>6N`MO^~ zdu>{=hVNHbv7r(XW|~zj67MT}3ibZ0X_F57zx49VVplLUAr#8xBqX21^p7`>w_~|f zDDS97SB`^W@6eu$!0n2_FY1eF0938JZC?a}DMLd%;XN&=9aN}ClyQ-EWKa#!`3orm zpqxXSg%tE#j!_K&o<#-q;dGw^kl_^6M-J`+(BQcQww8l_;)^*Zh96|1#;A77qD@)K zEewDcr&#y3Qm1SOR47IN!0E2oJs+g0aM#zWCEZqj# ztJj#Z+}@bL}VXzp0rG#)6sX{Qj)vtabejjQcC#%fDc_$Rq-DHE;Ts`rzcMjFxxRJ=^}kN6Ud))Id$z_+5W9>?_Kh-T_ zM6a7e5>rNa9j4F*t&uT{*Rkt5S!38c?Gfu)hhj%x!x$(R(exPX9@P9 zYj3H;iGXp%S}STN_q0#4Jnih-q06Jmb*^7Z;Ua$pAVlMTA@v+zl=(F|wbDP~UN_oN z2rNFqL=)u24(Lr7eHQ*;Kbna!JJVc52+h0Ngoe;@qTJrX^p0PjjbGhry;R|Iu8rvpEgUeS=szM+R zheyNA?K{*REn^px<>j;~M4?IGZSBxP!OurwHh6j#F zORwxw@a>LG7tH~tV}IT!ygQuzIKg_0v&^9u;Vvo6W-~4RY|_`q0EqmxWs? zEUIp5oKoOU7+9jip1d!0sJ0>RqGvhRa{s$%SDVI1`A7WXYpN#w0``0SEgjJvz=5&2 zGl*m<2$w@GY+qKwSz^eAQ~>%dt0?_gKO45Y=xDuYM)wF)X#Z<(X_!=H)*TOWJ~Llm zfB=V8aiS5Mo*+ZSVS1NmA4h2R@O6^`JH5*&{gO#Z;|GPz>JUD^nG2*e<8 zAOjXRhRZIT2<8E32quSVke!1?+I&G+?Vbq@O8_4mrxZJcB1^n;9;RFO6#1fiigLxO zy>WX>y~m?B>`)8xgP8c_p7~DGe`_9dt%sTlyw>R6NVcqWrnp_E2E)ns}AzFrF_lROzfvoY9RVgGs_{>~2#K zE~|tAy#g%vU(${tQ~GTKYD(7R^06EGLUvy!+;Ur`GFz4onlA!SX@T32qn+?oUkSxA zO2JOom0<=Rnh>)BPP@)CAR{RKvVOetoMpS>QPsS*a3!yuUokrDnfayJze{GJ#xss8 zv+X&N3wkg7;M>J9C1FC<`Yq>n8nIR2WY)aZE9H>?*BII(oZR>$fT3TY@+jz?wH(Jo z!lss@_IBCYoMt@;{3&z8{Q6++v}wrgCLig_3^s~Y@EwL!y1C!^$laWwIYz&Zk3^>P z1_8ys;9$BJ`*%96fLToA%0j-&buLOGVuoS_UFlal4-7g@X4ZN)oMY$PW$PH_aym?= z_kileL+DzqnL5I@`}R2sjVk|OQ58+m&j11D!QA(w$z>_{srggxZ^o#UmA7eSa> zow6$RR#hiW(z6+?cU}Q~b@fs;B2f12tBjtiO(Bu|fM#MARA0mfIRL&QJ1GLO5}-xEIZR`1h1CcR|f!UNjL54|NuXplFIZh1w#5>%A%e=gUg5; za8QU#Hg>;Q_q$~Hc#FW*e^%=pG(e3zMHUMTknyL^O)ERUz|2A0kU4p$x7cPhZ9nE= zJ)zwISP&zex(M_>QI-*)rp*5~(C{5#*rja8Nvgb6XnFHd;6F6&_H$d*VF}cE8$dTp zYtB9#C9KK;pz~8)?tN18tm|y61Kw?Mfm096rK@eX-S(pNSv4c587SDu?7vX4P@9%S5GG8mx1MK1hLZHw@9j#l z@#}%Z?>~Z--{9%(VT0Wsq*Sen6nJ=l$e;Nqzgl7X8@^gY$JQO1HB-*$xQT*+;dICi zz;@H`y`zElAI!#kgs=k1m`@R{RNE}9pQYNec|c;i2~9PeC;=GGAFDpzj0c4@a6M;g zs)^cN8w0=>vglFBAjNP}$1F!DHxGT7uIcJBT!)*L`j-7maJk*4R ze1t1L?q`1Ed4Sdtv=*I~CVXPUIi`i)RLl>26@zlUKnzRd zLL4bz+Iz?bF@gTRnw}>}QJnclyCW-Yk7EgaMLqeQ3?~-kcc;L^w7!4|b0u95Qx|R^ z3j$aWRwrmxiE#5$(Y|N7EWQ7vlN6vHG0n zkhJjmuEGm=qs>&oT9y!U!aG`6==NTlkrBE|MVtF^Th&Dy@~YNQ?Xw<{ow)t~DvDez zh(3C-3#=l`kxuQCLfll^eGeWlvD=yl9+Z^5=!7RP@X2cm!_o>jh(YYm${cagsujo9 zXqNg57R)v!fIT~HofaU$TB>k~@5>3HGzeY-VSC7^_{Tn{TFnbgp^l<@9L+?K5xiTg zxTY1ySq5crK|JM6yMds5sc>7#EiEw_npa2@!9)QNm(G<3@#n9X-(oeaT-$l8TDJ1e z>@AvlrPLts0zR<+8+@RD?5@}OAalHc9A&3EVjy1TH~a`8&gr*$4vhLxXx z2i1?jzu5k*7x?%0&42&=>+hwNyyc@-zimN(o~+i~gZ~dKEx=Jh1!uvLQfQ_WK2WSd ze3wq?7o%=V(TP{Vi&9;*OwSOloo;Ys(mGOP&$DG;OJ!zVG<=`Ta$HVS(ro4cctiP& zEuR=jKggv24N=&46ggPxtzZl~-liW@&{qvyaq9|qpRV)>3?7xky;FjHh5hMYbpv|) zOUHvhD1%o+7_0RdbT0-YjuBc=71pa4-oaSY+ZH)J5dCL>)fFD=T<4cl9hW%hntpX- z#o(r{!OgveiPM8gak@@`&}35Rc1Gxql%djsp|soHA!2O~aB#)r&;##>ve03-uH4Fj zION6+=dr^M2!|^>iVh}X-bum=a;v;=LJof)eu`k`*OK@QT|Yl&JX6E;jAs_4jTHBm zmCPOWOh%U%T&)N+sQS(n8HU$-jTTVD>kVs;6@vT6Xn^mqT=%BLVINCUVgJ`~S&ydsn#tI`P8XxTQQTVNs@I&11 zp9alKE8ff!JbP8?>3I5u1j=0CYa)9veq1n%Qnm57;HRYOI{YjgCKJSxdS-DU6vd#iNBujlAZElTeu2*z zY4gqFJ23em80^U?d|#i#hR!obI5o|{i3v-`LD}4nf<7o!0{v|S z+s}nKaf|ZRP{*{w7gDHy{8g1sO%W3wq6a&YdnO71riui%Hw^8+=>A}7T}vS`1j3N? zKJNi-knpc`Yjb^_#nFv|=q1LA%X|+&4P6aQM93{KS4_XUFl<v&*|N(Htnb{KBfdf=zKQ-JQgn~kQ7<6-R_9_ zb_;xB2_S+w4;nB#z$z*q0bbt)-^AkW8iH1yKDG4W`ME>>t3)M^9G=^Px3U&UR&x98 zAY`pR$^xW`z}NChiJXy5BYe+f7{D3zv43pc7z_*G$FO0se%2z9)i(?D{xV;g#vdN5 zbnOu#9MkyU4Z6%aLCL02Zz{h7$~V)73jBcNlH0CIuB{>5L!m9wD}0~LEEs{p*pXVu z8rsOqOoL~0L8IF(NJ|I|8AOWbFDLih(Jrt?7WE@#P&D}FmiJRPPm#Dnrew;VB{02k z&Ys2H%q=#U;u8Jf8CuFmHOa2YydEo%-Nzlemw`u6g#h z@=JjJ(R;AfEySsMVu*#_)`l4eZbiKW9;>?i_>R&is+vAR@?PLG&s6WvC}fsE_K(2) z^FRS#VH_5C@lIz7nE=)3{;Pm|DJz~IyPRiQNIs99R19hEOeF8~^P+Mw+5!;jqA-pM z=Fe0bzsF?Zg|4Q0pObvD7Wj^v1;)Hxzn|6wH8pt|!u%xsEOQ){>8=j|?FV(P;Xnc# z1#w)VH%s7lyWI~YOwl@;4TYQ4jCXlewi{qO6!cWF_Dx%KXNm18fg-oAV{oed$pbmK z;xqu9BQ5k5d4yv}!=|!43W`i8VNTo-7R72ew~!(=qH6(OwJs}9;E@JR9x2j40^Y37 zj9hk!&jVYLh2|+;rU>n4YAzW9+4)WTarm0-E-+S!KKukzmLRJoZ;T+&t(__L=h2x_ zacmxZcb`LWryxLW_g_hI_Z8%+M;i2BgUwa#FsG5zh#G-^d`G6bXr~&wHLsrzfX;E? zD~HjkRZ&NnnFUKl1h(Kzx~Usm;NvIE>I2&&3L9}|O>Ci)sW5RwxRUEMeD2#wEzFk1 z-+`;lDp{G*y|*PfcL=5!J>NBy0XM+|zndek8W(LM<6qo3IY{Iiuzd~z5e8^&U^%fmw}HJ|v}1ChD=K>sD){%izhse3Sj|9(Z+RO`Q7-^>^VAQlfz>xY{lK6d{G z5y8dDOFUBr@b@gDrjxH9ca5Z8?AdT_N)LHsp^5wK`AYY0SMJ8t1y>9Ub^(Cjcd~HS z-yExLe;b99wQ4Yn8>={ux{9cuI(rad7B>82sOWn>|Fb_HyTY;GeI@*Vr^6o%`5yZw zin}o4tDO&_5(6LoV+ka#xU3i0-ugdlFTEEvz7&7bb?7%xafMXYk83K~PM3;tV= znx;Lkk$$q6@lJzU|9g6a=Gt2>(cvl;)XshjD5&WuA{%z|JrD(^D z)Li%Wv}i)q5k+Dn_%SVf| zlAiwc@A=0k%O9FwFUUW4f;Z=NYULeKSH(7Cm*#{cocA7kJ}$Y>o&WW7`QEUdp(g0S zQs9rg9cI-QKCO$(SKej439`?lyw$M_E%!f}qk8@126L29@K5f~gr4D7K?QryxmIQV z@%uVAcJy9hWOXE#2s_1kL>ny5wc1+Ce&50{yueib&Io`iKn^!NXWiUp z(D1DyJlvDjtbhm{25cWdw$6bEb-ygk(d_ybSP<7yTr58~&Wix%F*PM$`gQB$Y7JIB zr-;XEe~u~`dV2e40~Qne9zny?jlV$kwm9p-^g~RaGYl}XtwYGw(``V?yG{Kx1A_&b zfoJ`^pxVQrQ;7;%p4fPb(oPoX1Wor*!0>6r^(GILVXJ{p`72Me9X_a)&OQAY-?itZ zq%TZ|Bcz=0AW1`Zsaw|gqf*=FNp!`vHAZ-#w1J9j>Z1~5#ip;l=e`Q!ra=CD?j$<)Z8m;;NfC5FMk2MlRl2C!W>+|+jN|> z@@7XKlqKfGZGD$==4k49c^s}A^KKLb~lrIb%tc2Na7MunuK zWif_4utO)vu1u+QoA8oNY11nHD4g!2Og!Yz%;a^lSihvHYAfrW~}} zv;&=ATR{=H8HfX*IAOm)H)5bihdIJ)FVo&Y&DrXr^IE)7obn%rwx9q7&-yzEYSU|L z<|(4-E#>k}*{WLqzSHKRva`%M4e(g9XsyAY;6iWgm4>ISbQ7*NO*tT~S&a`dDx;P- zj{#7DDll074T>GXo5X!k>>y?-rHbPZi!`|5I7oF*=7J)pWrkW0zKOew~v`^b1>ZO61%hcAiu~)8@d2$HjDyxT3<$ zfnc{600_QTbZ#t^k1u2w5^y|(XLFRPvd!^JKo8OhM>pkK)Kf~hg`=hQ`KnrDqm3I_BGYN~g7@yr&HRS6RYC*ndtZM5wORYI~s`)jUI`$&K1 zneytr3_hZ!+Zpc)L?(Jk;wyH+eP=pO?2#IXe_LSPdO1ex(K3U8FG6Fi46+?j?D#W} z4RMH<>7c?wGxgZ;)g#77v@znJcPK@+?R4XtA{1qUhwh;UTgwvPm_J zdyFrRoFiH+k1!X7wWJ#<_P)+rI3Tt6D|e_m;Cubu0@(bgnm)$vS2d-uwN z<0-CJPSk5(_;b6Wtaff7!2or~JCg5DPJ^nCiv`Au6MZn*VpeVA}x*CP4CJw*cI>gA{1VH*FB zpJpO9-J9ZkN=#ru()iFXE)4Q@>h1^HYaZ^+#7E&KWS9v_>Ng(hhsYhEngF5wrwC z@2!uY5BuJJZ<@iyOz}FM3xiowgPz4!k`XggyMDTvzk!fG5zJ!&`GjcjI)c z@$F8TZ$}Jxqr&zG=TW%*MMcp*a;nQwJWNr2algUEFq>afm3|ur@HSmFl~J8?lk`r3 z{U0hiwt;ItM*&;;)#|5+87m?PI-BPB=+#Ot%3cIvN+00^8feBx#a7;(ttd~t24s@K zLYy1Er1B+`wdDdm9`c(jzuM-8+d4NOxye#dDK2`Lq8ow$aN@_^XA zEa-lOZ5e6VKriUX*dGHzl*jjKUGj!T96}&LbjE?qgLj zOaf(=(-meN^>@2G(uh_aY|m#4fg1w5h$un{%vNtKoX*Gzz^g!UO{B5 zuH@;2_JW*6^avK;TDy-tN3)JEzh5_C@)3!8Qu5X0dfl} zD71^Vjx0b^HfR}9H0SjuZ39~_FmwuJ5EQJ)<(m^GEV(+N@j&Of;8l48n|s0D1vFAG z2rrtkoT8IBVUw5^9p**$$rm3nn|bNk$2IS6oEMp>|GI}&(U9+Hd(JktSS*K@o+(qa%@0R(DQJ71{pI8vV2e`kHPY02W`*^vzx7%WJ# zE>&(_?uP$5XY>1p&7b=k{+~yu{=-E4@BJyALoNT)Ljh1qik|Y2B1}k9f_#+VQ2YiZ z7@B~GrQ_lGctjZ<*@#EAa8dIJotyZ?0VR4;iHV+yv$oOwg~v_m#G;e+4zCX-sq}pa zw*!+6qmzx2l8uRS-QD-+mlYqLicuH84|Q1x=4f=Fwa=|4T=cx}dMXvSGT&Ot77 z@u9hXZVOu?h5}|S5w-$jy8B~e4@cWL?^)0JV6W(Q^Elg}#O*$Nw)-A#|5DOkactI~ zP7k=aeWm8^Y{aPTsu%6P%J!hIwn0m_RFHtG-$5gG)VXwQ_nHfi)!v;m_#5UzQs+YV zleQP6Fsn$Gb#n(BL_G}MHH!lR*<5byVC1jhsMjgcpHtRqQdn5KAf~|aw%mxrOX`!u z{rYw0NBk%A#b?**VY`icIWG_?lkjiX~FF?ym@ zWEB8j0l=9e;nVzpW@@A!O;4+;;p8x?Tu>rdHx9xn^jew1BSPA#PTH7hBW(mo5z%z$ zVCOk%_2Xdw%zhtgr#W}Z949lG=6j6DDHOp`ZKhfzU(;BWxMX=&)$bxfYV>d*GZ7zE z!b_5fb+m8bIxX^+{_`BbSK6=JDQ!su{2d!YuBV@$1M1CjlZ3RkNbOi`glnJF9}$er z4Lcx;Y0C^VDUkip6Catg_P{(bVUFpZ0~!j4pJ-iJ5)EA;)fthMB^O#|Qr+x!ZdUf| z1oEu=sP`V|8W{n-r2_4j8ALi3CDK+naQ|9>tZ1e})1?&d!?-lZv!J-OQaUX=>TX4o z(dDQ1hMTW2=ws8zw(_(-FwLm|x^fEi0{iglpK(hqzFvoPMfAV9EbnDKU2$=Ou}?_A z4_ue>EJt{**fGmAx}#KwK8@BBwjROB%y09IazEeC)$kcN*E<4?=^b>(=BMLA0{J%2 ztN~~_U3_)wseT~eR?M^K^1D?P#7Nh-cX=lN*_uIGobzj%d*!CT_-?{T52@fIMPM_* z(>`DB4Ln;&r5OX{NfE?T%8f|!`((MN^5U!^og@tN!O7gE{p3t4sV>+b0Nc=U-|i33 zXsp~Q4|6>vncrxHuc(a%$j#@p8YY<13A8kn>sl8|6GW4-FC+8G^#1r&ck~KHGoZLnx#yv~30SBN_a|bKu|2P>rG_Y`>%T2rXPp za{%-QD8b9ktbaP26Q)8mN4fpj&BALN+EigDmoB?u!2P z%{+bSll2pPeJzK18(+nI_w1tk()i#?{2EuSlw3izctFLn=>8&_4>jVfh#rUzHtq#S zuw<8NX(S=gNK2bey>&ZD9V<}2{twVa>4)XY&;tOTN?AO+EOa_kxX0wRtbDXh3N@%ifLfrUyXKVl0nQ7Im1ywUIPIJ`(8?uZ ztg)*=*`nDNBQtW5eLx*8xNWW9$;%7uUQ@E`uOfuQ=s4m8MUGH z9<%OxB8bcYeG`Vo>iPsqK5qno^{5~%2pPbj2b22A>}`c|`R|Kx@4PlQDbGxy0h%j+ zJjO-)&x2R8Xb!h!=w1WW_5ope22IP#QN=^MoE1&9rUYgPy} zjs*CXfXxLCm9v!Sjw<)~> z@4DOw{oyZGQ-AeQj|hR~PadIJ16${1&gvVZU-Ntx3UO0_K!5-}FC6B8!P6ie50ssV zkFElFOZn*Bfbu`>9`)AxT6wBj@7&+kni$y@R~cl0TR>sz<0H`H{G>UaP99R-41oXP zF1_m0l~jWkfI7ysz{vPOE&o^t4xE!0k8n|1WIGaQ!}y3$e^?&}0&5{(G}Y}-+OHUT zw4wX@&g{~c8#%p^*CDEF+%+*7?HZ#8Jj$HFgWYDfqjc8u+QTRtU? z429gknn*BDvn3kJ-KRh_s(h37@LiZZme+4CrFl^0_byyzFVlz;x+ACd@~Gf{+14MuLr~a!*sbS;`vI{54j$WiEN8wOnxN0@RP%zuQP|dYEt13!(|YbSlVGnZMQ# zOfaOINkD%y_n0m52p#1YFZcTgChO;U8}$YcE5Tml)VS%A&AEp9+p700FjiUi?|upL zZsw030}^}rJ_{Q7$_lyuxHnnta-)hQ0SKCQD!(=BVb*28`aWp#C~W{{?bSvS>8G#EcmTfwGSna>f;Z_ zJ)+2pUpkwG-^_g!Q)qqym_JZ|W#OOKfk#&Vw+soWON(g_t6uEaLZ%)O{<-)V%C;h` zM%&QDF0E;gsBvWw-?G+aH56@Dr&fw;FmG0#SxP;bMo)<&RYl#M^OF%q(Ou!Wou!Pl zxGmmW?y^tUc8rx8xZRvb*uqWCgl=zALilgtb`h@3x7*L2Vb&KIf2e<{-UezdxW3I$ zcHkd}K7*7OZw>5%i%c^J?S;7G+I}dLzh521>ATt3nT?;%EXmD2xB19I9`WhjlYbrf z=S}HM`Q%`YZOFTITLM<^yx-`%H(+0EuJ%zBNarR0{zN1E3YLX21Jz#_sRK3s!Y}sq z^qVD+1`%D~q1O8*i&Veeb-CX-Eno#hF93BT<><~9;9!M6suf)0q3D~_4+}Urq&emd zIDxhFe;q&DkpFcFsQt04*o-;P>cHt5g)@#aa+)uRmI9IonVVxz^rN@FpuiF230T&9~E40e{rn4ML7hci^aE zB(n3sgLB*Jp5zElqZujR+beu;;vsc^sz!&O?0>-vsoWm$rGG>#qs|(v#+iBA>=U-~ z%e;psw9(=R$WaR$?&z?UsFODr7&4hw9IyvLApV``mJbV|>@nS5mpRchSP|{Yn{5<5 zXl>I;e}Nor`TVitQ;TTNjlz=5CE@Tfhu0&+&8K?}P~^YpFYIe`Q}1c8fgPVoi!EHR zefp_Gny7g8k+<2y<%DJ#+(3IjZeZZ@)jd=vvd?d>F{6&s)+Cw(hHuk5lf4sXABcP( z{X#3Ht}NVj@%eny_PcwnU#PPktW8o7vk=Ga7$r!X=`$pw-s%2 z5UGq~6Z>>a1}8^&C5}0!r^`uq)997$)p>{8imme+)jR~9crfs%{Y_2dmdc+cBHLPusKna7OLUe9 zkIfwm)ip!J*jne`t+Oq@^k<$8!p;Q{;Mhida$Vy8*6c6Z99T$%VRLw*6QKNhf#Aa5 zoW_Gnfo?f#7-=r>+d;vb6vV=R4T%B&0~Gp9u84m}X`p>VKR~~AujVdLi~Rw7D{a)W z232F@*&#P6WHJZ{pl%vTX7TwlsK7ECnYpaOC`ZDa76D~;QiA?FZkWeSHOz5p2IJey z$1dz7#_bzHUmJm+i{-g2cNSxtI0JkMv_zBw#;xy#8Z8{JPNB|VtZS=@lG81AsNne1 zU%}@etV4L#okPD?PW~0!ilG}OM>20~gl<)jP=0v}%v2DgX&g`zLjoUOnko*0HRxWk zoAp}mgp;cVP=Owojn2jx?*7_ZBd!SMaD$x^z7+XV<;GokwYGmG zcxLZ5OgG}V50wXVs?b(7T!wwUoZaXyoF~5H3e6^t%H0QNjf?W=1vhaQAHKEK&+!ZM zAjUu&@|eOGBgN60_G04q^c73B!!cc+b$eF?n|VqHVt-9T^tMwJqlv6 zfS3$`>2LjHT@UP!hHctzwmQ2!C~wm32sQ4k>W0I^J+0hWDw%mbfo}TXjKH)R@9wbz zG?Bs;+Oc`yJJMqRzHFTcFBLL8o{oNCe8Y_aGHI7WohPY6w|HHIdkIkgrbllKE}7VL zKg`vO1xf7W=`NMPZF0B}A~nnSx#?hc(Ps0xY%0u>%TMa$@RJ6ku*qb8^j8|U0iu2Pih;^KqIz6@ygTYX3bWhiOw&N+L(lzRUP=qr!0P{ z_=$EJqBt^E-1!1=tP8G8B@giD0hlaFyx!fsA#bV@Z|@%WcHs%_+8tgwbM` zE(I!m8e}Y5kk`_4TTJc)4PQu#{9u1>vL99N>960k)(|qciI60_l zYT#<5w##?=td2JH;r5kx<1Yl(a@RKk;X9`>4<~={&Hc-X!kD7)bIYfKvcrN>TZ;z% zgPUJl5Lpvs6?^N{s|SRGlo#@o$Nz)SYfKA6xUCMam;295>y_Pb)i*peHOu#!P0UN( zezBDJQO3wFUrU`qxlC-+ixds{Ip-A93WAX>BLhy8vcjWha#uL*)~c!j>rk4G*HGVs zI}S!%I;9`q$?$fJtsjd!I}bP?d;0wPo(NQT&eIFp`P2A&`IEgDz2UnLePGN*Z2bTG zwm-B*musd(rp7&#N3v}eFWDn^-$vKD_?^5gs2<-l`RJ3{ISuHkdGUBr*?T)iyK$?t z`T66?YkklR)BP`BzJVR+^Cy4KKDx$qeoT5pQSZ91yL`*1oM*R`r}=pos7c@2Hs0aP zQvZ5m@%M6z_^!q1*2DkaTlGIsycFU?;TwIt1pDj1xo+PGp~LM`)I)f``Mji<=Dbbc zNj^Z{;9kCEe8lu&-Ws2wo~nagU>oqJ5r&UPZT)zPL-3}txNBbzO1gHq{$*y!P7*X2 z(B@+a=J(T+z)kQ8g5SLp4@M=PEkDM0t_CM4-VwAU$RRPq?dGHZ@p?N}+<#1oT9sb; zBoH%UxqBjT$Bk$gQta-h37?*JkqXNgdTF0R_H-NM?0&{=eRkMIGnL1ms&Khmd;ey` z{a_DZ%h0~`G=q~zNoTxow2_-=Z-ld8yC+>fS@^o*L^`I=){V zBYt+g^bNU-JfF6;-(dp6e|?C^Q?LyEoPReojsA~MLScjCd~3)ia~E?iA= zx|Vw3+8(Ft>ZWU*4XR#2zx21pNeb(dVx47QlV!%IWm9U)V$e_WxI8_pKj33OJ#zrn zIuPw_6Pr1h@bM)(awu(lDJOF{|Kl(}bENF!NNpzOnDgp0)#HZAW9KWd7oG22>$*3u zyeB4%vq*oYN5;pp?t8iX_j=s=`K1S+Bb$D9t(n(tT70-h+N$7&|L-RCk!j@>P1a+_ zPmhyI0KVN%f?OtyMH8mDr*V}}D+ZpjD?vNECp|degZH0tqox=VWK}ohc=z*I4)pAO z=ocMWPt;39Iqc3S<{r*;!05E1@`v%z))${%Ef8KeB)^_eh&3XS!`I!&WsIN&M{Z;N zKo=fBBBl!*Hd15jg51T_dD z2XvJHO!A%d?{X3Bon4(`BoS!LR%yEZ#D-p_kh|=Q1q<*90QDRJohpMKW*cVe=+qt! z7zu|Dg%TRv;oI2YPCSf@N6u;gw1J7AG~gT0jZ1~!AD3K!zLMn(4uRq)vp0n%8}p%T0|KmyfJfh zzF#Y=0gp=8i4e}IGV_i-(TMeyT|A4+K$BW!I7+1p=^kAOv*ZE|+bRaSAVC$R=(PiA z+-0M~qpW!qsojkRl(!^=;#zI2pVk!Tvts(wgC3;KW9`0H0-2WB=8UufWt3T z7_@Mm4YH~LSjUEJ7GAx1!owx6(nTx%iDi4kRfL#X;ITj4SrG@S`jr zBpWU|<%{7u8{kM#Mt&zge~yYZo^`@)J47}lczuLCpqXlCSnQR?(w*QlzBXbmdQWm1 zTeT9I49eYOn94?qxHzKHSIyHWicw5k_*a63mMTtR?~c=2mg#xr0G&<%f=tjI@I(_; z^h0TehFtwru#J=koAa@W!|&q)O;J+l7{MYIo~5{~$#^ER4ke7SgzT4wHcHvLclgGy zs=YpiHD3{hiA=qMt_Kwi3p%~OqR@=XyOggcJ8xTTAPj4$;en)>B}jo*kZglsA_iH? zg_m@p(e!)Mpn>2{X%K8Dwu@>y1GEMJ{~t~F9?o?C_z!&Nvu$SB7&eAE#2iD?Hp37` z5>m|}5!D=$q}tKBjD)0`L#0wFDxI_;jU>9|R(ExeTcz&mM(U>e`26d5~p4LsGj+~@kktX-HUEa)gV7;fB|HV;Znk_rp6f$BJ77rvy$`KtG{NGVAzoZe*rq;HrjP9w8 zv`QUqsn0(<)K29trs;k96r7!ob)Vug23_oU&3G^58v(ILWTs4n#d{18fy6@bkW&*@ z^x5dpiokXxfL=|FoZJ<9M|Dcsgdb%YXazA9t=P6rsQdmFGfgQvl{s2O2nS2clLU;} zH-(ah_ti}UCw8zbQ@tZCutytr!7LKQ$em5*6EusSCgY>u4M|Q0vRdTP?^wqsqk=?} zcTkQ_nfxM(Xc#?7Zb&&`LuasYvzYOIk<~a0D*~WRq+lV?1Yt}(B-3>Qefmf5{S2;XHB?TKbQ0;snXRihl>Q;(UZ{EP@KMOy z(Yy;$Z^48fts{|M2TVLRmAoNoKar701bpT-eS2TfQe6=zZ(jVa4%0o@*hwrTt z+F^VHY-gLy?ll>sPqP;nw4A_ZWK z5L;2F(JAhP@8{4LsW7FI^d%WWT3LiBsq`8e$WkpVQ)Mm%nk@(*mTZy@3oK(9jkAe1 z03#jUGR-zhV5OuTs7dn9(XMUD6%%8Opc>P}JJ*lT%xp~*!wRc4ileDfWi0I;7Bz;rQu#Vu5s zn5=k@&iqQ*s)aR(ObXANrDzANl==bpzgZf2`A?!!r!22Gv76YW9;)dih~jB|)cpwH zNQ#~|V5`LxZe>NQ-%hg_VSBHGBcE?MGxE^lBGTw(8@pb&X-dHts*PVVHvCPkd*ED| zP3JlRiFr>TE}qk!G(xT&*RSab7cszTHJG4Y|9s7GYsqh?#r1_vTNBlH5NOJT_DNZ* z!LU|8@5zP{b+X%Dzt~lyi(Tg9v~`%ITIcucREcpfWLH13iH`Vtoxq^2{rWR&$W)@S z<{qZ~?~S^zcCkkSQ@0aS#boV;znF04^(lS#DI6g2cV3fpXpw>k60hs70uV}p>6($V zX1Od9m2Prc87Xht{U-P4-B`_JlKDc^8qhn-Ult?4q%#l15VXnSzN-Sx;jh@{llyRg zvI|ze%*7R+clezdcl+XUUr?pF-#!cIn~Z$s*&*>#fm&08J9Eio>lMbjH#>B8{YjsLD36QdHE8mW13R1~ryb$hZ-?Oj1nGMO^t>8c9Rj1# zV@2)3t}TN%3RT&KY|9|nnX;jNqYDex@Z;n`%M1MZ?X``WDfanZRrFF!$npaFHnhUO z)y7r!+A`WYh~Rj*O4gJuA+Po`g1@=sNmN3L>uCgN`C$zBS_?>{NiR2aBs&oCtP zK>D7S)l(OHZ?38(g=OoE?gYl4YvwqpSDCW(`ud zQzblG`8_e(cUdGw(}RCB@oLI`0Z~qaBG;fM#sAjkgKZYz6veNxvelP)FG?*UB~iKv zUw!0uvv%LFZJzCPU$8A~(24OygWtDkzyNYjrfJu_}-;wKVv&|tJ*M(EthefF1k#!NblQd!T2o8_n? zc@F4D{?Ay}5!O$G?Eca$gmhR(zw^}tT333{yz(7!kLzH;_%=d?6ogrytiP%&g@)xJ zZhRW?V0O@s*c*>G|K@u2P#?@-q@qveZgl_7KR#D6Rf9fW$6sW>+=s3~~F7E8l~=4aN2&aRX)(py~LbOaFoqnl}ZC9y>8FU}Cy=(|;YFyHzM zu~s+_8>A&+5A(RTl=;#KFOL3A5!g*tjY}gYVNXuVEGSLqIU>vCQei*km^(ZsVVaPt zi6+f{V{Rt)Dk3e79NYNC9KJ5X$>P%Ph|s$VpP78|8Vnj|KFE==L*z_g@SSb@_P`a8Z zF*F={v}!_uaG1ri13Hhy<+VTj~-&!Q@?CSJ~}KSo~~& zU&TByN84h4L%=cJoe$4>KSdh4xxK1<(5r6jS$gpCZzOaosYxzY|r zhR*$wo&irFv(ypmIzkPn#kk%4IrKI3$nrDW+hidXrXFNl@2=8Ag%=ZdZ3Gh9ex59x z69ZGc;AGOAazbB1MtO~L?v>!y3IPa~R)iK+>3#mlrs$4O-ISpO1s{aw&4Rk_%t04d zu`xWV1a}%xN5Leozxr7iZBmU}K568qOVtXXdD7wj< zDr(9;kFt8->tmt5=^TU9S=njC+j1_;l8_y{sajEQo9a|Oz^{I$xRpMm%U4ilB(hbR zRiQ!S+1Q+J8I4+Xq+p2?RVE5_Z3oyZKV351qdD%wiY(b&y|S#AG3V;gFkTue;+Q=Z z**FmOXOo}jW4Fw1Jl>O8l!A~V+mHrT(@{?#0~W;QYuJ#cMx_t6M@Iwos3EvLDm1smvClt`h07b2I9){r1$iOF(c6 z-`7mQhD|6RtqFMv`D_G0y+-_X#L@EBc1JM19Iy7$MbvFDQ?@IbkGcTs^A2oE`)yNA z{8~&l%9(jfEDJD>D~vp!R?kJ6G)REiT2 zGz0I)ycpMGrxL8!ac}eYKHE@(%Gw^2vj6dxqOP-#65hF;-~S{y+pTfzYmCnyX8r&&msh6?Gl+k6v935 zkbPQ@loUhL9eAs{{XvsNE4b-ai0NNU-E{$|3NY_w>1_lgP?Ye0ZAoqbbT7c%hiP8v zk6Nb%?H2~6s|7p-ST+ZqXW^DvF#S<`OWm!J3CfH#Gy)CYj% zyKhFV*WH0yloT2EE;7CKszbn_FC4vBHS(2mS9%N&LF5o zGl(?`jS#@9s=%Y)N`B@OgwNBCQXO^BL=Fr3cQ5L~+`)UB7#H>_qN-8KIb@1W>Vao$ z!WjNXhwGK5s#K2YYA*gez;hmuvRBC1-M@Zx(LoMClmg&~wGL$>TYfh3lrXIzigAi% z*H&bkp+$e>LvuwVr*9mN5yrz8Fbqn-Zp?5ElS@ALS;Tf8N2gMI)kFAaNUvHqx`y5mbLRu zSn?b!fCb4(f^p}dKN!0^w#WRVz#BG+;n&122;%Dw%$+&3eE{;h7ZAfo-JXtxPsh~V za@N7LGu;p$E$EfVppS`}bOFz7kD^TMG7851q!Jzrkd{+W2i;g!7S1P4-*;BZD#3A9 zN(lb3F*j~k{`2BADiXgw79Wm~N7aL))8rdP@^~-OmL+-OBqTYuXa@tF-d(h7sVK{< zcxO^^ek{ecqd4zFv4~Ofk5_IMAO2(3GA=l-=+u%jTDz z_wutRfFbPpJzuZ>vb@}DUl zfvO00)_eF>G2*I)+a)lu=fB!2FtFN)R-M7B-j#BUvA^2kMYS{eSULCDivRv&-sA%% zs$+i0nu`AQJ)3F@o}qXbYA&d1!jZ=}1RswnJsyt?+p>K80={;mYwe32wZpR7LtV86 zaobbpYM;{Ua*@XSg2Qff)kW%V{jPA4UA-*5zT`vFe=;KYW zhiusKM2vzBO=KYsSAoX?7+VF{Ty*pmE1VDTrU=n}eAFH&R3lzNA7>TuSZl3DSp{=z zd*o)lRJi?|;ka_cw<`GG1=qsZ#p{^hoKkcZHSbKDSwlMIJrgzf&ENwQ<_3VQ%?6>g zjRi~~U5dLcR6;q8I?GK*JJ;|bq5P6Zk<0~C8>Zqu+^y}p;ZfVnY*@3#g3>pzwOJT4t-V z-apSrmdCjH>-A_Ah3V+`g2OFFX{8+s;V5cZh&cd3%s_CXOn8wJ_84>{BUyg}6yD^0 zzOlKkjAaKtLGQ6lRatJ=$&-6n_W9GnWh)9u0TNZpJnwnC$9dpV*&KrE7A$8$tQH`D zh+(-3zfb_8tOH43=GLIXzzK*_J`bAQ-U2|yF48wj5OsmO$`q&~8DkStCoy9G;A1}v zu~pj3mjTF>z@UxOfn<)~}OE||z`P8oY zs*N-Z%?69H*E&!us9D@5zJYWU9qe+Zt9;OlpkJthzffUaI$)+u^a_MyD|B9F9+j6s zAW=r+tTilw-larP5EC=ag1yZ#N>S;paz!6*(uvzZ;LK{CLhrp2G=xuziG?_J0nx{C zHjA`1b%SBo@LyQC-bIfhgcgw) zG|}g2f{(t?NQW=-_(;D?KzpX;u3KioRKG)eZ@kyC13F+={{{uSJu$Z#m=@9HtQB}2 zV3$&>cU=8HN>T)XkI)Y_*J6T2ihm*47fLtBybe<` zcY4CCa~8MLU&#kYQ2_(T4>8r|ElAboac(W*dd&8lqPtu8nFD!YJwi;c5Fs-`rCUx46&TDhki^wsSs>Wzw*p}=f7h0|?M`PZWM@?raW z*GEj#chw*&m3ngmv;yDTF1nke)VtXM>)?~;yPU^a&<(km%52P|Ie1$w%6)<^*WF@R zPL~yW%N?ngdmXpTVPuB=i^(ndfya!jPG=zLid~X_sl^) z0EqOBQR&qV&Al&rge$hEw831m>%9ZmaVq9AKecQQ0+7xQO~jb0=eT&BDRRJ=Eu$4b zldIUn1?J>l4{#8LzpnK1ZIXbWg)&%u`md_o9|b; zqIvj1)!f5|pad0Rw*R_zVqHW~856C~L|3VR7C*)EPDloRw(45Nd$89YW_;)z^g2Mt zb&fp_`tXS9P05|9KYsO9M;tGE24P?oM6gHaP){7sj5apgq8uD_`6xTe^e$^mt4?`R zhn$#O{<^R7U09>{-Y+vRetRFGWbc33ck3UDl9MxB9~?hhZP|88Y5#1IIA$AEXa1r9 z0uQ?wbJOp&>NxI9SX27Jp0Dq*79Jd)%xpt+8@?etn0=}*2zTa&Q^SH$$XjBRu6{f> z_1GARr+94vARq4=wmWtH=t}0ZR!!aNZHmT;RpW!EZFH5<)$iylj~To@DD}$x^N*Dq z+!TPz;?}g0&VtLQ=~j$a4SyEyj8C_Rc#O52z45u>S~X(4CGu9=jbp|CP+DF0jH}Vf zo9r4hQ!fKQR)7Aq_Q3o9l@aw`={~Mf7rT(~#>&P?t1IrJq9UJkwi6)W=)cEjwTxPwU z(WQUP3X7`5Wt1M>YKo(1(Dt-JPuinZ8R1@uC;w%ol%LzbyOD*pOs#K1q`geHJ+svk zaE_9kLX#`(v%P2_uqL*htDn{I&uP2#Z1kC|o7Z+&9GqVK8o>e^=AJnyYgjoyl;F3)c%u}Wh$tV<#^jPgwZ}21WujH3Zm@XeIcpHDWSQ!%%)6Xb&|I`9eyTH zsi0LCrj&|K#4&)y(&`2w?Q~%vuo-DM%&?MumTz*5$}PPe)di zP&r4PL|%y?y#_@x(IZ09Qc9Wjp%sxjl$J=#YF;zK!>il+OrbXMUAcl}wp?CYjfk4A z$`Lg?H_X@(<4+&J&Yw=I69v?#R9|~bxO-0Wv6}nwPOBmJ%?chy5?*iWt*dE@!EnzU zYAX#$$fd7}8*=imYHvXB9*>=O=5}Edw1el(6DO9W$Da+K z^shR5+VT@&*!N_zUXPLgGDTQ;?GoO{CwQiEoqJP@Q{u9pc7@V!EFhUM++==IdRGeH1cr zy#X5F`-K}%AZ)yG<@n`Yd;i|N4PiW>+3u8k-+#-ecN*>*N>ge+`j5q-{U0D&iF%rr)GRD9$8ol zO#|-I?VvV{DJCdqU7n=#kC{AgFY?Gwdm>&@y|S3>uf<(|@h~%OgXtfyV5@JBJ=vWa zxBkudiCYh#yM^-5p((qi9ZtF`|Vrv{|Dm}cAUxY-<@~k zuGvsv)0#KS*!*6r)ANdd5pPe3_m4;1yW*ugcbM;RNpB$K*3VweV-l zQ?0s0+@FQtZ6B;ey0soeY60kc6~w7SoLL_9f1UJHq15b`05R{uxKLVCf&$dnl zLiRyFguWUDSQn|`#+i;OJ}Ut7K$0~qq*28yr}aT}27LxmyWW+DurAvxiEEpJY%CEm z7>l$6UC&D`I6=kncS%`X5#f{WMQw)&5~4^H8)(Fs>`@3cnubAHLD!7KDl8gRSGaAQ zYeYV(@pVhclBO4#$t%lY`U7`2BcUF4QYVcF|AH^YUQ~(oQ_4_(-~Zc083Z8!rsQCB zl)geWNf(F_TS~Ze9>3OEVR>mkUtP)i-fN=~ZIsoBO^BFd_-Xg^7thYceT_tVkAuxW z@`}=&#!BxoK>bm-A`OSlv~L0_c>7 zHP3RB+`1h4O*5~-VwJS&2s5=}m@jV~4%X=Mm?9o6)-Hl~1!H+?%wTobwgx z_(o9VDuZJsVyUI47?vn=vUoY$YfxBKw$5?NgnHcI@Z7nYr;o+3)2g;~rjL-=P08XiX8j2sX#ooryd?^((0qDf?)%sOV*~;z#aY zNiixAsBracSgZzsIyCqYQZ|bH&+8PAayz(_SH~Nt6r_!XuNo1}K}2fs6i3>QmCEb< zqnw8uS1ljgCVMkgm!-JTi~jF#o71P~&Mbq?et6Z)XqZ*bZ8Z4CrCxb3A7aRBLc&9P z^LL2lBx)jr(zZ%}!KBnCx(PKb>TR!S0tUZMGFoajL0=Lf8XM#c?avj4*slC4 z4#vHsyl9g!r-7ADHARS9b7=V(2UoxZqYwNIp#a!v4qYJ1QU&DQyPKt}z#yYTEwJO4 zS%?Xy6*A|iFcC0Tr_xXD5B=(I>C{wu`@R|#df^Y#NiaIEL(UOGe3sKhxMLM_G%nqLAZj(a2=*K z%KUN(%;m{EG_d`X7cxm*ceGctsYb$BFlg$2ILkz*mBmtJ-t}Of2pTn4{zJQ_fw#)8 zhCb^?^BUybd{%sr>KR`zLMr64C{f*=736*m6xt274569o9=_+`=IQV#4RGKhC~K}f zY6(c70(G_(zPWg-R%FwCvquFNDvRQ%kWMSHG!9fsy?5jiD6Yg6rh(3GHnVUo|3WGP z>Y(H4hLXpnKe`QGIs`mVs{N90FwoY%auMXN4_%J;OKp?fi3g9a0hYx|cq)lgEU1nz zjVyt1gkqfr=f}smww>8Plf;zBs@p)-r807fEU#W3&;%lQ0W&(yKlG9}U~25MiuJBl zX3YT%mn3>r9RL7!5d!@-SL7=L?D0iBjnby$5}5^}E4=L)AOW>@b3MSL9=VSM_h6hb z&?*rkkns}m;YuuKw?cx9mE`}Fn4c&yV3DIVU=9PsAwlbS5|=ay2>>Eb0xDu9Ocuy8 zR!SEfw^@={iUur6;%~hr-=auH)!^7!qZ4%bgF!I11akRgDY>)Q=11VoABvm0SBXP>JC&gLHI#J>887X~Z9CZx?WuPPRM?XA0?WkA%6*#% zzF8sViKOQ~$ej2`9tw&qN@O`{a!!Z5JzwVGWyZ>fB~WFqZPI9-?2#QBnL=F26Tlt3 ziVCT+DX;QrrE~`$Vv@qX<6ZAkVu(#vKadr@>nqJJ0CPgidT1p%qR0REQvwtwonCPM zk~ET!xkU>4`$dZb*TJC5!p{f&ZQQOkWk|?#@>ZM$DP<9@hU^N0?l5d=9=&@Bh^+^j z#nu3_b#f zbv$iW!Q=2eIOp*h7MgV5E-E_2L^rdTp!ZV)kEwucY6rza&Tg)M7=Q2K|4`Fk4+WHg zB;UY7-atz1K&lQkZ5-HnZy@tk;Eja=6T>PY{b{!Equhj*M|p)o#HyfzuAsv4phJs6 zqLi_lOrFm7Ey~qAFVU2?Ys#Yyj?C~XA;EQ&!D`>ZnuNjH!a#Z$S+vG(6)$ANQ|+GP7R) z=kRlU*faOA@$s_f5ZOfGlgY*>FS+C!q3*9|!v0(j(+(HM;KQd=)JBcqndp%eLAaYR zJn9&Jry~4oTXi6r*pJxHb{<=yZ1v+-W$mZsf0|UPmoK*vsHYi@H)ISkTK4GDeQZIw(!qTl6@HOa(pg1YB#5)jb?Y#sd z3vmNp&Ue-n>o_|@p`k0Hn1YG#d2Z)VAHJgq`MzIw^^zw8pnQ_+dHr<{fW^)L2p_w{69&$ zUBLXd71b@Gp1Tsfj%DH_kndOmrN!#)$`4N1eCdm0Hr{Rcs&>zxxAU$dC}U zoj37tgEaU9Jd{iYVyO^L2W@vpRh|awN`f_7=|rre&0aH^^>SyH1jGR7l>l75ytfSl zjl1Q6A0_&;32OoVf_Zs0*`si>2q|*Hsf(j{{#zG{*X~c=0xPrO#LqTzaCVl&_&fWk zFHZ~M8TF!XCj5%DIt9|l+*}^AzlK5@Ix3SyD(=yR?Yv2md`S{E_UMw~AJQgJZI*ZM zNr0=?E&0vcu6$|^sW=4!!z#dB8(DoU#*U=Bkx4TZU@`!nieKwZ>SV4kuTm5VWR*l; z>qTbP8+4z{m;}%n#bN~%suiV_K(bei=BwWoU%3=RAloa%HlvA!LsC-7YN`TUlTWM* zKd!?vodMSN9hZ50=DSl+s7m)C{E^^213g~6e(w(70%eXuN;`&H$CQ5O8|~=;Im}5P z5Rbf012uopb03v`PK*30aOkQhWGTX9=H$ztS~8ho&ghL?lDZ%O?9i=^;lq1m5C&Sh zC`N6blZSh)-#mHmTXNZd?#hyR(2IGpzF_FDoHB1JWlum^+b=MSzv+8Qc_9F1-!>J> zlqQeD-ku2QTY+S~?8&D}H}Hye_%1WeY;!)$-fME@ago$}65>!V%@hZgjCttbm%r7EOto}eNFO=CB1)BvV#vlOiU?MLHkRbTFk2qroeAa zfU6TRAtb;~sz+f7#C5$gX-RCgEVk6HiqsT~VV5~6fQT`A-6hb`2_O{E*Q*y*m&sZZA1LsGN1l@vECCHQFym2hK53XNfaR&=*E0+~1Sg(* zd@x{0;smhmlMP*>ZrrALw0H#s)f8opic-A97HROE4AF!&*f2k<@HB$KL>J(t`lHg# zym3pF#5xuv*C#8gz){Si5Rr4un3O&U+q)zw@806U0tpgnzGp}r5;>m+6?Q{kSBt0O zr4>9-_0mhS@ao-{081L7Wi!aE<4UI$C{a*MCjoczKV08fK%U15%p zbNR45FHMjJeW3%oxuXk|AO)+TsQ`G||6p~Lvjc~417!N>18}ph6)!Mu^Xk)k~Tm z@$njd;v{tvb?*JQD5g#N*bWkUIM}5gn&wq>We%250`!-HM%#;RL{PK+dmZW&aZB+Y zQ$+^XV9-(NwdT^<16O{(4fU>vHvXmiFNHl&LImlchoj)NUW9I8Y3E&sD1K30Qbi64 zT-yi2@?pMHB4)>K&A`gjZ9YpUZq6 z48_^6oK4QE%grLy&DUI*FH>ci?E{+sn?*Iwwp^V}e?Y2ETsV}Q&8W+^H!fRgdaz(H zxUlM<1!vq>7w4~T&feEIf9({s@d^Kk#d`H(WZI%- z{vz+pV#tHV_0E#8_YU@RxyqItAB(+vs(>4U_HNwq%~JTS_fbo%g*@(R$mSgt2@&!w z+oW6n`%UntEYUfyB_MD6j=UYkc_LA?X3S>Yg^$;yvU3LRX&J*r$x_8B6OT$C!;h_+ z+EoE3XNTjy7U7*zwaO#S&0|$9;dLxvR5T*GE>!-m)xPz@Z#K0TM&7mrJw5Ya-_k;) zlp8c=k_fRxbrqww^GzvF?7VtFDAxP-M3=9dTURP z^5c?S?%?_pP8os|ixU^an|kFF{NSj7VaK#b=IZ$(hoU=$e9_?L-yyZH_H)-sv8xK) zKRi1ZQT*msMAxf0N|~Q z`JjlN{BeYJ+y?Fd#=f;C>)3(CS0pU2L&z`MLn&r{EbB%%6VJ3;c$e|66*)J6zAeqZ z{n`h4QPEPlZdO^Vl%QQFl~SBN&oq)yl!x1ONB%uLa`WxKv^$M&{+3|Cb+3||Y@>?< z2*Je2;5D^0{g&9O8Lh|P~(C?4wOznt7u``Go5O!foIn-bFQdOudmm(sqbVMN<*E!(^HECG%!W#n zjv47w55B0gaoy~>&H3q@B%U}wm5}OBvgJ!?e(#8C;QcdGza53~6C5q!R>OqX*{yij zA%wQEPi(^Hs#uVE&-no3{2<%Yj<#u3FwNFcQn}_G7a!;dRn*Aqd1NYtg6ft>NtBHf}jm7ePu{$i}Nt0kZy@D#X(%QGB3_ zIBCY;)LNs)^~}i&>#fYENid?W!A({u*Kipe<6NcGiF&O~pSba`zdQ;LEe1Ka&5 za&hR87^X6*zAJA4`VM>=c~IB$0*tL5&AeLmojHp5P+VReH-(G<$W~Dk<($lE!cE>E zl#q#zp0|C*0xg809lh44VPiY+fziIT6$P4y77I!XFNo#M&|ERTL$`WUI92YQ_6%d< z{em)nv&c#JAg;_WT0L7`QEk^7KMJsQsI|Ga!&i#x=uWuqDC>zC2I?1Sf;`^{!P zytKc_{4tmZ&!s|{TjELBa>VLxF}5(X1>#JC;t%1m`bCxIt$Y=8#h-Ya#Re~)3@{8_ z5lSo^vkMj#;E~fg5(HNT8m=U3tMxKn{Qnd|3Z#&PFMY zstCBZtsa_nYz*qyc&#EBPc*zEYPKBrv`C@)?`_kS&nvENDvdPMAGxq1wNH^|4Qql{ z23(8ucr*)b32OuUaieo)2V3_IkOu_Xm0IjKbyPn+cDb z9x?iLP zXSv3OOcCmru4YUd>|FvgzHcmv;e#2=JRZ$lAC|aydC*{}@mU_MEOW-+OflO@24qz< z*8C=TB!U?31{JxArjQC1lo8@t9Mc9?u0GMHTpj4SNAs{RI}z>Pt}O|rCljsvI`e1s zD>LhXdZQgP2}&S>pVnfyNAS>^G6i3k$bA4s^#YAs*o-5#{;{OE0yHCHdTHuiG;mV8`TZObNBN=W`VNk#BFvpKAeS$Z4}|>(u%){3@X1;n*c+CYrc3ckx=_eMk*-&5qQ6$ zFik|<1}N~1}HbCeBdPjXx54-hEh`x$ok+~u0KmXF&MtlI7KVXdz=`+2yrn? z6+yfO;!*>x>f#+{pe6MK{HcS)B%TIddgc#J5)43uO-C(s12@yLL4HdL@ypT{gj+q^ zd+UARN8!Ja#5Rz=r*fw1U$@WnKZ|qc$ASZN!pCJ*9OX|@NpDxpSVMm2>II-)>?obA zS#44AmM|DpVQtaT&2@f$4smSR(r_;y!XV`teA@FsP)2&p>AVIDz=Pbl#V@SOBl+Oy z1db(u<2nQOMS%MR5Jrbo`LKTz33OVY=rq~O(#RgPR#-UpU$O4Bruh3IipZJ06uQ6f zJs!VX;75^m<$_FBYS^}|5>L96>7^S(0MY3jZ*s4)%hczD+MC_mHwkhm2}@i8xii5Y zfWAA{>z(ypSm*Xyw1R%Jbz3KWjCQsw!@s!x)b>*YX?7MFEHP*p>U@D_wZ9k zB49^1n7JN+8-(t13^Ld0v2yl@*a$2@Od-`_@N7Mg=j7gLY0B^00~$T3Qt$3QrUqm& zr*Yj333bfWE`M$XS3sqYl*umtr37*2rDCEV@Q~Kdc@z6M~r$!TP}~zG!+^c?SGZ_3V@9>AhGR};=Y2AVdypCxy?ZkQ$(Pk-jzEF}VB{#q z-eX^-4$zRJ#-hFi%3min#U4!6er7OsNkv*b!e@#cXTYl!KzO?v))qu3szQz6)>Lt3 zmdcwOz3@7@V$3RXrq8ry!{9Hq^1hfxmArh_|I;OL)n0XCE?c`EQE_8(r$+9@2mW{q zX3BunTu|WR%cw=P}5jRwn^Qqo-WCW zNVUb{Sv6+xG7uCj<`7gIPm#YT!r#aU6bss{t~j?oP2!C3ca3haqQD&6P02H25>HGl zRGX&I`f`Vf$Mp?M&=g-z!wrrDLdv8_JAe(VeAO-;{tmxF?Z__*`MLoqi4F0j4ZRn) z733Zbb8;6a25VB9ipX!Q{3_VC6JT1u2r~=!QvktykZ6$ueAW9eL43`*PGbr0zOnw%jP(@3dL(Sn)bg zYbz#&ZJxrJfURY=`eVV|5PCp7J@Dpc*DJuF0=lE9l~>&w+}s)xm2TWM6B_;;shK%E z+8VYqIs6NK?cz)X>@DBuZRE6nl+$(t_qQ9W&(!-(ME~&Lxb>}d%Go~Q*-f>_!ibz& zc5m$IV{ta<`0y7K9cMT9o=tdmwx=zO_4e)7kMeDxa{|J-M9X*KPB#B>KlhV;E+y*R zOF=wca4t3b+z!dPwCdEA2qk9cMVpKfamGqO=1A(UH>tairY6qWNdA*5Jk%>RdY=`~ z&UV_7<7Z3dzJJ&c_Tr!4`<;-t({|rG=|0K(7pJz9IdRbqwgne$50oJbhinhNv_16E z_OPe;FsM!B3Kp9%Bt>?;E@}E+3|R<69^bZZ6kL=Yct10(cx#EPsI7zmENx(vU7R)P zNQ-DXm0th!#;J%%#YC#!hjxM^>L5(shD)P9_nq94w~XEV3gNNHadN~Gmx^5(Du_a2 z`cQ;rh>}ly+7iaPG01`8iC-%~1<>>Z&FCRJgx?GY**%Es2Q#C^lvYc}MWjbRE2$>L zkhSH70Eh&vsLg=Vc9A(z247H!(Z59F)wXTfPnR+g*yE~l03Ep9ZcXqiDUt3Wt+`a z!4o%VslFSXW&jh%%T~{d(ITmV*gq-G-?JZZeIvojtbNpG1QDh=_5q9{mxQx-lby(W zDkO%{w7l<+gYIwJ9`lZ(6sKKek5*H94+5`Dfhe=vEi=zp6iTeReu}NVx5PQG z?e94CHzikXpwpd&V^+SBRifTiS?l3Oy%u!c4;>F!TyEpB_iMSks2!=T%m)u z^!%xCSwETbY~uvmOxwFk!*Sy44tgJ_-IP4@^N)z9^f|KmlOTSgVKWWWfQ1k&lnv{4O-nl9N8_3nN!0w;x+9>OL+Mju5+f+i1|wL zO~Z0kNYH|7>tq@TpzonZ0-9~&j~DrN`5SZ?;b&El*erT9ip-WU`$eSTc`bKhZT;(! z=IVb#j)lifeDA6s`;lFKwsL5rUSxfrSISY>U%jpxiDM1OLIGT{pvQo$6)>G`UI8Ej zq^_@OO>`aYMPq&0$^7vurtSf^%YO}*CA*#N2>?2=p5hX)bzX?I{9f34QOvA5hYEDm z>Kas$SLx=h5Iju-*mElF@~_0QrQ>B_UsM#>eKhhX73Z~{MZkmLc+gs*6!vTAQ_@Df8IoMn_cL?P zSOe}3qkOGq@6u7{e|Nj5$0F9glJJyq4;U+)a8l9FCui3uaM+*9t8X*>6j9v&N7J2$ zL%IL|1HWhA7Yqi2nIVRxvDJ_?_OTC1L^XqiR1=a)x@Ti-8C$7TW2v;9jx423V=GFc zBz4poQfWDz(aNdg{N{6guiroO|6JEx@B5zD`}usl;M;8REytYv8;^Elx4|PQ1&06h zxa6+&yGU3{f!20NzIsEg+a>zL5agcdh68fT)E?14K1*dS%Tr;=>9FA4yOyebSHymB z&y}uA@A>`=Zm54HV~y|T&oUEFU){d>fNaRgNNIg|xa*V@>x*T~^qzbnAqg}tlbeMO zbVl7{nN#H>35-(h>!o{2=XC4)IsIMmDQ4#5#)tv0*!A&tYGj?SCrkZO)S7_yC);tY zXX`CuAAS}D14R;AXoTxuR$iSz*Irw@eWtrbKzNRVC z9ic?>VyGGp6pjucmQV&+Tq&^vtmrH-V#b zw>u>b+cMh*?Oj~1N?m;0T-Ua_J*BPK=CX3X3uouZ0cDnPZC1|dFCJIFtjcOI9dKEl z1+MO0>9|ti^`&hMtetC+9cSrUQTLZmxsUG=o<6tTul%@wlB-v0d!BK4;L_p1!tDGd zkRV%eP-A=WL;nzi?hxam(8ukkC)z7!zJ~XfMZk8O5WZFXN-(7Dj#{~!%I;X}+Yx=i zY+bxt%zt3aeZ>0xZm}h9aX*3$>)h;`zHNAFzv*^IeBjfB!oM$`yj=gIYSWk9zb|$O z>&`4rq{=o?a~Sj$J&r5*7oO)Kw;2~@fdp7gC01&+r(*<)u}GND#eU| zdHC@7Bc6vpew4?$oS6YX^1Js|SKue_9vC@dF%YaDeE{!p!eR&-{_q5w>uXSh9v$?? z173Q4j|{TA;hZ%lWCBO+L*!2)UA>pgKqz%wLkfnhIB4`6FYb`s0iLM`_<1E@=QS>| zhvG0MVKXAZVbY(=^n-f(lxu^KN}68g)R!N6$phs-KFO`$?L6hRf9YTEj=x>}{q*fh zX4-iBUW2XSCzzWheNP?ZSM0n<*&Wr?%s=l}MBC`IVXUGt>^RL(H_X}^^IP28scrHz z=a?=j*oC7mXG5BJO#$Ysa?%bptjVU?`6Pd+U6HFDdsck>eH6pxnfA2{{_olb=iev~ z_J03JYL1rZ?H)Z$nl$5Fxvr6*QlmZhebV~h*h1djm6gd|5|xb^W(ju=W!p!m4x90n zQP1rA(h1hPN5*fyOGc8@(`}h2Tsk8rkNGSFM2feLZ1!^JjlI5)Odqxl&%X}d4-6|i zx>EhQVg>I_d#h!m=0Tzn$uj@rKUcp0`0r2a>W_0M%P2~&LLbq3O5>gy!$2BVFw-uBdT&FiEay*&rQ}M+dMq&Kd z#y|z;Vs|k&N*6JeWacHlffHq;XVCV|{KjJY>sbZ*hQ)wSX*?Zz?yU0rGZa@jKsmQ$ z|I3Bc2jw#+TC4q=TDP8A5y2#Pczzk$+Mbp_=x-DkJSD}m^5?xtRwfG2Z11lMl%>y# z5eRi37KW-zP64bj%w`@FV^TaIY=}7C%)~o%r9#pCtqu|?&GAlQ|e8UlS zwon1{JfH5z+yEtKmxldfm3O#8ej=~d#0_KL!j)i|(C~($@Cc<4>IVHZjdS1e zZkU~Jlny=2%bZxJLr1CN;w50MSW#IrB0ZjIF;qw)B$HE+_GqWjI?MC5r;C^Y{6nN4%ea+l4K5hMiYqBa;m#JVzNT+wxoDMkT=cfYuO*b$9^S2IN6=-M6f_fmi9 zS2z5Rxc31+G!IuNW^!=fw_0X9qfB@eLOPISBz`2txoSadvI?1~>?hgK?eQBk1IM)kI{j6)M5J+@U5aNU(_xC& zT;wxOAyVUe-jU;g(T#I)nYvvsb=+X5pJVvz>ido$wl-Snt8N~V!%hNJq_|P{&PPCs z=oka6@8Hd*0)spu<@))aJNg5J4fn)wrxrcN7CkX!cIrSu)lyaLZ51e&BN? zDY$tG7r`l@f&3x6Q8dn~Sz;=9doJSi7Na&k(#LUJW{{f^0QvBQG(azjYzl^vFIT%g z`Xx%gLt zDzEB5gZ2sqkLgs{_-Q8m>~xcDMlZ_cB_9-qlam z6tzjL-iV5l#$ecKBnukoBlVnvFjb6C@I&c@>Nv%9;Vu+tedy3R!H)t)~#%$BpqZ@b~ov`n*R? zdtvALqo@UVJ+$%4CNjjBpGfhWg`!e+HEuD~sIO_gF*fXy4E|`@0uyFpLoNz?^A_i! z>iI2NRI)rf80n}ASbbhAvkeV_EeoCwtNeEAqxbs|Re?dX!gINJ zE8GtqtA8x}J|#x1e>!${vQH@mYf7=3XM2!>?z4Z#V_$IrZ*Te)~5bDygZd3esJM&+au*G8uXJcm0l-ASXbab2E_Zay6}eO5CsZ?G{!W-t0~L_f#cKRzs|T;0T>E5JITo zD|?N3^wZWCrvx62Sj{)2NSzP>KlbrS14o?K2@U?a}rd$mW)mZ1vyK!UzQkP6EaEo4*@vTCYKasWp%rCW0r?z^E zy%y~uu6)=@=e%&U_keEoSaN@PZs3YRTAA~|jFFquvfZC3D>m~9r zf+mMG3oO+2)N@kWfN(cbm&4tpCO~UuV&_sTIiDNxh{lTK8(wcs z(YUrGTD++@PvrI_2x$4!3zb}$j(PeF!p>~<<-;uW3%2H~>AYUH<^zG&KY1Se$8G2rhx0#L(F3_)qtW$CcpSw++>9A^s<&~X* z)7|FG@M%%GUpjNql|*=$9;XAUlLbiTnYG2uI3S$p3gQS!MrxM6C-Rx+XS$qZEr8oWwu2^9)8Q5cCL)nBZ!p4`upwz=J>D5EyF-&Aa z!t?i^#=#H6-A0ufea*Dnr%QNQeaXcVr_Xb4pGNJ5Gx{ZHw@Ub)7q=B?S$XH$Xq1*FNHx>|^YwN>C#8uPpF4khL$KmZZpJ9CRA01~2(c=4cPGOl83Igvv>gz@?kuO>^)^XnkX!}Oj38ub z8M;S9$hScTL|~(*(1f1jO<}>;Rl&z}cq13h9JcHf!>-d&;oK@47mSVOdA_;|Is!kQ zVZ?nP=+fllnU>H{q-^O4EyI|pb{{vuy&((7G>b;Osgq-BT|3Rq?zim@a?+s|O0tG9 zqkejwZq}tjBLfJ@E(OzBP?0z3jLs`N(X31D4nPyDps zM)fMHTK`cIvbBvp5Ek3Yu-sRG6+n!kNDTT7<_?I>q;DwQE^sb@sjKx9G_-s=soFXG zBg8Ug8b4QW7V51lLO{rLL^`0GyqJ=Q4Rw=j2bGCV3FeKhX{zwM4yBHO_J^lQ8XxLd z{i-}60hrPsQipiGH#oVd8VY?pJxq?^iP^ea*d3@n8ivIsi2g+l=M88W+dVU`cIOP5 zy#!ZGPqQ2$JNakHivUsZnXq_=1igz_iA}pSo+=Ql5}OOACOV0hGGXul_`?Aa6##kG z5P0EG15W#DKvQL!AN20JX36h{7AYl$emktQP?VkC#hNLTVV`SS2(4Ld%-%v7=rO+D zNX=7Y(Nj+XK3El8{QS9kO~8x=C(YWA8MWlenlt*ApGOd`7=ardPJjl;9+&3#EPWCR z%V1fi+gZ|#e$2d)E_Ni9@CbGFUO{+jYdsL&YaTmDA828Z0jc>w@+}@76i|+-;OA9g zXW`hzg1?=!xOg6fie{+%ykF>c)vE7r;u{=@X>&U=WGPs?Vk5X>yTQsoyjSjZvCK2z z$g4PI2JSUg?k5Z+4OO+xE@PKmR^2XHb<4nW&f9aajXjiw8L5hx6|TOZTK#8Rh;e}z zW7g}-TI6?^(ahItVA)(8SH^GT}JUb72)en@v}0r4sV!_U6*v? zo?qnG2}jws4X$Wm_7;LPU^^vncXi-_uNcsEjN6}7T#Y{D8g!&R=#*>lS&HTPufc6& zQCG&Irq@QF2SWR+LmyDWo>YhJ{<`+1tNygB*SoRsIf~8K>WByTBOvSem?wO_b&)1d z79$xQIdA1rf%l`Fp6I#OtX=J9$z2y6?M~TcB*{L!^?*_8kM`{a zS5nK3A}Vvzj(<;E8lAosO#jVjTOfDa+tzLCo~%*Fxc#{`W3$VOt!*oIKBiCPtc*~t zJhDRhy~u5jNia4%80pK3cAoxbzJ^@E}>kX?rBS3h&XOlC#QWMyt4 zty%Rwb75^3B$@!P=Gr~886bNbR(qRQ%fpZOth*ZGlI^>Sl5=fuPGEHD^4XlV(R<>? z{12=Tkp2i*Rgk;i6_fAEt2x3ea~(SQ17158R39Du#EqmD?+nnOJcYZmvw=BA=tzU{}( zul3y>9a1BXd_t?&li+67+2zJ;`xcY6d;R`z>oL|cw_I7-ll_&u?9;T+SHB`Gb@B+a49f?~=_lw~idhvE;zHXUA^%}t4fl^1DJvT~p~SGK-- zS1w;+sfa6HP>_D%dwN^WHrs2Juj*;{7&LsMc~Cw3sBq(FZwgXH zap*TsnK~LR*sbnHoB`YhR6gVYT`>oS7M&HdQqMcrIDUBHs+Qvxv02^=y*We$GP9bg;2(K5onQFbK zy*m=uHwR!Dg_*gnOuev2y-*J zh-2=y8o1>h2Cfc(k^!i0yzZ#heG=b$cZdKeO<;oeF%F%&@!ap$b)(*0i8hmB-L%|3 zm1wu2-eN**?lq;8E#3^NU1asRH@aqjY}4xiV)J4*)4Tqf^&?||;fU?VTHIv;+bHxF z+NbllT8Odo)6N!KJ;!b%Q!DxjUCo;726P+i3^DZ>JAi?CsbW?!a=wE2A*scLc0vvz zH@s!N5#)bu${dF1@h%wv5F-ba(YVSYuN$AyZG2c_^OhccV2Zk<*GL61&FCgG&yr_B zVpP56}NH)R()O$i| zpNl}SW&R`VzpuR~SyMVGn8Xvnc*_C>h@dxN!3sewv;g*19WdifQ-S{H-@rj#sk$_P zsVti>?oR^aC_93KFoTvwxXB=OCpfZ!l}f`+%^%aQz`m+2>C?Cs4w2nlH^ zQ1n#QR^j4b-;Sdd(Fo7q_FgNz>#joc0Haz6{o-qwalt*DiB;kZtMU~b<*wJK$$I;H zLx0KQr*%!n_tmGK=$nScWq}$jSo+8rC4*1 z=%j#M+pvaFV?mLO_`&nh*G7Xkc5RK}b~vwP)i8a&YW2)Ru6zt|=+V9?IdbtyoqO@n z(5UO#l9jtvLkXG5@;J}D`R6YlK?obVvUV&_i>kJ-ITKRsc-np}DD8ZRT;IF*^!m}u zc`ENeTA>P4ukAq>^_lQP&yPE*KKUHWI`{ardzX4kBN9(-`}1y;duBBH>dM${+|}E* zysrIyF}z4$Y(HarY0@YALF)SRFN#gLEw$qNsMz10eVKiHVdbiaoA>AW=V@F}oFh2( zVX8>!UHt1t@x0c_dxfTx4PkUrM(+E4pO+q5Ge7C;u4YgN=I64U~BlU>=T$!o=kQ(pR%VL-8omV=0TQ`QP zKnuq77o6AEn~jmN;OKgbn%Cc)xyu(6^}35ZKivRf!Ot1uc9p^&I{enp8OolV$%K+U z$lkjCzpJ+#zfbh#Y2H^Zy4C?fQQ}rF3`NPX{L&+&l}!T`QsPFw*v}$Ursun8F|(js z%RZ-!0vIZ?6U?D;Nad@?NRg3NI!AlU@S5uPO6)VXLGSrCippE@HQE`9x(eKRK-#Q~ zlKTdc=j8aSGIx-*z;Caxz=uAj2mGv+N34WqD*KGn`QEzdtS-@IX{xDuh>4z6N-bU_ zSdZ`f_5H*0eg94QVv3%%d-OUi4D9kD?se$XIU#`9&(M+oSxWsjP*RTfnC14jJt^*W zGD)3YJM7SrSRo@uSXaQvLi%Vw-aS<9=-V`uNLW?T9v^6{aI6;w!D+RNW%_%@Ug4oeTrC%26f5dR zF*Rx!0E_|M7V}Eq6&|Y&{QP?==`RCEaHoUe(Y5CQD8{pzh7HSmFy!XN7fI>y# zrU~!p|_6MWS z_9#2U%~<7rBy4ilfEc$lru}o>+nvAWP}aZEqXPfR7oE;-cgY)-8D>#3PgtG!HQH~m zrSm@&EoMwyVELEXG}^o@uJ|VfQs^dQ=-+~%4&TcnHOfAT$q5gOwGcV4y3k^uuHjHH z2YAI=g_wwy94cVHi^qW4Dj`c26RXeN65wqYn)R3i3H zUS3|N@g-q9?|4iIFY5N0!mZWS=UI`s^chfJ&4D;5TtO=c3q=D0Rynv@1>=f=BnCG(!x8`s}>8VQWc>1I!hOH9yqmJJFJn#nk{YMt2k2~A8B1R>m#(~*U= z*T7dkF|S2oW>C8b+TpkA?Ny;H$LZ3i95&2{+lzP&FD0||iXb8tTCFZzwXC%hZTeN^ za}8Bu0OO*6C_i6L3m2{WWQ8$s9 zN1IilmvYCAi$TZax60xqG>j6IR;ufSp}D0#)Mo%eFmt*5z{V!As*LUP2aFNSrt@D9 zpeRPVd!AD1g+zv#-f7Tx@9XIcwm_k~ZEmqXRf07DqxM$s3eNhc*W8&ScBAf=*Z_?b z8%2L!U&BbA(i`>&Ah4qYBxh}=2siO%$Q|D0n0_l`ESe=-w9bZ}>-Rlrz!y7xrmxF7 zWM!;ta95!rIC?2J0IN_d8eH{4CeNWq)IJVdRRyJY)IkUydgxLufxe5LG0*oU_PCcn zJY;oZd|nl+WgNl`)T8xAU~Vdq1!wc86uVX&T|U~oz;>kR%2buihEm^gzoIKqgdWzKYcXLMV!<DKMK)-!yvN-_`nucuTf!lRKLN4T(`SO{v| zaJ|8aT3=@$dBxsS=G?cr(q$76qHti#6$L$f*R>wXS#qc0m0YRGp{cSMiZMCklypU& z_t7&K|J6JGwA8~!+)cHaim}+=l2cqEk1i?R0J)fg0!=5%imqG zP=|@glX+vX+c9*w%jfPzA~zeFk9vr5JgLEr$RI{D^?@s9wDQTduW0epkGiJ+`f>aC z=GDZ67)Vbp(Qu%LwhZqSpy&hQMx>FO{~bL9F(|j0)F5qo)@}7C=?<~iqlDYv2@71p zW)T#VLWtwS#+4D#kHAJY)|L%>FM)4LTKdfy_m`4{XX6*N2m@_^0pDYii`0>Cll&!% zO42PY%s?Aq*XhmII)o`<&-f%I6n~bBgpH8*(Qz*T>VgQT-{{q)TluL149GA(=#Maf z3E5DM2uB06;u5#%{#yJaS%)3TN}nNpor5(3#AL1S<45q}F~m;wzF^;sa%=3)o+Zgj z*rJYMisho+$;{+JQkw|M=aX7mLaaqNsXoS94HHaTT)z&J6Rk1N*Te3&Y8@~ztU{+`4PLT!!?W#_s}9e z1epU?glQ$|nJUW>Kzvo=zqZ0-`M_i${BWkfIWo*&!+XYEQs0etCu24O z@Q@bdPz>T0+9hbjIfO3asma$05y4id9<74}O8twA#Dna8s-(Xm2+#*6bRzi~Z+Hwq zpe=aNiMU-0u>@gpKOi^|iW4EXsuAmLq2W5Dj*o+D;C=;*kO!iYe?P~~EAh8?V~Y3* z{ii947R)IPx=4#IqH~W3kb^+JU1H@wKG+~W8ZqwGwhp;v#7h~uO8Xd-LdLul8K!7( zF9kSI6W=AM%F@|!bZ&}P7ou71hC#pQ)*KNaDpUlJe_#v<+{i|Onwopx@(!t~aot2M z86%{}#Q+%998$!_&Nz`eU9lVKc~1dTt|Pab6c`fp!jb9L8le&Yq0?% zu~%E9?$LVh50jes(B*7cCSbZoP!ybrd#{4fdRX_kvH*oFSOE{6fd7v<<;fcb^4Mm1 z0>^R_x}a!DL9&AM->w23bJ{&_yOUbDddu3MQ_!3V;k>eN|3u-z)FiB%LY}J#QYuO& z6y<1Q1*fPc7kZ?&Xj@CsiTR>Va&cp9@!5&+50JGNbFF?y(=Sgj+F3hK9BtxOl(@H) z1imU!vr3OemENr_y+2X9M*IJwnbFCpsX!!sV!TmtvDyF z<{qV_HrZ7kE9y8}b*$;sGcL$D)|7TE878a`UUKo>u@<}I?PA4TZkyEg z#?=iK);V4IKj8EPjekN%OXz@8=l=svi%2tRCx2F+{P67L-$zMvc8y=+7Ek?n7wJz% za@7zE0FkLeIweIKeM3~RalOi9i|0gBzOH|cqG_Nfn>kZ-ShNUwjebz*jcz-oU#P z`wWs!u7Ighmb-JY8a4jK#9F@*#LAzrnh{0$6PQ%#pQ2t$~jzgk{nf%yys{; z+7Yqt(!rHW?UnV>O4!;7r#0W!y3j>V21r{}0MQ#A;tL;B=dBxA>!ilN)xb>oq}xtF zpn^0sB5UE3{!-)H0PB5cU_oS;5LL*3*2o&rHUhL0E{dYxe@3{dGt#;6$vx0Ew#B5N zG#N`YP&2mH5D)<3+0)K~{Ymp|q8k}F%(wWYCD;idOihfj5=x?1f^)cV-H=@XCyO9t z5D1(nlIXzJ*Ow|+QGQBD8ZP48vCSb)v_st0=c~~BrzpoY6o24g{k@~pTQj7M(tjPioyad(r{_qOGw5!mhe~PjV+!SEtnKFWX@WTjH`tAe|B-9YD zk}>b5%@2Lq)TJgK^d?=^!Ywm!^GZUXJ65Pi>S?js3E&%&)d(c9f(zGinL%WX<}L9w z8!zu!a)Fa}z*cQc^H#X27vFgcf5g~du|b`gGWaht=aueMPy_e4r2Cmfmb|Tt0^!s9 z;6+Eti3B}Okv7?7P8(D`n^eJvZ)|~tL*+bfxf2ZjER8_FgBpm2chzp!aiC^e#NJ%u zUu=A|0HT(5{ zl5c!BGht`-w#93;A(&&wub!X2)=#~@rVr9&w(RVEBIMTf-+o@dyy`{=PIdM8jT`as zTR(5`$T!Pk;eFd~4qUkT=+VtJ&|3t~t*XRZ@XA|c)BYDfZy6FOetunVO1j?P@A`zh z{dwtmP`S{xj=Bk23){A{OpOg}IwAd+V?)?2KcW7PfZ;-W882bB6p2G36@} zi)GBl@O6m2{6LDW(=jIO*-=y*m!MS=_+&_nCQSw+hGLdJxUzPg+HGBnTZs2XNMjISYJfr&mZ^O2213pVup4?1L;)nXzrt9B z^;E+^Cj$6*=41y)JQwfyj8fZyDeJE+V$*8GadItkT3LJ~t)#7zwBxcz&1Ga7gsKH; zS2TvppXq?p1i3oXSD!Q|!Y4SHgpY3Mgb|e^h!6;N-VL=A$e$-;Du8VT&gAWpCTXjW zsMPpp0^bGAnk<0uO@xz!NDxD8REJb334X5j^EzsJF1Onh}|IJw5$^NsC zhn}e*ofbTz0cU<(apr!7>3|YD3M{~2*+{%cKsOWV6+{CD1CljYzQJAzSYuk>!el+a zz_cYT9ix(Kj(m7k6RbsrgfSVNUtD!8b}$US=^*h33+C%XdaZ&atX=M}vVj<~!$i(_k2m>Cik|T5{KXjEX@f(P-$J^;khfyT|hDgSD$8IO%cxy;IQewezJmqQtMSR+X8b@RFOZ zdmnw?e6GJl_C}wU^PKGdynQg@gwHYkC6AhTk+%MF55vy|J2&$V{`~mq!m%Uvn+{t3 z`|L{~$Bgq}Cr%nNTaoM256+ez z+E6u97MV4AvBu^6`d_)9cQ34Xp?G=9>pQqA{cA}1$u)Q0+?i_2z7u40=l=Ck%fVB7 zxcV)g=ck1!aN!sWl*V(ny+66I!r2~0)DFrka|0NxLbq&AJx1WSFtuX;N0XqAI2!?y z<`b@%g%k6YQmN-eTH)mjGDafCL8*|LJwZ2(xDYFA>oMuvswF7;Fb)nhn^VH#S~1pVIITgE*=YyryUm%% zrK@^Vr{R{&bC=OOrbn$%4n1@+EamwwNbw)PObVsc&jW=ggRzoXoZI<f-uJDKH5_C30N-kH5|_tPy`H|{xAiE7#(UFUQvGhZQuIk_qV0xv3N z8)~Q}BQAx^W}vp%dc3y2#5#LKEHwykhB7Tr@}N_tm(>z-B&cV5ikC4~Q4UQ2AJg)_ zDyhbz#r#?UMYy68Y?Rb2OeMbtkVZ=LNy8U1FV z_r}22qh5L_f)aF^+^#=(@wcHN9arrOY2UW<-25?=*FT+mVQuacnSG_X@RGADUEa(x z^+z4kJY7<`_Y2M3XV|awx#PUNYR1Y+TXU`^_5+DGEDWu++3|SRV%Zn>t<`Kz%jwpT zd-O@t5X<+LA@^kzoUoKDwz<20A(wRzqGWH zEV#+WiYCM!PysT7bRc0tH>IFM6tr*<9yTIXQl%BStXC*&o{yo3QHaqM%Et##3~VND zTQwAmZ;8sa-%_2UtVfgnP?y{A5dsjop7OZc*aog&^G*m&A1I{QLrmA)6NGv^3Ufct zmFVhISRd0s&sK(Xxt;`VJ0D8SS2^bmHDFe5^TC7k#dZRv9(TFY*C1PKWdiiFk_ABS zB!g%j)`SV%$J5VLff-ZhaPIMAl5pMls}^PD0ez#iSkEtv^;2D47_q^?UTGw9+Y*8s>|t?=q;|Ni9x zqlhsFt$2mD2Xblt4g#*l?VIfZ$Rc3HowvG;LQq@uyc(r1DBYbW-R_#|O(4@(9LrO) zOpBQA%L2>eRo$d=ppQn|g;`u0J4G1bpsYRK9u66*H!Pp+F;%e58wGwBBfKM$1d+(V zi|h0bg1$>Xi&c>tjM13(jSGGXeKnhDmN#RG@#iHxWl;XZ{pd`yrKy|h5C%G!mWCE{@o|tYh3`G%?9Z)cJBa))Bzx{FN7FsIwijC24%o(xC&;X=8{2B4r z+#D)xxR4snFORDOx}T8?-8wIC-SMl|)O`X7=}%s6`dx|LtP~TK{PG9(pxHtv0>uO2 zZg~()ivZ<@9);Tv(eYd>2`zxn>lR5N*VtIMk>&!PNi{k;_nh0XH-Tv_#Dt7M3_-Hg zW~H7{&`>~tR!Bf_z0b@Y-_crg>*Ij|E8JfLg}ifQq?@ZZtgibm8`(mAQoZPdd8%THd_(2fQ6e><@$OvZHe#_D!MS#+I{#<5{oTR}kj9dE|A>~=Wm zUZ908sGFzoNnEZ9F!}E|Ni-y(j4Mkv7M!+do=Gv;Y!JMBTwHECLWe_JWRZNWE_v0+ z{pxgY`LG70a5b<(tqkF(1z{66Gnk;7F+K&R<%*ttG!13Y>J@=w-v}qaAy@5S6lUi! zT`uk~@VLpq^Yb9#5eeV#yn`KbODG@~^WaMtwdlWIe?Lg{-Q0zyIr=cfOmzC689!(HRg;!cCXhbZB-rH6o7-59kC@6Dg7_Pt+MU zd^t?S|N6(oo{iK&s3mmG?-`=CkXAO5qXnl+iWhuol zUs#Vrt5fSfwFGA0EIU+P5y&%hK-N`5zC|L91%MM+_3=4+7e`Fsl#%yA3M0k-YQ;X5 zgsOnoo0zib^4Pe`ES`hUII!gs-0X0mr)Dm5RVJ$+}6@yrgF764UM1XGEZ%`|Ci-nSYilKa9HO4UZ z0#vpjv2Ss*U_!tkb3Q|s!S~Imm&Es0S#!kk%5yp(%x)GDMMaxkfW}zCQ&mtRS$`LY z8V`dqbrnZ7!n~y^o?CAKAQxt>Oq!w2Y}7t2ZoIcIw7qUS2TV{Dx`+`86BJ<-mp+-teV=U&$;R%VIJJwv+-d-|jD^ipARw_| zwF}B(kqcty5qmn%{lkG-@g=4p2p56$7Vz90TyNqWMT9x7%jNU2VGg7`4RUF$$6W?u zgoR4siwk{ZS7zZZfb6Lll}nZ{y++ve>p}&-RELW#)jGrrXdYbR!=;Yfd1ZM6NbY=D zM+5%uf~P;r!2^(4-@m%^9=iC0WTik}CX)uT;A?WP$8cp!f)49sQ8TtQQh7EGgeuZe zy;^B>%hKEyL`-L?TddTRCEq;ab#`7cG{q^1HqLHA&CIo8cA@rAJJYz=90WzHMTNLd zX(AeQVHdkhoTrc>ZB9d9oeT2R5OlNntR4vP2ZVc#8%IE$v3h`7w3tgp*4l|Pnoy+! zI(i(E4=dZG6dS}=<_ySrd_Rd@t4}6#M=cPWTVdHrQt}B>6*5?9gcyMtMgf-5&V*cN z^96+t!o#Q$xh*&Ko88ROR}Lsp1ZqR3(tsdEgF%+*3fFDN0TU3)qMl;{sGZ5(f3%$1 zTaPl4K~3AeX+sS28E?z4C_2UG^U@xx&>qX!9-F)#R$Y(%%^v1J&$1cNvD%MK>D{+h z>fBd_s}s8>^e#{BU6R|&sq6K)+3V>bSzRsm`qj&&^(|rb`G)rSXY>U&74qu(f~|wD zR*#yT#)j)QHc|W|oQo?s{%(=}G1>i$^upMo#oD+GYJBoal2z@-Xoa*=x*2~*I7UtK z3)nJN_CMj&)g-+=Aj7qI`^P)lX3GQUyUp~#f7pR2Zs2a$;+(v@M=N#A>0Rd3p}fhv z`M>Uh*#%;U0jYy(ur$(CjxCh&I@F~_?Zzd2y#Mn~D=wZ(b_v?Y4XS~|4?Dn*Sl@hj z1Aa84^w`ay@pJgvnV>*zkZKH8e-qW<8r&2ed<>@Kq~FOG(fWVhysV+g zr*4)_dxqcP4ZqG9ep@>H?&9!=p<#oGVaM6wzg@%UtRwcVdZ=ZA{k2EF?;1$k1=%se zDI9Zh852jgtSR$YvrmPjR!DO|U9AX`P%F1o6w>TayC&N5)T)LVFd?(b#pU$+kT_OL z2YI1!{r*}#K%$3+S!+Nv6fy$6>%TlReLW?H> zU6af!u&2Wp2^sO`1H@J5I%abvj&y1;8MQ0+Y=gW**Sw^mYgPg*`9MPw{$c$fsQXJC zGLLXlfSz=OG1qO6Mrucw3pKDI3TlfW;r3@mxqt-0M4zR*Y+eT0}oceUmC&&){Q{xTR@zs$W&_+q1(PbVRwbW!^M_ep(J202l=yZY!xw6SdwI& zU&@BvW5Ib!DNR>iF(_c_Zdg^DGkuPAck1vj?_1#-+>RJLSAw*hxQF zycTi&y6mb-+QNeOr{km4o-bPD)&OF6GhV2chqPGuH%o1K$PpEim%AwOXhFQMH5Mo# zW6eQ5OX2ak1%54(K<>?bv6qfH-$DnGmR{Q2EV>2Mmyfs>zW4(MQU1OQ4K~ddU}J%1 zyMjE0{k|4BlqddQu8@5E>|TtX2tiZF&_u^qPrPh+Y}Uwen~B@h$U?=|0!WQidD+-Y zS-ZTsIgecUsFaOV07Yrg6jgy|ZN=Z5+m@Qc2A%p)6HILL>9JB^fZ&a6L23!r(e-fc zY{{ODoDrbf;t|Ac)_9i!G~y9bKh&2F*4nTP)0{N%fXOcY8k5w9#-k`BCyK+aLQjR* zGxAif9=>AE%k{ID8%q+;FW5!KifLc96T;*GRe~S3=-DG1M>3VL{CS zggNJA0!PfI!w9-J{ZJ@j0P(T?GLtUfG=PX~mdC|1ulq}42jvM0&|m~&fRHTVN($(b zX2NJug><C1g_|K}m+MW$MbAZ}W zQC(suf~0dLC({tAWTb=(RZLB82(c2XBxbV`c4Ps?dyNCDmp4!#WFee$UHEae)=G#o zP$1+Zx3D&C(U$M1E!fpuILxlb2v0j*FB2_`nM^GuCt^-4Em(m*PT~Sq6XToI@V;>INEg^9)YRQ6**k#Z@duZ+ zB60wf2uFGdK7I*OUziQb9_}qj64d$S!eR$d@%+I^&WRgK zWzU1;;kD9e0m7dRyFc(Ld=}28PUkfj@@lP1K~w^II)hVa-69zS5bq(5{M>@Axl(Jo zOyPn(Gk{7-g=%A9Tmd3}B4{aJW@3ThV8Xtsr*90tyGd=_CX%n>xc>)$*PV(#xnV;) z0b3B0HX?y*BwtpC;@JR-jo8WsV-*NI9dJ)EgU1Hik^ydxF}DaryhJx0HGZN&vPKrc zZH-8avv4zm({b|>9Xe|=C`sTHTB<{z3?K*skp2FO0RY{+m)VF$J++3;wHE~Up#&c4 z)y1eN76=`HnC%%b&b%3O{whr*jwct;)Hicm3Yc8U%Fa{=Wd(dA)gBCf!YRbCYAgX# z7MN1|$}#;)iV3##jzYFQpfX|cjmY9{rq|nSo7q27w?52$n|tytt@-W#;kO4qy*)@w zl`~SM-&~CkD`0=Yq9_T0DfK94()uXZJkza>!8wMov2i{bxyHJlCV{h zghdE(Ut0(3AWKP+tb@cIcjzYFZnn-P3~`6B4v5=fj(54;{eIW?Z`iKu@wwig_v`sG zsh%#rkyuD%e zwjt=PUBuhdcjV1?eDdXQomCm$nO!%4?y$_>w9I}MX`tC?usKt~kl(uV?)HawcPU%$ zIlRAq;l+cc?;qZX`>XJMylTr6%AZef6pTIJBA$M~0kw79Ve4dk?bNytuMT{;rP})T z%GP&}KKwrY;Unear?ACeE}*`~Z~MOM<5hUuZ1c8%gO0C!xNYwHHsCiBI8TP!ZG>J% zEmNvD*o@rRF2ilRwzXOof6351Xdr(yP`906(6WpdW-(S}u?`+LJ)AWZ;=k_7r(?IW z_KtqCzFA=N7tC>2aNR%K{-4}#{bz?W2j?B$e!>moe0BSr`>oG=C$_sA?Rd~|_Veop|Yq>r2fdC*XevX=sLxt$}JkWP|_0pI$3NL`pp%igOhc+zSl z5zBX1?CgW9Oa$anDc0OKy*!?IDyCr#G0(;?L)_vs?_bbV26}QZ5`E!sC|vG@=g;&b z`2;$$M=EqOK8q{z@wze9z3{G0U#Z2y?eC^P*$$|9;YVCHeYT6pozWwoEtAB{Q68!s zv)#*12V}Vw_h|0h7g4MtJ883#iUBb%WA3=1qQY(vAN4-&9D2d{61w^8=~&lZA*IDG zCTXf9{Grv#3v(S4f4u(Ku=wiS_xE{=sHXx-KYBj7HT~%Pjl(n3@3R2#ppxig{MU?x zo2BS+3dx1_8WCpRQtN;Sl{Wv}B1+TCTmNh+FJQ3Tl4S8jQ89z&rkBA$f8aI8-CycT z=r3CAx;}4Mkw;{-_`sd%zZ(6jV~dziH=Rgn);Y{?jC=cG%YD~X32R@qA8G76=ISfc zY*+$CuDy{`OtA0Fj*M*(9e;IKiuteFy#SXpXmPdDq2GnsYfC~l0*~BvT>^KlTy(y& zUg_`)L(#WWtyy8Qa%QR`+W78h1AA`oFOtzgw#qKJC~DuVZR7f1)>fWK^4)vYcH1)- zlO-$~4Te!rkK(XB;4*nQD$*_Qu(yp8Ms`0UW=D<6RwDNpA2_l;Nn%8rmdhMpfdZYX zyHk>85VB>V^X#`1QM2L|7^9e4PPk|J04EP()4(2_M$9}+Yi{pt^4-fo)dk$)Y&Xum5<9 zOBM)+T-?g}-3g~1E2v(6v|b^zyhE+F-fs!PZ{zQmj+}a8=kYBEqxwIS$@m$}h%WC~*I zgvm0x`;>|t@MkHnpCtG?l1~!nI8%d$ehP4`5XnWfu~Z|9prn#kELCn#3pwnwnDHsj z)NV?ZM+#+d<4oB=u=9zSeIsjke@A~`mE`BY|65t-xb2YZ;{ZF9@2ub!#Xhwqj^b19 z9oxHNJtsBJICNSV6V#-vrP^EC#X{Val}ng|G2%vrncp96XuG&*@zC){_w#%rrzL39 zpl3Mbz~|FbrC@RSRc6yHm#QudEkG%jqe(bt>?<1{=eU@@4j!kVcu{pX1fRLo%E!77I@0;&M)8zG^O*IF6 zmj^9};dLVu-~ztZe2W?b!GlFJG6m}My^@i$6zJ-;Fn1Sm4LaI(&epU(Hu8rj3EPfx zedZSzq!%iky+K@DLYMJzF*>cK9=F|B>-uE-;oLZwl@xm_suC;!RdRFVH&vE$E{ZZ* zjH>!^+Yj*|Pu@H0J!ZDSekw=7tB$eXqY|2Rstb>WZby6gYLVnTadStWb#YhtqDpS@ z+8-sT3>=D9$Q#7-?QA{_C{LKF1Dj-m12YLdZnqvsM-Ot1ymZ*hxKE7v(;TcI0mYmG zDCdxosB^WJbOb5U8t8U)-V{Mm>&kMJLa(IN{kLrAWLf=uUp-17u$><|tzZ``R5l$cHb1Jv zckfES(e$LzJ@RD5@vUX1ufg_ zNM=;VQ=_I~^u5MHD2f|YcP*dv9~<@zI32W={cGB!ZVB!55dDw1L)KLs0oe@(aM6)y zhc>~c?<)If31mdg8QzdCk)u^rKo||ojM@k~Md6K_OoTLx$tTH5wMTmvjLM)lp5v~x zUAEFCd~4Uy-O6cJ$aKiO=Mo3m^>O1RlCZ$f!a`n4qxG{L`8LmiwhkRmnXsaW-zmm< z&2&XS#swc(5Q|H1`$*nArz`Z&%sRDH(?&a~3vu=zKZslkGSRtGQ-5X2LPWDY98tJ{ z0~V#E=9v%c>&T1hpD!Mkk~a$wnm~tfZUv3cR_6g<7M&8oknxW_g$p`9#T7r&rsn*=83H1|+tIiS7aq2Q;4oX4P+26)$#G9X?ZC)bpI3+S(o@ylcs}=XqKB#?^5{t)Jm>IlT* z{98w{2f;w}@WwoPRLRal-r?VC0n#;$w2C@`5&nxdbGysjfFc{-yh` zAH!MPUj={X>H#UPIR3hjem0`OT(2woJD`BzKiy?Jr^khlfW}wSPnjEM>2up`J0H)W z$g`#(6ABP_TMTQz4Mdjgc^+=}5V|t z%l}rwC^HR|#0kn35L&x8`}QTL7G;D~VLDJl>fVLE8qDZPe1s5+Km{qos^Y5bOS^q# zbrJ2=NG&!aH^R>`*iEb;MwDJ0gt6&>4GFcd=SlV;Y@v@_5b+n7j|$TTFRVrl**%i* z^Ez^c%oarMd-$szZjqf9t0z^6yV2F9lzM7e>oT`=m;`rOs^HFAfe9&w@{KN9RVC0vFpuyD~@M8oU-EZZY3e_w5RrCf2PhV-MB+)-qCt;VvG zDet^!>C|C)ebDmH+XJO~)QvZ5=7J0-Zh}cl(pU^*j5h>yIkCI_*gd}&^qh|Fm74Sw z$osh5aD86CJc+4f588wH>anX$Y}D~(hicdQT^I`-sC9pov|L|%=Tq%nCa8;*>*y!% zajlFTtseMUjYL`niBCR!iF&l@q%!;2Uj=K;O4mMKeJH%?*~8XnPphYba*us}i*jJmZ7c`{!v#4Pm!PAGB?SX*N zyvMT*#5iFP4z+yFTi*Lq8P#4rGLsh|C?)g=%xc%%*4GXBow$K$x?;pp?Di8Ypz3)H zgZ%24{jI>;$|1+Yw7W6wiF|sfu|&wn7f|#oOyP#}V6UU5t6rPu$7UFXK-?UzF(=tL zS|I7o^I>RQYP8GZLr3tZ5E0tuv_h8+5-;mbmu-nIVT(u3;A2>M!kUcIF99OxU}`vd7l z{Q6+mt2{G?mNc3IC+2UZnJ!G%xQK&sGf@woivncbRB^BgO~LopK6y8`f-}Gm;RS^R z)89pIQlc2*EiW7elARf!T0-2WL2pjz;OK|PzmLT_=V7ns-;5)=7w1O}h@1>ALD6~6 z33(6C<}dnM^(iLbcrdenlp79kR1b^4ll(t~qI7wnQ9wosqvCIEt5P_NjE zWR3$_4dX_jHF^}a2?i1rQPt4ER?e#IJa8({g9EcVx@znJuvFbN0c7golvK)bE^N#m zKO{I>dXAdKNutCqT{JCcb3|6H8S?{1ly-90fqsYK7xMy8E&%FI0=mNRe9b#VV+j7H zTgA;aLvQNduTwFvYh5dY7fl7vckE*Q-zw8~$T5L>ZcM??g?Nr;cF2A)`P4s-3fqW_ zuIVUJfs{Ac&)b)`AVG`KhRax1^j5hma$K|PVvDtkz%Gj!(V`Zug06MRp7-NNeERax zh3YQrR4wEpSaZF5&bJ+eMg%p!C}2!$?26iOw(OOiz+*}wbp-GBiJ&I960J2dlUI&t z2oHh@BLeIFFbKdV+1*y{HF$N+{G{$0zd}rl!b@F)(gT!QFmdKxM0GIM5e|=(I}a#4 zW!r*a6juflbBKYOP`^^pEmyvH$!~X%z2gkW@OOEB2`GEyfB?$J;?P60sD*rsb$XN+ zL*Ue&7uFJjc&v+nZdVeS7X2Pi(;A}_j6+0$DiNX>jvO!WQGzId?UUrbd=TTWN7?XU z-=6O5ER8Gjxx5k#yajt|yZ?G6LS8hGN)$Myy#_)|8T@stYsFNakqTUdp0f>vgqzyo z8!t7%1;U1l_kV4lM%%4$%ejq}RQz3&e)lD8Q491)(f(rtfy3Qvky_vA|A|XD^xZJC z!=GC6eQ*=#p7a@qE0nW6(*HuQzU*GxzCE&ZdNyO%HnX@T9k(q=1-gsBo!>Gl&NO3Y zn(6k-Nk0LyKCCo#d zBA|(L*B?&HYJL?F37H9AuGW~pYsJwt<;Z0N@)r4N9~2;9z2lg+%PVs=+}z;6F?nzE z>J4M9Z;@T&gh8o&{Kntdfo&+aY1mz7A66L_1d9-`J$Ejt%R~3;JGzZ>tr0Ih&)rVz znEqr*U4CE=VPTxkrcLCG8{i(BZ^agK+o5MIXdi~cRtN6y&GH;Ux#bH3t3%I5eX>y1 zxo2zbM@9db>*mb}okt<7YVcVTIh&(!&&lIY_uFVdul$&xcXt_$;QUO5d1;s52nqp( z{c=$Bq`R)~en0aBX~OCCb;+~$6#{4hD>`_LF2I^*94~z|>4!Re7VY4B&TEx5WQGb% zf5&{7=adxrs;$uL*kj2%IpB-jA9VZXNKOc0@~9v+@;POVIb^1-ED}H=k1%LKMI=A6 zI?tsRaDgL~BxI-r*yy^qFDqLlL(LhLcKs?=EQ+|Z{_ni4db8Q=-kVHI^U6G~#~`&s zVD_R5NHt#Bj#@YZnO`45Gc@RSH;3B_63lb+-a>ED;B!Ix6kH>SC@IspsD@(T2PdY5 z?Hfa_=0)3yA*55cs~2Xp0KRR(R}cZ2@x7^!3#o)x7KvHef3EJN!h*djlcig?@^T^{50&Sw+>QC9~wIM zuFJo=I{4<<(1>@e(|Fd7f6EuAwrpG+^D%~U2)M61(YOe~1G2Txc%co9h&C)pf$h8yS_zY=`87I2zEF{Q>a-{!p*lqML6FP zgp?BnhL}16(Ek5G$I-4U=l=fUCz_WnFRBsZ?)|lsp<>2W|ECQOMB@ZHr_|<$*K!Ay zbF`tqibJmCzA}ve@%nIbXbIz=_kVPhr-UE2d|iKn^>?Wf4MMoK5%T)0XdZ5);VSh- z2T(Wsrqi(9JZR58T0+YwEokaWk&Vq7w5th3h@FHRuUFtLtz}7i<9jFFjA(bRm(0`` zDj7VNrj{&FfipUnZLVZ~iiX$y{m7g~i>}$=Aarxu>Y`lhY!4 zcY#mtho3RE8<(x`-G9>c`Q*<#ZJx+=PfWGI+2+rEU!$A=R_q8mZFa=tR-;0$z_}$& zm;X-w2YqXJyEyVlQUqB8ae!^_DzB)v;F z_V?{kH9+h?qS&%$7Q%u73reXI&(*8gFrEkId@et&w1+vV4Ayk0 zWl94T4JMm$Nmh?q3?&YoYSE#=9xdr4X!FO$I%SlT&?xq^w!cm0*!kLezxS7o*4;xF z(-fbc!K4sq2$@xT!vxu`(! z%UISyBjn#fglt{J4RyI6IC_Z4Y1v@KmMMqws39%&SR##6*lrf?y1TK|q3fWzZ+mRN z<(5l>4(91~Z;;A)LZp3>-!Q*XwS*BnW$eo*fMx;O!rm0(IQHGeRtVX zH)(H`Xy$ZE#ggX{4ySU5z}IB2<@iz3`cd=QDtAqhqmAsX0d-_=9R{OX%9uql)}X(m z%0;cRrV2NXd3xEBobOjvXU*nKwx#*p+jDcRS2~C1x3${da%mq)zUA66)o{!0 z`qznDzqz0+Tid#g*R*-J1f>)xc0i?#Dz{}+k>)2x!1j1u74U@0N& z_vzjNtW0^tq(vhtG#=f2(1LOtXKN&hcvWaAnc^g4-(5CB|F4X^BchPfa|~@Bp_R@# zmZF5m%yZ+UsLKOJVJ%=|BE=uO`q8)Ea_@hNf9=WDmJ zQ!ME9{qE8ACF_4CBYHfEB%k3k72(JzEn?2jkx{e*NtFB3u>1(_K?jERz`W`P$_VF- zeYQMgtw2$$Ig{t0lCnAmKn4%OSXIyC(Q13qsTxqiw}nV-ak_x%d`KgUxQPVx)hduk zGKN?k8tWUGW(UB+*r^GWWE(g$x#g78=h(qJ^f)Ue7z9L7ZNIhG-h=M_ERo zS)UeU+Xdse zP0kIp^DRaJ`uamlA}-U`nuQKO@jcg9ox=XAx$TvZRV2!uSpOECFmGB?vQPtAzXSR$ zpk`c*orr$Jfc2TH28qs78(A7S-(~^QsqVsHs1lCz1X)EPN$)mAH=?{=i*XqlBPWmf z7P_)ym5Z}M+Lh^i^OikDZkh@9m1za$MOz_zb~-fWsja(f*U_y%yNp-kgb|LnN5RGcayYb_2e{PtdqOg!bp{d8={PS&gSN){HXhP*gF&^LwDx;? z#B7c&<4JuJ<40q`@*kwsu1%uuHaqJPSOFbSmnvl`P`)z4+E+jblnFqB0WeRUL$HOO z$sHpS0BOi6<=M62R`Lgs!Xf-H&WU%arH6`S$E5*$UQXnChc|CPZ0ehR+#Y0^YA0_Alp~S47-ie9Ji4;T9b67w@xbWWzc@@OiZLEAFvv=;W4 z>IDvOJpCJt0xx)!S@m_9l<*xRqrv8${b5|U) zo@zr=+HI}JZIRk|ex7sEyudC%RM4wd{KHk@5)$%eT6A;y&e1csbM_w2IcF$fw_e0O zPA|1~Fy!s!=b@H4%3a=iY?%K$(&hL0pdXGDGX4j&s=LeMTVb9&t^g zWQ{Keb}~pwDeNu~MEZUB64164Wn#nEVnTF8TR_8z{DA?3U?A#`2K%rX0_EI9J}qHl z`R#Q za%R14?kMU>-KWz<^F68JvpVbV0|O6g=5^mH%{MxkFJRS5R^p;>86S!?2Ji66V0NPI z%rppojwJviZI)&^FfK#}rnz!>c*GhQy0lZ)YXu%Ogp8S}3cP3%u;orTjixc4$I+vL zIVBUEHlwd<1Tz+ZCAYcngce+zI@;dkYjp78x-d_IuG?2MnVy@PhqBOzS^mA{LSH2h zBI&vZdMZj|0g!ku3$$;QQY;qsh0o|Qs4y1l|D4a@JX;{IbDaLJrX}XNnsC1+nj9x? zV9&zgdD~>Ds=4hj3Gu4Iv`^0rWmm7ij`_Iv>3sT3e9!VP=iLhozpkJAvFZ=dTDFBu z(lSc5Y*Lq9X_rg%G{1DtyA;`|d$KpA=PS-`sY_H`se{|==5;P->_mN;rSmgM{n_tK zbB6oj=mBLWz4RTV8g{8_9qfRHl1R|mVVl-gMqBi)j^SIH=-~kun_<%Jk>RjMJ-7AI zccx2m@1l(i(RXKt@A43G@{o>1zL(x+YqkZ&y$#vjRyn`F?@3Pdz5PHCGlD%kveflq z{P~CLTpy*Kf3(&0uU+T=GK~MF*fLuDe)Pze$H!fFF8@eqOnq|h{gX>uo_4-}3Wbdg z+#b`#JR6!j|Lpl~=~PTR+cj*tOW@}%FMhm#0d3X$59#Z$E9i9{x*Q`ddl9BCg0uP`aZGiy?*Hj7x;rg`@ygj{gndF-1!JB zGvMwTXv;pC-ThR^`)EhCalHGPzwAru`7c4#9inYt$LhZ>{YZUK@GXh@y)r90?YHk+ zKh9+z{wJ3@lfSI6_~XoxZL?2$X4T7nVC_6xssFYg{`WfdXU|9Wz}=s^yM+euTA1cG zg3t|@yqr_22|eTTCc9qcOaB2)%u;-Y*%BxIA*(-5SCp!;cap2x>~RVS(gn!O5E>F7n+V(9VhZhc zsGx70bO+H;HC@}~sOofV7--7Svo4^_w!^q$O~z-gbwm9xKaBQGwGxUo6Gz}>`e;A9 zQo`8z*<3Y4twz`B*?N$Rc(fhbdjS=^r0IOpWXmoQ5Ts#N0)M#y;1j_dF|~+jtPhQt zL_LvMeSJ%5QDABc03_7%L1W$o8g&#nHrt~(0_K%-vJ6q8Si+`^LpOpgLiDJ74LV4J zx8@LsL96fMe?k}in;$^J`Ioo41PbKGmt!Sw0lHfl{eR@Akn*|SIt(dXkDL;W(_8Q? z-Z*PQni_<7*k{^{;mj)A_t4VI$4RvXuV4og()f7@zBhZ>6x4yJh6(A=9dJDrixR~e3 zE=Wy9WKjvr?acGeeCq=eNF{XnFWGf{ON=d7msU^6mY@*z*jLZeaDx{Ycu#}=6I|0& z_;!TAtYsX{;QUBhk=eoI=}>0g!0%hNn5BAjn0A>=zLyl-tsAhK;+m$b*&$qP8>jk+ z0IocOO5n+QY831Exnf6CYl|P_X$y9 z^|+;K={n6s>aJ9^2Gb(le_W4W05c@UHp$36w*c$Nb=(0EVM)pHE5xZ(a#iET$00^b zVbt??A#D=u0**0@uk5>IY-788lVnAx#<7vP}OgY%i3vmT2nWnWnw)|CpZ~(k!dYGIeMGaqGo<4v$uz2 z-cPxDNobibBmK>&4EiEeNu~PEuJ$61Cr2v?(h4XF-GjmsvGqV zSC%GL)mtBNj^qe{=gwZ8+|?94$sjdHtDz5XEpk9eEO}fu0cA=+7d<%5=k>WH5LEQ<9;iH+hn_w$dK+I*gGoTOQrG=r{|Urm!1 zkLbVMVI8bP2O>&lHjHk@{gNugB%1Ez<{6s_(s&%xrEz3fy=(*^j%8wxsPRz`ERY^n zj)+|?r`2)rb)1+k4rzIaeC}&B7AH>&AMiht8f!bj8Y&?m-B9NwP}toQiyCG`x8TJS z)<2*qi{OYGEU%2rq`@~9we_Y+S|+O=%lOOVG4iMY@xxuXLKt7oX{8GB-_@)DA%3~w zeyQmGXRW!LfH|?0SgEHh9kr=dSCx#@#PGJ8p%%R4h>W3@@YBx?LKcH#bVGBg7)EVZ z6T*JGmAp#ZCm|)MTMlezM5uA8*;gcTt9Tave}1QAu`b{D7Zcx#|QXD2j0z$RKE0%j=0U`PGQ-&A;bgLZ_n6^c2=| zS)KJq(VTeyhaRry*9>))pTW2$ORab!#El{u0|1R`!V}>k!J49%VEWu?%VF?Q-@+rG z!N!v2WaHK^6EJu=buWkf3cE>VeTbcjt?l&+E;tIVtmC(g3HdQ)5{S zTyDv`?8)1CV}bQ?33fY-a^~8++6bW&1CPL{18PQEC5bb!Xs8rjcow}in4PSiO%qN} zYb^-y)$LqpnrodV3~13ux9P8s#l*mx;xxH=8rS#+kUWoL)Cc2o1p`Ge!LAO)lQT5q zL|@Jo-qn^ZE^7Q>vfk_xWK=1k-yj(66{eNeW8=pA+x3L63veB<>09m0$OK9z z3eWB$B4q3hp@o~e>R84P+|#7WSIKpQkVL)v?Tx9Gy z_kBnX`f51p$?qDJ8IQaBTWX9$^s`wMQRziW7BJYT&GX};db${B7_duop9WEogz7eF z8g{nASkjRtG4InFH;3Y{_ky(=W7-$U8HrL|cA-ek`T9k_YpnXDAWMQg_C^o~g9a+! zXhG!`!@A^-r)skdaBwPP&doFU4en{=CHae{uca>;6b@H1)4SfSeo6o;g6~niGfd{< ztVYJktz-0QJvnon&M2d8&9e%V;*~#*brK4|v%DdH*#pRrxl3Pc-owNhE?UX&(62HEc0V-JTV*&f;hK>hr{=P2e^33zuKVI*$ z4%+?Mu(PCKTOy1`a}r?jWH6a-6Efl(osf?*u?~@)m8<*Q_s(QvW(ueeFko2owH@}F zqCbv*t+k^y%#phD(A;6NcL5hoq5ERj52R$sopL`n`$b5F`SwPMZnQRu-KpP++M}Eq ziR7*z_nb?+kY84}Xa&V(L|1V5b32-K+?KDPzJI*`?SBOayT-%$L!0kDy1vl;MTzkQ z_QJ}i>tLvA!zyep$!kT>P%a(C^i+9>SO17kKb-gviBV?lWtXM!tUS3QpEx1zyNzGl zT8=`Ar#+&BK6IE`+prnq!FKl193$UIu~y6fN~=DMpJ{Ity3LYyKt^%zTCglzJ#>g7 z71yJfcA4sKlI5@g;}+^Y9&EgAx-G?+UB)Z%oEhc?n-G5Lxq*u(ULOvao1QH5TrA_y zq3E7tN2o^Z%8GTXzmuk^{u>@1Om8f6d-6ORRrBDG_n(I3LF=Wy+Tbmwz-t&qqxI!U z6KjWhX?%X{-GxbxTr}xLYu>V;7fSsQPg|r5Bkv}~9mdp+q=b->J*_-?6k51>9nYl; z197V-C_z#DETQXcYa_-q44oCT@WSmc>DOM>mBh#V+Y?Nnhj`!X!TU{_)Dbs@8G@OS zE?S}cH%Ak>&uf8)!1{8!hGcJ{y1&%VZNPw9I05V^VaH`(OfmHu7Kil5^}#*8A<;5& zrvq{3)Z$K>9^Uu?r(VJWYCUwGxFkTk@V;Iq$I;9-!YrO+YzYP%H>dA`reFGy$;JBt zA%@r_6N<1B36S>iIjFI^?yKoe66PXXku1ZzV$=ow<)!ynXaV4`^>ps%!Oi2g6o!9- zH0;Gr#-&J}I-ntftDgCMgn4D8@%GAXqo1SaCDh+5TA&kr#>O9DKrun*hd<%iYc=#A z>=WrcKgX|kY*z*B$>%N=X=oP~lkY88Q!^n6Bvw^bcJOD*HXAghsbG$qTMNg{W z9k(oYNJ21P!%eGJoFDvIje;_Hj&r-vG5XJpPvU0$z%MMNE#DCoy zH!m$|rP5p_PNwV`?OqC=qc*-0&ih5u9oQ+*LTC;=w>cLD@@PT=&g%qK!|}+U9f3p= zWYjI8C*rsOjZZ$|Cv}t40l;Ov80`x?d?*TqGCBE1Ux%%}w)LRO;!*4bJxcpYfXR@+ zZ97wZoH&}T%DltLb^?CdzrfuLT8WnnZ1g}APWZqf1A2_j(iRQIm;+bUOp;g;LPC%p zp}boH-xZCRE&xh9N6_+Ze#8w?vGAHoJJ-^4YgWHqZaSpFMXvlITAtn&ZblAat#Fi6 z7RXB8Oy!Z-0|kqx>q&@Jjt`ZDG0iyG&H8Si_Z*}$BnGhW&E)X7ti`KCrY;cEyB?CZ<(#cbC|Gicvwb^dm zE?_+Xu|^J@f?RPPIsy?-vCE5XeyV}fW;n(Hf4HVd5Bv5}7R?RF0W zU~g5UOY4LFptl{P;Wdqn@_{k-D-}K57qXrHJ1Hnkido+>Nw(o?yqoKgn zO|bOMmSMcRZ6x%Tq zd_qn(OM$pJF3O0nVRd$pKIiHwf9ramHifO&4QQCB@d5x@vEHgGTx2a1(A*@Y>jU&4 zQy|9`&VD+y*51k~Y{Af9&+VwO%pTVp{KwW~R7;wV949`*q zlRU*p38(?Hqq4yIQ-rZS79wFnc*b*{zWpwYW+14i(JG@_i}qGla=P&*xWCgthuot!(D>;4(u z2!DUve<1CzB+x2dNX-xyc#hQ5jyi_ACf1a0ZEv(8zlm6~_kQJt_S5c%-b8QS`=Iti z`rBMoiBF3UU+vp@VdtNl z*ZH;mb;Iq=Z*r@5E`$^L-444ROT!;0T3bFIywiKB`e7#Idy9Bi5#QeAtX&EriUHHP1*P%`HTbC}j4eZN+Zf9=35;;l{mv8xODmc!6nNeEPwv^paP=q3`MC3pO2X z&ZxPv=_D3B#md-*2Ak3{TAGnumY0tq<6r zYnz2?+rN*t{U1w)63VdsT>Ne>@gQ|IpY<LXOvsZP-Q2F$h?Om@O*}m{5*U)=sFn z!`4fO_EVACB)om$=yDFJCLd9@DD(J)Sq;fqOgOEMn47Y`ssa6Ee7eS{QVqRHHTjWh zv%fO`%EB!lgw&fVj0Obbn_~MRRIk9j*%TdYh!d(3p)-lWD?~$G=s*qTuQrM=AML9~ z@2DqII4dg4sejQh)(^4gIMDB6uhd5LZZ&#Y0jkCrN|G6EF(5%nm)|~bcG94u#V$#0 zfOkbnXZ6}CPuexfoGb*!cotYdwWw7*C=QzT^Zh`wVF{sTE zQ)J+7jhBrI@SOyGRX`HW`okw8C^5xK07O%LC0kSf9rT?9uB)i~3aQrxfT;xEECWs3 zfJ6?t+F&_Jvj%mwA66Y}4gt`p*zwUy7>acJsHTp~sqgf}WzBvk#JEBU<3lKU zy&z==U}TepaDjwvGUjF-;VnSD(uUojBE-}1voz|U4%4LzDncw)75(I#8jqxi@n9VO z9_2aTC>_TAdz6%>BJe(ue$S(a-6OnzfH~JlIbMXMSd3nt!5!8!koRjB$I0|DMt^$! zT|sRd4bQ4T$BVH`k)eYOU#2%|Rqs15lWZ@icJPg|IevEyxNSN@u>|w&tL?u6!Qb+= z2g4~-d@9sNEHVaC@~Io!#KCdGJbK7%I%K2S#1-JrZrCy@wl4n$_8G_*3;Q&vzZJwkDpO6DGjba`@ zBXe9CvC^lWy4io>SHb^?VSX%N!MCYAO0-aeCj4kUAFK)Cyi}o(Mm3a>K;V!xYA{($ zK(M>LYQRs7S;I5>kG^9@LlOXJPgVGl35x?br6NLEs8kjYD9dm~MuC~rUxZ!GbpzmYr#}7(w&X{(!#72ut`)A059i_K@ zt*U@S7CT)>(hrTc92%QGRA^o{>5G1uQ}(6>^Y>_(uc2%o?eLd`!$L-^|L;{l1`hk^ z4+EQ8CE=&!t^RwsQ03ak`uG7X&t!)q#+Jg%e}Dr5bQ&WMk$syVvm@llH5sDpD=>ZYpn zvsIaIs$@0L_DE{>reiryz}~aO+&9OJm+$NIuP%r*SDvjF^;MUx#;KfYUaYLyEUT%x zR&#Q;rrz)P={?8KUORq%_V`7=6SLwIv$7M{uAP|Gowzwj(ALlkQV#SL)eaS5hu_rd z@J9C|Pd+rK2Fp+0RiAv-fATrLZX&YoRZ-mzbzPda?gReR51&)t_MDnko%(kZ{NHNU zN5d)5Up*~WKai_M=tR<-zvY)7YPx^@jJV$P2isz(-kQ+B>s)TXx525i!S&oBzH_58 zwsGO{#zj9AicgK_?3>VnraX_vh>YqbPnwoloL-T5`q%GAiRVryS*TFkxe{liJX-?pfn&sJuft=?;M zeCTXlqUi%EWmt?ZSEE7@1WyCjcA`C0Mt{nPZZarTjHz8jL2%(p70Ry7Hr^9u@dXpp zhF$`oLjkliADRcCBlwVq8f5t$eNU%eQ(Dt-*SU*EJN4^rDC4-4H zbcvp{1xC#!^3m&L7#~12E-icUnJBm_BWj4Eofn>o*7(Ydl4$5CF{+ogCs9YdpvRYR z`q!yqg{tM^=mkDvk*M*|@AMEB04?5exc7)ln9S&oge1&%w)MCAyQF7c9(6oEq6k|Nwu%@MGQxXPg4tT7hEr!to z14_4pXd#Pl;-L5egn0t|V$oXPYnf9GRHJArO&of^7TRD7;iYSCmP6(%QP`cAw{VvK zy1=ZCBm1fXsx+v=Lel`68BJy+)P-&C!Pv})WHH9qGA zUB7{ds~;(bJK_PHf##Pjrkh_hSyj$Fd6xF|GIp&2Cn~(ksK;^ZajkmdAUtwKGO~lS zZgst}QB@#o3l`c%lF5kQfOU}6F;&V{ZC|_Q74 zk2i+NR(nrUnV%j148gwEkkGd1zYGH(VkvuNkQ={wmcTLj9I2rd{Z&Dvs{yfuj0o+7 zHqcUl{ZC%*`I0rGAt&^L=R$BMvcR^Go=<#2sNOA7eSh@w*4P~AlP5NWZEa=y>v{p9 z0YIJvp`Rp)ewK{LNDEb_LdMX(ukenJ|_*PS%q2JX0%0sTChR9 z;Pizpv_tgMu^|kzTsg2O=;=Kiio-`o!Kf{|G9HXSsOevJn(&u^Wc-yp%OTt7i034) zk~riU84jKU>&_D^R+iLT4mx}}J&&(_ttPWQiL)vqN(^Pyr?ZY35WLSqhNy zEVQRuNf4vg!x*Umm(T`Y=F|45ff2!~#Q=IGZ4160tOBCh9Mu0Y!3Thor|B-!WY)BR zwPBnRzyXrrr_7!Tg;cz_0?MAd_`8}Q?!MM3S-_I8ZDhF0a&N2*>)kzvvQeWmDyXOI zLpFx^oIOu?Ac@_lH$6}e4cSvq*Q4)nZc}tbxd)9nW`x&~rg+r4eHA4ySqrkbF9Fh8 z3FGD_>=l4wkdeaZ>sQO^C*iu8lmqxIqO=Wt*g$$OqZ~6?uhu-Y{A6?(fpga4(j}N3 znuR-b3ln1*`lHNZ*dK~Va;U^XF>}+QlkWQ|{T#nPy958coSJZt(8%9*RDgToy`tQKI#E2golqR3Sw_r#~(a1(<;K_U%|mN6wsEL!toy`C*#RUNA>UoopkaCD0x{ zkT&AQmw{Pdfr~1tj|!UAVLekf-{JuFab`%G?RNkSfI*0M)Kmv~bIcrm5IfaotTxJz zNGcjOeV|8URgi;Z>Y%|(G~~67;$s5?UUAQ@PPzS~A=3fO2#s1g1T+X7KS(Iug0qX; zaQ{!zorfir|8E07=dh}vpoplb;J$BZVyPW)LsLVuGPA-pGb=PJYnvZ=n3XNlm@Q*74c~|PJ=f)b{H2$``Mf{x`*nYAt>oiKe|`Ao zFuTHzT{4~4+*MZlJUEG-KzRa3Hu;t;bYB-RN9mkwvm12-r9LuI?gG9*Q|5F05*^N& z9cVd~t`dIk9-M8M>64^=d%D(RK0B)3ZhF3;3Y3U1$t#AEu(!R4vJ-RE`^@fq`kj~U+%og|TNe6wZ=o^Sm8 z=F!7jLEAVr&idXY`v)hh=){u7R;T?AcL^N*ZlHnv4Io3}n89P#I#<>S@#&Rga=Pl$ zMZ-f*MJ(;X+1ZOxC{DrxXqZ>2Pgw58+Rq;U@$1?@Bj@o)aCUn<{gf3Yb8a12auOHB z;dS&b{oW>t3y4B9uFH>?G;#sq&N)9u)fP{^fs6JewNSlHyW5WMH5O`&@mG{CR9u{x zvHW4g0(^wN$iEM;!l(3`qexF3O1FeDDMcw0W2;LPfAlhrkrnE#SEGu7UTrZ!SE-AytPI3b-` zvk{J&sa@{vCONQai5t4^AH1;rK-|*cz=zA1_=z81RHTHP#lKnzH(Rv#(*4_<0Ke5{ zk=`HMjF%0~^_WEJ1idElNp5IzB>j3XiTjw*ZWJ-p{m5{UpO~`1lQ71-#ZR+-(GrLFJ;6wUzm*Hx$eqM7@QPGw zQG-4UNMX<(JpbmG+0D_Y3cL_^JcPEuK3vSL&`8Vz5c{@hr(;FOKSB3!hD59R#>0Wz zx`p@@<#4%etn(Pdw&ZKY7Mk%58oRcnO9RtO5}NqBgC!A(>Hn-9{U!v7pGhv>B||yR zSofk?5gxOOCa-kAQK!l->8ux`VjHe)iYk#02&F{eWaa}EZqbpk(m)Y%ZcYtqU7x&|-67qT>bwlw8zUv#}GS4K^vl7vpqX`1ZkdwU}PjUuiJG%8{Idbd< zxTBT&DADI-1!c*1VQny5X>g~m%*FF=n~?@K257gtfb4d4lCK!t- z>$7se%?ggW0k01ynA6+tO2AG(B!8@}IL%hZ+Kok~9lVHO^t(LclW9>!^?)}EG5V&s zYfIt9z8@gLbb@dh(iknBQ19#w%szHf^POkv^d#0g1(m@RUdM;Y{Z`i&Ydz{>5zrOzn%5_q; zBKKxX%8|TMpAxVl$?^+v@z0ReD?ZkSq$OsH*B-mZksbVm`@uZ;J8*9RK~$|J`0_3Qr5w7b#O zY}%S-fCdoU4F!AjX_gayPHz3+i5M8_uL=m}U*G<)!5|l@$m@_pSdGwUnFcf|`2#i9 za@QU|Cj|J&)|dD2`ezBqr1^2-QI+r|qwA_s<5sJODfdJD=fyq|YWLxRavi-=0EJOo z*co-0_ud0zw~J#5R{XN4d8N=`Ae|D-gAMN08%5}VJ*bNlX#0;CQ=+TBMzh!A2+6>d z&%{n>Hicf&%IS3+%jzNumDmE5s9zH#iF3T4_^tlh_WOEI<3z&L9Wjd zHI;nii3tjx+%jK|U!_HCn}j#-P49~Q!IJCwXS&G`aLQ;=u$jq-Urj+LN_r?A@)=92 zVpPKB=Sgj*jdg0uly=L*oe;5ge)Q#WRnV=1(nTpRFy2x*F=a=2@Q11DEwsD%@P`;X zi5%l}h3RM8B_ws^S~`8kLs6`A7&;tmm8ZSpJ14Tz-4f(Fut4h_&WqR2)|cAXF$Reo z5q&Xy)?yYk^p>)X$Nws|XRO6G>i4LpTfkF=8r-+;K6K?+!@7e#`(dRTJ^$J*Q$Oep zckc3}!4-6K^l0Dtdu?Mvll3$J#Z&?iA;HRv?3SOjCA@J;Ymy9TP+tUC2#tu=J@27F zin~EqH2r@Yn^my7$A^l$WZ8~@*LfJ(V#E6lO$ahFPf^;U&4BfUew)9{h2&8I2qe)9VJrU4c#Z zav}9f^9#$bPbH`6%p{&tFE;?aug>wlMmVY!r2uCC!u6HQiXhV9fHdf{h$|8m< zxejZMc2dTvI~O9{(}pUSD?kqxQ^z@)4mdo>wAyrUz=x+_=0O%?4lPpp&ua~s!E$VX z0(d!1J%Uct+{QOWCEoz8a2kzOaeeg3Zhkv@vc%>L&n4IN`TXF|Q-W{ZU-%h9y+MX# z%W-5F(0e#$0|-+EeE7Sxb&<%#SHFwYkX=_U6JWty@#X>1+|e@C7>3dXSPcM2P75FY zjZjHeaU@+0x;UVpQ!CRy9FoeMS)gUE$em_n&k*T(w|sa}A+qGBu5z)wigLK#jwVc$ zk}!3`wA^yZnAo6+V<|XbC-5v`U@#;s*oJnzhn=;=7~?(Nxn+8xlMi51W-Ex3$Ulcc z`&oxB9x6{$7Td((NYR!HVA7FGA;>ZApfqU`;VN;j_Lvx}$_p2S6=Mg9G)!79wBsH0 zPVW?^oG*WOVUH_^*(>M1!P<5;Z<(c(r(ynK#GZTZKG%~B|Hpy4sxbJi)oIQO#G>L5d<|ZTZ356VYfGdfiUDbTj9tM zna;NPFpL5Rz{G_{Gflg!4s*5%NE#?#OB1>aj;4Y1}Ts8~^o zXN6-mW!J}oEcW=~e`w^c#Xit?(=w`U-Oeo?=rHP{Z;u7Q0ceLDXPbi5cw!*|RL*aF zDc-NYKGJW5e!gcv%B9#!jrNkfGP?sIL1}i18Jb~=2O6vf@Pw}5y@Il*v1aH=aRwJi z8^(D7fQz(>!fZ&dir#m$ZCzgJrH73PU8TC(arA0mRODpH$@#Jpq+DuwGYF4L>%zbT zjX^ZbMHITyU6SmJx>kr60GM;@Xlr92^f-1q4Fh*sWV#*9I4ln8Hn3Ec@0x{@51)CY zFSPaTa&$GnG-MGuhK7qJRV-YG73QY9WZA%3Z$#21F6Ge9a#&^bC)lwGY#I->ueHn< z5!XVPJcZ*r7bOqclqs8AH3f4l_%qcI3{ zEt7GD7p@?YlR7cRSHx@)lDIQB}R`XECJn^-^X`+FM3=fX5+o`0h z{6{6uf`5(31A=p%xP$l{ei_|W=rRWCb(Q~}L1O?MUxT>Am$(2nFBh^bMtO`0-Ccz! z{UxX?V2p34vp`mUX=0sltuJ{#5leay9@gk@ybvC35K%(w<%IOox&PU$fyKT5*{nAs zRK;ZRbi^J>{R%>#39V1&8|eT?uFC2Q6-1^4Kx^A0*HOSU8D@Q>(MBCb#!n-%J^C}_ zqK>8alLY+}c>B#0f#Y3K7DN4>(@}#;;da8^f*Da^$lao}ySwPecjwnJe|0Wpp3MuFAjeLG@)LI%-wF-ICN z98E55zDcKRVosoATZaE5S@*(2057(qD0ZuCsHrXXY;Wwjnb-^HhI@}W%H}L;G)~T~YH;0GY%k>`XmT$vj z^pWvlkBOV;M_D6v1@V(v2bMLBJoOa)c2hESGvxW_cwIV>kV6`cb4$n!9-T=`SYMD( zf{c3CCA{s#z3UxaHkR<=^XM_d`yY!s1CO@thF5&aTJe`;#W%{G@var$i_HF=Sz$D{ z!U*7jPR&s07<&B}_SQ*UJc2hz3~rSfKC*%YNyL{t6HFqx`hjWa1Iqdb)E^VC)ju$j zCqBCIfd1^k{KrIw`8eNw+#ynC!b@`AIlc`Uw>UiRerw$G*|_(=cFWb$$+DDF{m!U%rFNKfed zoD--kBA>TejpE zdb-=KH6;_#`##^@=T-SrD0e4!z{x&ETs=@hmsQ>zkWCHLd>^Qz4>k;!?U#)+(_$1o zDb+70CoaV_PYl-oF?fP7)Z#hR)?D5`Tz)b?mRvma_c(OA{mHYgC+7mXn@f?d-tvn@ z(&LfKf6iLI!ZP*xP27$4HO%DHj+ggNVd7MdaV4FpJYHPqkHZ}4@ZkH@;Vj(9Ok5=I z;6)62EDiO*G5(>a`9#{f{v-9j%0{~5u}`nWPwA%6&xU{doiM6JPjN_7TwcPffVAFK zQ*UpMzMmQ`(PO;rY4eU@!;hxE^e$ zQs=<24+k=7?MaqhNuH0AyuT#*j*vgUy!It>WnlKopwgAWL>YAE_mF1~_sl+AMx0<1 z#hlQIi1iauKTdFuO*ktimXA!tKN2Tk$c`GML5^G7gpivshD&Ny0~q66i0~MNX+qrP zWzmM>Ai&>JQ&%i6<7(CzOM$7%#@$@9Zt;uA8+ADMedMfJ>`HtG6OXa8a-N=Z8j=Sd z`i6a_(a!*DHkdgtMubd_XhWAQLx6#QK^Bie_xLr72kcW}u}?AbdH& zNh2~JhgNn;(0xKCAMz5EZqPtJG|^%Wbkt1tW0!KN9<@!u?w-Ytsl`k_GgEL_L-IN1ge3!Hut1BY{{Ju_26AFuo%o&Q@$Rv33)k{u`Bm~jnfW4{oH`T( z5XHh(&O9W^wRBdBBsP`)x|S^D#{~aY&Z;68DFK|mI4xIbST{(JCl(QpQpTXuVD7+<1mb6!|TbL@|UuQ@~^Vd&4hJ99Pn41Hk!}V5V2GaXPOp=y*vw`28 zk(bkV7Awk^;t@msjZfXU&sJ9*R-}sLxO7t7#Ff%t&UmaYMzfTq#qjoGep!&KdFh^z zLj&cT^o=x@2d@1x94JKx^Tghy)5*Nh6uDcD6pdcebk#bfh;8A~g_$%sY*~ThO)g!h zXZMT6dMKWg8<%pv{2);8D;h}0u%#j^m5?m>m>pQNPsZoOee* zEDhz~-iQZwGX%Gq>eF3;k~XX#Aadd@-o=oF4xwDd6lObR2YfT1CY0qv6RIk4mojaj z)UF9*KNfwM^UzlV2wcfgdF|f&!QdvLv%t?^E=l?i=C6>^%Is#_Sjjj}%JvP8jZRYG zKacSideL7~_k)x|J#B|^g*tXrr00srO% z)H-S-H*>*NGVMLMYH7+{#+lN+UB=`T30v{UcvRr7cEay`XsDoHe-J#(CX8q8)RB=YG2%8KB7<4OSAOR~&a*Y&?N3mdGJflc-X_`NZUFKXt%r}$ zp8RvC_EPMEoqGzzV7(y@2z|OSi2`B1Uh!=bI?lG`{pNtV2Vz&26-x233S5o`2v&-G z#>5aqtcQ;+>n?Kn*fFroNsTkA018OiHCq6!l;2z`9sX`prG z0ic26BbA;s6#*6HHw>huwHvA_XYh>KoCZc^>%s@}XWU}XCzo>Ww-T#NQV#`pri>(_ z@eN+Q9k!*yL$$WIONP~y8|~bcX}jin*P1;Zs&88^G-rFayUv{qyn6g_V#Fy@Yhc%W zeCV%vqbHYFyZp1a!{Cx-?#H4dltUxuJ2=a4zMP1y$LqXfQ^^2$WR>^E zu)I}#Rc3boW50nzuZI0r=G1J{lqRuzoL*18yZw~0ww@kT-x`5Dhg%0~|VS{|exT*@^fdDocO3T=b|;pQYpO zU*TmBFhphs@a(XSaloS}pLh8$O~U?ppV_wT&$z&9r_IR-g7+nSWE)0x4J5`J6}_kp zaScH@(7zRPK-e=!K4O;o#U5}@h39_9uvo<)(N4d}<`PTGH2{p_7LE8ouJyH4boZjw zsp&0_qb7O2s8XyuX}%Bd*9#AM5n#X3njbh;ZtTph;mh5w&lFbC{rL5Yg!%UlCSlVN zBrs^i=^~qaO_Et1m_9p)p#<~UkrpwO`fziY(bDfVF}rF-*oWB&&#-G0Hk#Z$+^X{Z zdRRw^A{_Ya97W*H0J0x5-n5y7eH>5<{l92?WQ6sTPfKsaH!DFDITtAPeB9V`sQs_$ zqkrB)RX9<@HZ_As$*BUegd9sNkoxsaktNhr8rjbn^+Jv@Bkw5iHH*7a&*_hKZRx|5 z&k4$$I(l301vE+Jy(AL{&p!K`8l=bmcnCcsjOD7rSlD}_s28IsZ-!W#92rnQ>&nHg zcXaKD82_uLEta@O%KvOjO+k9Det&DdYc1>e$=9I^DLtU+s^oe!xslLA4DG$zR&M*G zNLWhP(})^IZ&dh!xZs(wZN~94uypaN86{znOS7+0Zq@+YYr13rC}nl&4mS>?t7cx* zhGqP2^f>g-y1urU1T;^Kv7ci=hSU)KYC>R|=6Bp;sl1PCSC_ns7_)H)4(Uq(>5ZB>{Lc#>~uhoc4n zZ{%0iI)QUtKxoMu34`xoliGi&wz!kYIz~#^JUw3?eN!0ndn=aV??8{lmj}G{4`+TS zS@suci6`I)n_)g@-Q@I=V|r!s2C3q-rp>mtn1Fq)G1`i#mz0i0h3R{0(qYJSJp-ca zd~rPAaQZhO3je5p;BnK5m7}koJ`yf<;eRAvQ$%}6b-X?f+S$CaDcnNxz*zquXCW`{ zbDcRs3YbX_>m;gOg1ffs>~ z1t5-FC-G&p7#z@`BA2su73%_8@MmxIxz=eGTiyf;Be)_$+L+{OVvC{60!Yc?NoW)y z+FEeh3ZGc9)>mw$;Ty9ml^&h~#B}9gIYog;%=qaPSU){xDTzN3vTXmFTOES;1J}+v z+Lq+1xjVar2F-xsUPkGn#$40A(lheB_3wVf$8!JvIBnH8Tk7_dCl2pQ=cg%zrrvX1 z71^B`EI||bDap@k^2>#-@MP}?CC2KU(dQSSB9C{cy1tcSTbnB{C`H3ZcrA z$=fsCgO8g%9Me(ncRNpuIt$yJFlN`MYBI^JZVvGSzhT3|Yl|z{XKxQ&b=jY6k4<+~ zTPWlxT~bqTO50xcOGFNB>vphfTu=uq3-r?q{pCG_V_xZtvH@D~d*r9+^AC&*y5;z5 zZ$-wV>85+6hIYJ30N2RkO&`zh=Gjy&ow|qvn(UpNcfgTF>9WNvIhLvS98AZ^x|P~69XGsBMH zmwyoQs97#-^}&JzJ0S%%gx7;*pIm4tO|BQy9`3j!GGV0(_f>Y))YAqH`C zH;%|EE|By)?8S4{LjhvV`aIkeH|L+3Gs`#9LL*wDFNQHuEY}C z20IwLQut5=?@!N0X3efSr#k5Rl0QB@@}mFy4vL*sMTdyQOah4AO=61!_LO=QtGZ|& zQE|Rs7p?iMhSrcgeTvBv6AhyoY_44DnJ5;<^q6yUdoTyJ#(QNiNXGMMhccd6Nj0+j z0a239Z`a*MU)5bEDf-${*BuC_pyrBIVi_vbH{K^8<`43($qJ+}kWF(`5lTQ`X}JE& z#7*yoYKBYzQjo85MjIZCSD7dw^BE+n6r=_S3B}0-1?Y>cF?9r~3KdqVwmB@paa6Qf zc9?QMRE9~(UFV2_gS29|5-C1KgzqI83y5QV9DUHjq-YZ7N!?t4HZGDFOsreH6a8zk z#E)!;mNhLJlQlG(q9tabED$RbyLpBu$i&sx#lf;3pZ7vG8Ze#$q0Sy#eFIS4O63?e z*;TbC;Y1uQvCR29 z$dGZ|(;!BK`qfO2g$CMz59f1n3`e#F;y@Fx^VtS{F&QR-Vb^v6hC-#c`d`;t}^w6=#vzmKw6KZ1< z1idf+?u3}Rvq>zV0oh;uBZA6}B(M>eDIGhKTfK2}Z!Z^(mH^mZ$dF%($_2wn_x?BV zyHBW+6)>30K9Ky!V8~dHi2ycN_NRuiUlcA2 zRS>>je_jgl~+@?>=UR}L9zHC6=0jYiWQ{gwh{2Nm#Eq6Viu*x ziw8O3V~qoxV_pv7yK)F|h%pZ|cVurp4=yto`=^N4zCj0d!{`~%PR4MXN#3LEZ*OuU z`EN?ivSI!K)~l3mFOBb~fp=37_wS-wdIh;lb%aDP=7#&|`v{9U*1bomGh%lH*t-Go zdoQE5!z(95MY_Yi{-h^Lx=1BQlIJi2w+0u!Xv13I(Uc3?Q{>K*#M}`3b=?ml3}>0^ z1)6@Fxj4gOk-HSI(7-;PV*D7>aq+3!O~#>~6BZJ-vE1m#0suz=EvH0sye%mXz#l<- z`NI2%;phmCMKdsQ&Plr&#&QzKFyr+gd!<{w=Ku#?#|f!ZUk)MexGg?DIpB{53}+=y zlcTI|6y(`s$uA9W{T;--KsQfJpgAr%|KQ>eEq`ZM{Wa`}8^;6|1 zSxumR0#7au4@J~YxguJ8nR70L`|+-yv&a%39=0Gd4^X`-%5>Cl{M#8@Tt!}b+E2;u z7-73K^}8$x?TXZNQWP^FN{|LwwTrqm;rni}nFFdVT=TGI@p{iXein{7e7Ak#ZuV7? z9ZQteWa*6@PnpB`&LCD@;uwv3>6spDzO`)&$z}|6SHE>o3iW2C1p$>xh|u@EMw0B@ zS0Tx9eLlUbe=0^tH}wWR>W!b^V4Gk=JsAU+4m_Y9EEKxY0QnKM=SgK81NcBfc%G+b zQ`Xspno$lB+-?9A_Utqkcz}Dq;eidBwR$4Q=V?4abN>x zuEI^dC7T8Wv&9Er@9B8G_o~Y`)uz7T*O&>H*P7Sqf1DzJb|HWYJl<7krD(BNi1q>E zC5iwzcTb*5a>*eqMPbTUl<5i;S9nW4CKCn$6CCoJM_qb3)z!tsc{|!L8L9Y4vvpS!WU=+|hA)CpYAE z4DAP6-aXRxoGN>(pmI(h&pUHI?`#ydb12V!?9938Gw0{?mM*w=WeB@W&t9}Ydua)D zd5Omr=fG{+yZV>@ccH^uZaw!1n|bH@ ze#@O#J&Grg(y-H+)Ty%XRR4|A_1GglWrLWA_iGb7>$wpR4@PXmDEqD0clYHF)Odz9 z<^#?7Lq~dtIMRFS&f&L%JIY2zD)*1hci!g!V~_8T9f^2gyLH_AoZB+5$XKsOquNLN z;K%Cz$Gf~tO3q<_$EC=&J~@7_y8Vx*)8W6}-a7RPPZ~e>Z2H{u`E$QR=QXAu3~1id z?%pqSuUTmA+q{1)_9lFZTw1g3&G8Q;CzSyy!7u|fWvEQM;|&@SfrDhHn?J;KR^(G@THV+TZOV% zWk@b!M*1pGR4AxkDc*6at zgMsa9`c{l12aljlK1+Zrqqd%aP5*OCP3^MWb$@8}tHfX?MNOZC(z-ZdSv_WxBAARrRn@6GV z{~*vfmUI2NhT`CiF;pmt-nf>j^hy=Hgi>e^m*AtrkmT42eMkz;Qv(;p(l?2|~&b#&HO?tI=o}%AY~GMF63c^&7Lq=M@O8 zoq_u-de|IqkPifv^d*R9kJ zseK)@uRiBqEyMWip8IOBYllv>4hI_3T!HxT5n7ASDfH*fY!dBYx^Sm8P3$*8aOOiR zt_dd^2XgoIFiV=gec}A+dV+!%QeDS=igZ1XDdMwy&Iserxn>pfbB&9>TI&TbN~iX;d2A)}9((;rdz=zX-J%5OJww0nb4t zE6hW-=NLYLFsJUdadN!ZyMOLD;1!YmYWPjS-Gg3{$0!F%cI6YjMPCGm*;yDXRiWfL z?@Hep$FrNZG?72Qu4UXV8M~2|lzfqQDyZ<%%eHcpr~AEMPisE~UD$9tYrArCX!lmC zH?Q;+1^O~O-n{z0;ZA1umrYYA7BVbJ>7WQj{}z{>B9E*9a8yzX?@Kz_g6!r=ND#hQ zL&RHz@u(jGNEG>Qt|h#DMT`jZaEk1?ODmFE1%^2)BL6&dXZP&)XO~Z{*tYH2FF%bh zMQMc6zD^zayZW!j=f^RN{aFK5FGQt7_6(`-E*GIbcv^D^CCEtwR{V6euaFPslcw;`@mkhSVp4Y90a*Nw9Mfiw3*YDu~s5IqR#n* zuH@~vS9K;~%5=-!d&yvugRG8&S4J$HJR0ih+HbYR*YAF!cOF+G3x~f*s)7o5qAGM) zmj?V4!Jn=)%2T#1SuBlD=Otc1ghnezCwnM==Vh9$TO6JLy4);FimoynSP+Vx8pfCv z?zffpSVzUeG|ulzzRQVxdrg$kQr5rMi&^a8@#z}35M5%wfi>R`sc9|rj&=reV1Q;s55x&`mVGV)9>eG z1ctFBhvZbaBca68K#8Oj4yRlrzvyu}x@7SaiE(7j#glcJ8r8`f&SM1a&>ZDH*cvgh z*V!DdshBYkiv01+Qd%M2zQXkq-l3W`k9Vx+`WrYMm`fjYYRYOIbiTWDdeB9Vw>qO} z^GvFAJ0)+ZbVpx)dgkl}wbj|q%j2nM&s{5S`~Og?j}q-L?AuGp9QGSHNzxfvLl?9)bo;i z?JZQ?s5LG1)q>=se(Sf`Ez^fV<`UZ-oGL8y;9m(jzL4<%VA$AH8rUnWy>PgKk$&mm z&(r?3=L!lWj+8dqFNtCXVJKuYr98NwS)GY#!H%Z%`y6Ce%O7#9Qo9jy1Rt%Ww_;|&`u5fLt zZ>jfF2IQ^ZsOm`R_uluhYV%Y&-WOTPut+3?D59+1r9=>KGDKI`6WBMd-=|%~Sb%O~ zR0>jR6~!pur4d^dj;X9098r#>be%ymgF}lViOps-M)mspF!w&0nIjYD&rn-jVoK6T z5tfl$j%kj*x1G^x6az!l8Tp9iENJ&>!F17{%)lpEBlIYNvNNxs8VB$#6IiIwjCus! z^*-X6Qu0H4Pw5{M>h?!Wm`G*1(UY-jLzg4oHxfZqccxYJKSxZlW=N}B zbLYTpvccpiCaz9MDh{YSPm2zkx@b&!uXX#dfB{4J;ICO;TQZUrkLL<%{236rQa{~u zJX9G7s7;P`_d3*QiCaUw-AcQA?NVE6O0J0PbLJvXJ}xj$(f3$Y@*~|1TcrL?T84QH zI_3r}?Px}s>JI)hV9jWe_8y$Emw5DgP3p6k+th~QlUT>kOUgGXdMs>W`W6iVRk6XP zwx1PiHrai|FJrZu-F8L4;6E_l9s-hH;}fUemP(f_K$Om=0eVVHMKBFxyc5&w+6x|i zHWuExY$XQW2%A_X%P~}G`;LS%ldx2!`GqM5=qX~dqW!gTR2PDeYcYgM_IN;Y6+*d#i1J|_@YpFuI?M};(91j}}6(PkRJfXhP%PKhe>yjRwCM%i_)uU2PV z^51qQEiX`;xw$6fAUTgOp@j6;#nu^5Ox(M>esg-AG+AW#uk;;fv&#GoPu*3Z#H{JH zr=F2U`s~#bRwx;V4$p~5u}QowW=h0P1M+~!$rSg zGl+&}`?5qC#vc!)6VplPCl4RR9lMAoJDQkD(IH0!5WO!m#$TfYJe$ZB&hJ-ZBU$5c z^%b;DL>h4;0GTVsFqU`+yPh#PB#SI`=7C1*^`r5F`~n+3XcWPs;oM)DIQ;cP(C313 zC%h&s%ATR@=t8_1`d3L=RzJYtpr^8FJ6{C!gX;vXJyz!Ho^7(=MH11cA)Rjx`T!^gOn1TTIb1W~Sfk!f;hakm&x;yqvV%t!qv z1MfHsmsbvhUe&844p0z|i*U|WJH;fKf`)0zY2qQlO&EG8`A3+L_u%;aFf5aUXBVL(mCkl(qIXjc5(f`PJpnA>v)w^+ZE}-@cSW} z2AQh6`@SAl5z;zazSIJx4&OCK8|&H~wzKda@_J&ntJvzat zCd4&Ja%|dF_)0dq_?34AgX#|GaYWQf2agCPIFx1Oj>_4WjhUIY<-||8rk#t8x0`FRo+Z%VI@;}%8)h+Zdg`zd{12Kc;e=7%;%49x*K{aL zVi8lW7`mw^$6nAf#zgh40V=kRe z<*(d_%@H7h$qs?08q%EBqA?2TtuY#s49u0;9@L&@XdY!m`TJ@>f)XUjXT9aVVM_ek zp3pEpy#!kPK{(`(wTo(TfR``KpCP5Fn9r4eO;moLdHcU5(>G=T;wyytN^bmCZZ;-& ztZ5}BsVr#sTxG3h`RRJ}<$Hw4c!|(_)Lut!-eL@&)ejsmINvw<8mbI6O2Z_rYr_uvPR9MQm;45e$!B--n#&{|Z04;Zv@bU^ zRGH}4p#(GAdVT%pS}h(6ae4hlks8u$I^ja31yyr1LIdIDTY()Q;%C>*_ca`*;Q1zc zUk_0JiFF9=9fdB*{i8^u-j^q4dlCrpH+=Zk-WFP(+{4Qs?fwEPmRon|8RQn?-!q$d z1n`Q|JwpXfdxKBkkpLvmv)|xMcv4u0^*+wWx8Y#{)wWOBm@|N3fILIeYI-vg8>Pi{ zs(vZVwENsb{g^W_tYd@8kZZpRGr+JdWMc{5HnAGYXyb@IpCV_Ig5`#1fb09@wo&O= zh1^-Fb<0E9#j?3mO!jOzJljIyGVLbh_$a1nMPX>L(tX0B0t^Ma%{4HjetEq zrbBnN&^vY_gsD#k%^VvHKFBRH*cOdS8MTG@6*0=^?~l_!^Du!PW8X3oqS@wqV;*YO zpvvM6K71h!zi4>;F~#Q%DJ0$GNOJND^Z37nksp~BEIHnuO-w*YIYI&rHaX6*)EP4@ zG;9+VLcaHQqoBnwS(DzWF=${ASm$Gk=W#bH@Cw-YwkGlhf-eN9N>x%$Iwu3|aN(rS z8j9<8wgp~Joo}J?E3k2l(C=Ay+{15q>RmfwZa3P_N=!TB?ERIk-yx}$W&80Byw|k7 z@n)b20LmABEa3Y-*MHJhA6BQ+N8wx4HlDB6B120U?#an`1?4MI8Lte&eRt=E%jUGy ztZl|KL%YXJzVfSnHe|BA)PzpC(Q|<4&34oKwIRzd!XV|jl63I0nPAg(9g6hBZ3l#cY4E0(T}qL9q!;Q zUJEnhT73C(f73-^KEScifDyy*zPCUhQGXdDpjsxfB zF#^LFZ%2zpio@Y3M?29B8trV`%O)hqo12(+X$a|lum8^80mH@Xrr6jcz+t`pI>1=g zBt&h1i6so1PLANC*7^vHE7Bq8LQ{H<7URsY@Lz>1TA_7M_ZQla9RaF3@peNh45FnT zVc@R3X=cHs>lEBS=aPw!Cnmn;ZR&m$!6!GX>D_!hjA55@47`<={aREiEoDSyGlj=B zw@^i}(M?TCxe}lC(%9b#V|$Vpp)pR9Lr+nhM^%2w;;Gd=^@cG$wr+-oF$VTd2me%> z8>`MzTd3y&UxCv6wu&yxIiqIV7BNBkNo+f4cQ8GLRADg5$0sSxY8+g@Ys)RKhv7LU zS#ratP6WOdoh+wKwKEDW0H!ggJ%ZrX)*$)7w*CGDG%E5<&d(LABhs-A=>7G>Vu1FZ zHS2KtVs?Bf$7VuB<&}rkKD19=ae+H+8jwzewNylCIiaNuGYH%k_nTVcbGhx?mMabE z#@qHYIcvxOTR-%&hP5WGTmI*+COl^>sZIB!sB*MSQ>?dL_kWP*1=|ax687~*4?8^$ zdIPb-iu9Wo<|#}soyH`eNmgin2DC)DW`lhT;VsNSn1o?@@OB@ao$|)TsTbgUR>i}cF2`M0F5q@(8W5Rj&|>eiQ&r6R9; z-JL;T=pqwViQ;}QNqD;8P)>~oZjw9MvM)njdE*jN14`TEfiTZ zo(td;G!@SLgl`NB{6+sAA8$Q6e3<^t1+AO0vftD2rlrAWZR1;iVepgv?6to~eM^b6 zJh19pL#kyif9=6BO>W?9jeja9r?y-~ zTJ9)Yf@@s%!>w*lq?>)NxYFG5pE~53tcMroXe<0F-xoH2x zrI_(ce%8AKk6!+yy3Ag8CFZv)i9Z-8AN_g#Ivf7FtDl5dw=T64th@Fva_z@|LVo3R z`~7OKQ+C&{yI#B>^iM~iHCo==XmDUFOYKG&B3F;-T%#H;^?hC zk8ho3WlsNa+pZ_2QFGfQ^3FHwN4j6OV44B^l#-mLdL~qTRH>M0>Tl(0uV%u7fS&U7 zo~7S=To}C{(|ebPoc;p#srJQpo+PbnW^4%QH^}J!cDn!CKRXLc?(UG^{V8PNQ~E&F z_ksN-gCAQ4M<_!ln}^QP?`6aH29bNWrdkBv!_n*eJ_>d8B9}WP1Kf>t`mpv%|42Qw z+UQ_nc{PAu%?HtKTXxcNBrj5)05(Q%P$6JlMm8o1Fe`4MwI&|SKW%+pXrb}HLm9-2 zG}gD-54=hjxu2xkRv2Mhtv~D{^PcdGwbpNi{`*t6HOg)LK*p4IB@|vkb@1)ZC8yWe z-rlzGeehHC#n!$m+M>KEDftA;BL23c0cvJBne$~{yY9((eH?&CpSCXdF*;E=ku%5~ z&o(&d8*-@R+jx77g?)rVlH4X9aLpbfiQKXvm^LZ_c* zT%Z5;^yfv9C7(yp#lFP-0FH!Co4j0DD>N}MrJYW6U{|J6WuE_F9{j%aKJBkR&dz>( zd@iAs5(;4y`&(xY9k)30+|9gw$G1zDQIAeG#O_&WauOb}*?1+e)7!jo!>p<6_HQ>s z8;)}yHhXvR6RZB$L1=&ft!^H()T0k|&#toT)PU1=8C&Z4#1R$E{9m8gge9kl`ssBr zs(J}B&{7kWK2T50eKG(_7kgy8#93y`m^e@QO}}!>QvD8K$QNKd(&M(gWzbqJvoDX; z<#(7zeo6t@P@@w=grO>u%%FmAy0-h<@8Eeom<*@6s<>zH;A5sm382!)7qK9EYbw%% zN$b4au=FCHZyff?(Q-H z>99gCiglGc0W5|ZlMwR%IJy^qCjb9`;McC5ZFXR04l(C5b8L=Xo6{UyLQd642xX#D zsjeL`hcu<4q=`yrN~PZFJ*N`VilpAEDV5H2)VtokzkPmx!EU#0x9j%0UeD*_{+I={ zcPu-=)dthemc{?QuJB&K5B_wtw@qyKh@T(-2uklL< ztPf6>>Y9Bps9Cag-JC1wxufwAHbkcE&)xXIl2Y`gb6*c7w^)D=INu@=+mFbr0=0(J z&4irSDUR$=)u0=P8di8eSZAr<99K6^evG(yR(ULtq=dbGIc9t0_q=hVw1*H~`P5rF zskCK5BsYFdkWLQ2TUXC#80x_V%kv3#nGNj^6ngnyo#*D+B4EE}s~&h@$Gnsn!(D+m^i>Uyg&MskG5+K{m&l zaiO_A)M`j-P(8J~u;v&cZ=m|aR&rMp9-0p{9|p8GO}{ig#}5+w)Gk_ID589X zL-cz9^5*nrQamHrcechs)L~&DuNyHQUqe{$F%_g{qHM=m1Ku6xrk9w3e!v=sLbe*T zWAApLFGEf=gzre&7x6_XhmU(R>4Zzt1wg0gX$CaO2%*0*hk$Q&ko)+l|Z{ zIcJn9KT6faVyO-GxY}zF`c^*Y_uA?BYvKcLY`K&-phPv^voN)^S?e(}=ysnn5sIDbl5-uA+az`plT2bkl8&wB~yPy(#!?$}ybVEI>KX zrdc_i!q&=5+`h?)n`byg`?`etGZnGQIuwf^c5XkCT zbltT&@T@yJrj=u~pegrizTD(DFj$6D(g(NMrXG3kC!=eY4dn(++Ux|P3q4izIe0pH zepZS;PmwYiQG^sqx65SeUHc3&$i{KC3ftROOO-k)MgQo1;@A5N@~qlBA&P*Hw26Fa z#G!Ca-c40qSl6WQC%8M_=+jwvN`dz^>%p|PVN3_Aac(Lld74>fISo^4=S6L7ro?hs zfwP|%@lLZUjF||68%09+rXZzse7YJt&(&{jL$Qa|1%^2N_&@FBvf7a&q*JpAuiW}9Jkof|uY;l#jJZm=4W*llPo=C$e2e4Z<;7Im$ z9BK`}-2a2?sp2dotx(uUe7FmdP*Ypia!gdAy&wi6tu zTI<4Vh1!c!YRUrkO348pS8+Wzv}jHJWsZ&?UUUZ)aj%t<6N#|Fq7}fvwG3@^gM(=^ zvpetkyksLA<#$U3(?)Prx(uS$>6bHj4~m59DAIBll$Jb*L#4KIkiE+Jc&~ypCI8u_ zg{{pVyBf7A*=pVCxEtB=SD!q*P`c^t+PI#?`)I?<7dNGDC^IAX56q)+~s6|w!v!r1vMmkV~R&)t)>Nj*Wo z%6q&%ZJ6#ZxCos}C3jv76E8~^kA$L?y zMp{TlMrlTNDLMCbhR{0m9Vhc)e&#cI=JxT-T_?=MAz6>}v&yez{ZeJ^p|2|rTK9J2 zy8of3Kh`yQWgp+1{Y##GCSz&$*KCpi(e9OVd2`M+3}WH0@tnU)$=#UfpoIUCrbFYo ztl8Xo%KFjx^`C_6AHQB@JidNmcKwvshF6<6yroBcc)j509!N?&LzY-@sVDss2WbGP2c{jdoWzN>v+O z%E+#Z3-U4wYT*LYhs*rl6hJnGPBDd{2MeRG7Jj#gUYfbRH6fCObP@+IO<|!}s)%`2 z)D{?zc!YV-M%vnsS|uPZU4zF{ibx#tkQ&&qg|bSG<_NJLdy&xs)M6c#x$iitF< zLHSUS5Cvmhj?PhFNS*{;3SO{$9Wg2G8~(4^Rm0YT{*P>e^;W8Xu9=M)VT^qY(LT z*l_iOfE!!#&K^kpxqQjjS<=3XKp87XmIiF$dvVlJcEY&4jhek-tH*_y2hh?jF-ye~ z@*GU)6rd#wr34MGDe7PnUf_%$XywgjC42EsLD;iO;`7->DS>1;AA5zFnLTZs!Q#DZ z$6OH-bA*8v5LN+gegRw5@X6m;cCR4x6_r-bY}P?S_r#hs+8r&dRl*D-B1~ z*yI!VLmDX+AbnS%3l!SV)IRT+#3it$1A^2ETO5Q!Lvgz;v)gz!6c+U-md#PZ%dnw zCto<^mf-B|KgvHt>}prLcNv|$MXgl8Kt+NQJc00QU~>fh93 z0H2Vg_HU{I=8(c8DB*wfh)iWRX&+VH?P*FyrfM8H0Y^h`rppO0ujtGwwI}%!yX!iW zO2kH(d|Uz8=md zoErt{4iMIc;=L8fC^a~)v(>^3$i~{kP<)iKAkT!Dd z$4W%7aN`_=aaQ%Yu+g+S8sVv$$Wcd| zGp&w{9Wa9p*Kq+94B&-+a~2>+p~Y3{r$E4(gJin!lDuXG4o-bCe)*pa@;rrrVgd*z zXtP;+^$YsJy^{NZdp2Gqh42abSBaRmo%)w_21mWZ)k5I?J*Uq_PTG$Ai`3GKDrzo zpg>CH+K6KsN3qbsmB?ozZIs%vo5Au+h;+IBIr_ncZMTie$U`iR!mgcu$t_8MsB2?+ z2*9C4BE0nd9`sF3EkUl2K(f?73-VJ=5Hjn4C+P7w1lhpLaHr&?Z3@hCwZG)A83W}ZZ!jk34 zEzGK-N$M-Ozz>fv{s-m9(Zoo4HIwH!$jAMaPZ(uk)%kt<(C&oQEM$~$<3|NH7)GsZ z!?;7JGy9Ova%_tN(WxXcujp)kdrCUssiogy3o+JHE~{<8lJ4^yb)J3&`Qs17Wff*# z&)*ydPYc{vZ?yZ^8-8dnct_WNUlSuO*v8EV^^49{gp&yZE&dvk`b~h@$ACb{YP}k- zuO^*#Q`!Ul+HZ9lbh? zhd8Y(B%VNN{KlmhqdS`nx@9m6`iMTz^89kt2J~8QTJfQv|~UXNMm>86J2s-ABDE`|2|`>HVnTu4~)fr;&S?JleOK zHL@DQy(%7g+py^UefC`aj2<8HCF=Q)-OvABf6Qp=`Md_>iB>Dj zbaCg^PamksCQ}u>DSGu(V$;;Tyft}r%GBhA#i|!JjW4E#UpSLqx<$YAs($G+@-kq9 zHgsMmd7*|Ae0~|P5fwf%U9m7v81~$*UfoFX`lUeMaYUz&QsUA{Mc;SV?MfRJ;6Li3 zDEXXuH4!h+qPHCIRHC-L3h-#hrn`Hxg%nc-ipuG$-TV9M-?$VNChZYs$tA|t%fwL? zK`Z}vL9m;gW0cmmnQ+8t3q`mm71gNF$~lQzA*6(>i9#cf)X@ujF360P$>!z##(;O! zGPFGf-=@~N#3H2f(W!!z$rMzAisqwidpwB-%udQ0O`Uf#@t4xet6es-Swm$mtLXaF z|5kpxnr9kPy~uy(xB2MifL)q8rUYqT4PZg9VhWirda%ay7)H@7fGk}%KW?_r$?W0o zHne?`6_(#Eqt~0$gXa4B#W)MMoCF*UZ~!dBv6zBDh!1T22{i^E{_*0bzt!8_f2q}6 z5M`b{LNpADFaqaKJ1O6gO!okf#?hUUd(UrdsT?}J@~`zqmdQtk*)g#*F(qt^Z z`pRM2p*7m66Wv(TOO}Ht2%!lYoO4M`y+udzS-aWB9k1_~S?>9C2ee*T)k1{`nZ`T? zL?gCxq=o_WO7ZGjc!8mY5CD#@LMaiB)Bqk#z}9vO$XkMV%mWEpV{4sJ*Sk*|MNEnu z!|n9{nlULz>YJ)I)WIps*UO95;xn<+6?Z5mOvP?+uH6z?_2n&EOwNdzb1-q?qfNIl zI)L=p>ZCllijD+PtEaXt0+D;w_`=AQ9eL-lXLzPvBNthKNcfF%K-(fEgi` z8nv_bS7EH+kfzby{(4;#KJi;eW_bQ>tE(vm93SCA11+XArzS7~#oS3p|6RWz zf>nnSfwgpJHiO8E2`3=JpOs&$XZl!z)3&bvMnX-E0_2t@YInD1>@M^1CmNz=G<^D0u zj?ZjKSe1v*)pwg6y%Bix3OPrUAs=X#St^@sOk6|ma4AamaV(GT9R0NSv36G3>(z=j(-hI~f4F#8y7{6!A6uffl}6j)EQ3fCBuJMD$uM6xjQOt zdGFy&pZ6`g_H~Iy&b0ROD4MxmhDz$>w!ASmg-boCk{18r%fdiKQKle38G#r!Gb zZG%|W0RX?cu!(Tn8*94(z_V#Dv}b40nwS*nlj8}ayv{zO;?&Bqu_+yD+KA5=PK8TH zuhClDz(qbahj3OBgIa!XAu3tLRBL1cCgVbk1dw;3O^rYJ+{+0%Axt`e+d!B(`d zUAFc87Kw~>t#|hcNEDNPoucdx01#nf9gxirj~ZUaG@&Ts6+Xf(w=M<%+3?>q7s{jm{60>xrwm&|^6>W$?!lTuRwPNl!VW{tu zsUxX;v5vA1qRyJx&X=FI)G-Sl?|}(!oq`x|TTrJDC|Qo`H5_M`5qM42ejmb(RGJc= z2VaqBRU1?(Q##TDTZ;e-Y?wM(CxcR6{HJ`cDS936VVVwswub6~=)NyhpllZ!L?&V# zT0kc&!r8VPd@d~04HE9ona6?a*+JUxTn$&wa8c_!dm=vzM$=S*c($gJdD|^1O$HTK zQcUI!T&(qSEFo-Bgx%>>clg$xJsZgYEpE0~Z=3Et_g-12!~VHDcnrdyX001($Ur$4 zZA$kZT@mNZB5jLwsxyzOZ1muxx=y9idnuvYGxEjc7i;Lc6M*NJWfk;40#uJ$`=3Lz zX!EmX_=FjdD$~dV>T{P@CV=#fK-I=R3sVzYhW|`{>1w~yaM=ysbhw)~N<9ojXPu$? ziO3d~O6TSG>wEZ#leEqtJf#)D(AASq49x84e6Ao8v5%=(xTuY9eUvrRPJDmu*vXWH z<9_g&kZq1Iu(4eUZg^Y0L8^l-e%xz-W9>(^Xod)#7@&x+NWiHnB7@t057?2HCz>Hx z5om9mS`y#+ov~|RnDGdxTvljCt!4?#bX5?OEPmwayNHmWPv z*dFtHG7#$b#K+`r)-BBqLdoKh`=shuFO8+luk9n<)!g|hDkMkW*7}|7S$$70i3k12 zhJeg5B$`8A4$?nVy92@cf8#`PF>1iMmAerAT`5IBnHA-*&48DTGS9E6D4gRV;P1N6 zwT{$%OygmL=d(e8j-td{+YB+J3B_XWps7r#dI-mfWWs>)SoKP7>iw*cgFwJTNdH9V zaX->O)QAJ=3_}^vRtS~wa27`B2N>*R;(_fmKd`mOO9{ot#Tz><=#F);32zxn5S)gL zYn}2PdTqaUnyU@*Kx&#?VoKv^H?uj63D-kAXtpNQf#B`26p?xCl-VoX41TcvL~0OB zoNKf8x1~Co7dGKFNC5KYchc?tC$ATmMQ$09i)E34_%MS;s-mqd$87@fT#%$S|4J*) zQo&e{eqtUYkkHRIhb_Fnj&unUqRohT$17P+c9n0b-RphW_IEa8uxqEs8d@OUyt8-l z`DNp!t|EMuFvN)^dgwdJak-nZqW6%$+m8PZuKexBrKm<8b?8U_V<_?)@fGh$=@ig* zSp)~!HNx`%Z&YCIQCeWh z@C0$9QyQz-y_l&vg<lslHWB0m#W8O|Nkp62S%%s$fXyqCEE&*FWy#}eu*D2C zA+w7k~Y)TO-N>H+dc{QDf;lkdYa!IlP^Hb)| zlS>?jOTGChE`aG*wBcecRzmPHU6DHrK=NSU1Qd!_;iW_^wWn->mSELZ5844|9vMf0 zHzbsDQ7**EhuoH>uM8++2R?w*kDo^Cujyl|W zI?bUZ0VmSpY3)sFd{jUm71HHnxUd0KeSf(TqDAfh3!6s}$XGxD; zz$M1+JQa{y50C)NGCsVd51Ugb2D8NJ%906!#7~CX%Gh0?C{2{u@ietHyau`PB3EH>pCaqBcUgXnw( zV&$yuirTQ>y=D3HT9FCIixp>%^FcEnB6FZtCX$1=KA{mT;H8j{a(1C6JcHT7lCyHxPi*9`W9)T5^ca1nc8Bv$;-A=h>5m9 zc1*P;&j=XAcr!%SY>}?=WY;e-kFmI;Tx1H1tu;JZo00AVQJ8^BQ*AJ+^~iFa7A6bS%|ayZ-N(dLtfXmKw3bZ0N4N3%PxnX@gn)4;#!3jR zu%#dp9cv>j&aEYN%>7`hC!KnfW?P!C7NObz91C2< zLjXle`}UTn(+e_CRB8#M*7Nox%B1lsDK@+$eqN%P<7lqjycs3Q{IYGc=r00!d{Jq9 z-5$FKDlSX11V%!25;sV)M1b~aLx&7v+-Fcx^Hq!C&|)4&FGA`(uUOWE6>9LhI%KFC zwFIYqbr73ii=3^KENLs5SMz!5KpqeDiIrFZB}?iw(1X*`b=YjCE2IG3vr0URB)nGa zX1K&if*Qfs>R++$l%@^y(&Px_~b2Yn#!>G6I(WF4@4eYGUpUWJ`0P zzEhnh6doK`f9K9`G^h%1Ft}VNFZX5c^<~zs<9S35l)-n(v2B%4PT}`99Y3}3Rg?NB zytydN1CBP%UD)XzW#VMo(4DQL96hRLuUb76`xrvk=cvF%`U z;c(5z7cwqRhv}|GIkH#~Na$ zyIA~jKB1ql{U4I_olntQrn7cbH|oB3f(A0Z&p2}5@Wy@5J7pTk^nbc#l+?^A<|-6p zwKm44iFJ4V?@Mm<|cA73Zq|EpY}E0Iy)$D=J;nT|{RHO2V84g4D<5iQ zJzR0Qxk-Nf*JV-CjX3JS!jWa;4nIvpFxpJW6wpr7k-09Sb)%tm zC%AL!%%OJz&{CeP3 zoF%!=L+DO;V0jhZ?a@Au`^mh1MXP8NRYY$C>eNoFChiet-=HX#E3%L{+Zr%mOqoYV z2tgDJzQ*3W7PwL+4=WI&QCXhGO5iUcFuKk;GJ#054oP35^}#MK4gwSiz-B-ew>1^@ z9rwmgo(rQKeaaSWrGr`B5elUBHpOB=DTqi+1*F(x5=?tZJhMp$jfS#Ha0X~@5i+<{ z5|t1*Ig8H9!Y=%yQ#!=cc1zL~!cwkmH?LJ5GlzDEnAk7J7Q>}e1!cL6602O!-MV(V z$1;0e^N5btZSR{~1)sz0{a z3da*A8)`4>Lq)O>x;TU`4C)R5WS+=OQD3h_klCNkOh{taoCgw|BkC}h=i_eM$>a8x zY&mOIJdY?jR2GNG*4WPs3NnXMRXiZkwiVS7iQ8LPOSR9>*@}ctnt1H_*_}zH)7y_VlaU20IjOX7z#c# z^x5f%^QU$`o_3g-UP^kk?7S!@;1!McDlXn&#R)^_ z>Q{;9U-fjaUHN+LYD`9|b;g>IjI|jVnWY))PGlIgW#o=$Z1|BOq-Wl7cvJ8?cvDE@ z<`es#+^4>F2e)0xEFOQeTAiu-{^lBPM&z7T%$||1nkjYG$*s!z(cxXOa3yQ+ovhTC zGpN~_?Z8_KWnGi3JlJDhZT#CEf^|`ApP!<}*PmE-_}03+6YGGtZ;wXr*+$7e=9S&@ z1AROr`($bMsT1!Wf0UjXc~?Avdv53Z zu4nIWF1%Mp@9B2_&`Wpg&&a*K^WtdK**h6EgEv3W26DAu=ibAt=Y-c>jesBADjU63 zHnwVg++-HE=p*~U`X`N+6*oS5-(UainU%%-M|DW*3$G2+@f%)m-Y^qQeS2bqZrg?r zUf{=!eV?K$Khxvqtn;|upEt#P{wB!#S(?||l=pk2_Rq7=3n600{AXZ`2=RCA!l8g! z6qY0q2)l(s+(Dt%RUz?_kaQA7cEMBh=NQbn{ARK4()@^|Ir_ovcGOKlB!r2&f1j&? zU8nfub-=0(VMYOU<+=y?^-(_(TMdi5^Xht!R~&~NI)V%rZ(g&MRk~`XB#jw&f#z3{ zC~XFkYTnwfu*ED|BK4Y({N0oP`542BjfxYXj_!AOajqwe3H=*x54=2r( z9OnhEV{LanQI;Zr&Eb8Bw$h5gsbsn6(R7|Y?yj~B!JQW$+|Jg_Sh8hOa{)V(=l=CI z%!AQ?ZABLM(DQzMpM{7>U?y~$twO4do$30{KPmkNAS@1;B`ACD_MO}`kni9BB|lHeenxfCHGt~ zEpou+dF(d?U*Gtf2u+NV?4kQ4@$bxWAt`o`X?nfsHMM&KhsHPHnIHL*e@)CDO zizHZ;WMILpRhTZ&(zd2aHR}1X^uS9OWx`y z+vDiWZ!T@VI))ssU%p%Hncma1R?;i$bjz&drw5 zi_{_<#Y`p<`CZ<@S*l%byBb`;8`FY<`-{IKNT|9rt+6kWJ5EoXXe|RUW*rnU-pr5X zjnea011QuVRFSsDP9_(PGZUJ}Ra&a2H^y9ujq{V%x!%sGpsc_#@3f8%8a8*~HHG)B z`y%yo{6L&ubHnmIPMer}^%u#;_C@KALs))7=g(P7$*!R6*t@bFxqPlk8`$ zw+%By!n8>FSPBeam^_(p?3PaavRTV{TqxRJxlg1C z(`G6}h}w-J!z_fYPyI6OcV0DD%9SXSnFc5uK>S~VIdGj<9(jNY7*<&zw#$!2fVR5z z(@2~#E40N;u=|tR!lZ={6VsR_CP}WQtKkyk3RZ=+5JKqIL8LKAYDwWR9y6tczFF&h zei~@Z?j~>GRJ7cg!j7wS0-ofH&8M49uI1i#N)v(t{#s`@CfEOqtCo2eQ|HwHmQ~3@ zdMum5uVk#%S8&jzNv=UGVw%=#H7PY%!;Wf@!~aW+s%sggA`J6q9z8qK#|ak z6sY9<)KJ@=?skC?dvB%(7*&MtJV3SEHhWAvWERjr-!5CVZc6Lf>29+VoO4N?FDRZf z-FoSI((*Ay@~0TCHY=65E~VEXk|EZwQ)sQrLSSQ*eP`k+Xk#T|RR~2CYOJJLK+==z zJCT#uUyZE(xExj1s^z`7bkD{=3LRI8W>@>iAOlFnYf|uLLIm-!+37`zLJ?u7u-bS4 zpf?xA21xl8PS;?aH^41?y0W@h){KwU+}af?L|F;Au-8@g5hhYGVCzA^;JRISvCaQN z0>scvv;Clqw@oh)6?qLHGP$M%NU>qfw+}G^Taqkrt~ln#1+pech}Rs89AqVT0(w#_ z{MCW_9!eOW1WB}JyA7`?y0J5Xu*gy$#LHiDd`@~A?(d`BQc8i8`-_Aor|iGM{l-Df zxTm%tZ4Vpc@oW~iS^bip!wdecHCGm)G$Z!#tDMdP6`nNk=D~qbuXF`NSk*&>*{kD5 z5HfDz3!UoO!2i?^zE_Hnp3h_&y$q-*rm*q3h<@*}xzef0yogk0khkK89xwLtNX3RI;^7vrh@*f zH5lB0LWmO-^lv!LWJ&}WI{Nv(EV5E>XYm)Wv~5!>os zmc|*BVrY=3AF#sj<4IfrRU_nx8~$b_L@c9iFj>C(Vl$DcdZnbSXaoTcIHpToyVP`2eip@ zx=xn87G{$dZto|r`16f)^_^W;ryMl&Qv%<9(e+E2(jDi%QJ#gbXxE&ER*iA>w#fI> z2Y4<{JOsvchC_=7K&tTl3N{PlpEd_XbXuruPFL7nd3Ac#jWZ`w;OxJHU+INI7oUZx z?N1zlOFWC4@HhKHHQzgVZ4itY8weq_!Dvg(0;?|Yc(E~soG}2H{G!~#Yvg5@R$#4< zLQEWx@7+SY_#A8rMOWO9h?_7#nnEy1SGYTgsji+^B0xvg?yc%x9k6xKDc8%yfeF2I^vyDq$= zLS!(&@j{haJ0h5n*mxT0uL|6G89b&43IN3B9b!cHh-p`;>Ac87B@%V_+I5SZAf#n2 z$Bd6)`HgxHh!T|ucYeROhsdxfB!G|nTnIW8a&4I0MIH&Of_l7RiSZ2V0*ODVdh74@ zFOKCJFu1^rz@jRo0Y7kEOJBfb@7{VXZzhb?Ts-F*+(?0!pH1Wr^MEnfox!0iAQ4;1 z{?Ho`+wVCc6(v9zN2M7}5}nn(NHe*n^mCEon`3V0pBnbdov+!g`<+S>7L{>0ee8iImnZ%ZO1_1#ulEwmP z1Hq&LgdZTWjqS!q!k`eM#&Wv;yQg9J$OB4^N{Wa@cq)5{krsMz743DPN#9|TEHI!` z;+>0JEC;cCuJbI%c^ah50Cv+NnhG8Oy74jutq;(f2-fLJ)=Ak%I?K^7C z_fuG#FzOWB2)OMig#JWD z7oey0RO`YRY~KlzaNT;Ay55sWm#zqHmPo%?>8VC)r6b~7rI!Rx8B@wD4Ye0ghzZy9 z--!}pmKH@ST5{r!j+CP_4N+OW_hv;VG=P>H=r`T#7zr^{R`>x#93?}qSY)UapM9(J zH%Zp@GfAG}x29+OJ=N<}7lFYON~Buz zntbbbZiMmv*l)-AMjeQNhWg}xdkvV%!wLv(JRq8pk{-eyv6|Sf5?ts5 z{UaqDL{*$0T*d2?siL$T0kT0DGcMSdg|svdbm+*mZwS^9wuTx??ySg|qO#8F5q5AL z7$$z52Y1?qIE*2T=X(q(dsveKeW1sX6_^;WHuVGbhB?Ldpk)VF-*%5_F4xAdr@Xs+ zz6-JIuE;A$%a6kSJ^KRnFin@zqiMj?%e|#xKFy0kq#fw-L62R?F-z#)tQxOwm)Oz} zmPN?ek}_Y0!Ps!%t0RNH!+fj8S7nYb&@(-f84!hnC_8`+V7c)ENNx+&V)kKi9D*9Q zQPsz?m6nR2@)Y=hM|%7i#ySCB3c+@cNXBuv#q_Dh*oA&Cg5ys{(@?g984*TGN4kwt>l-&SqtgcZY;c=b&0) zn|!5y6{y3Ki0xpus@Go{O8!rYQ-Z!8;iRmJC5=j_VyyrgC*Vrb;*birNTp*}n0IY2 zp2GD{Ne!s&MGbI#r+c4K#l`}yLzHgY`87+f4-4Y^$(@jQB!A*;7*a6n4$y_F*UAmStchQB&QIxIAwqEW3#SF;e-6DjR}4b%_eF)x&h zX2tf7phjV&rU1G!5sla##4AyDEDQy3UM)V`t6WukXuP*~C1m+;U_en1HVc7cakM78 zO%le#AninFqy}#AIU5-BY5CIQ(9JtJ5q(HnEhS+r%AFu4BDEouNis0n%8HkAT}0C$(<{>DDK$ z*g!|!Nlm<{xGM40EI5f)nkaxgePb*92DW1l*(YWD4j`x+ zTe%3iYvBl*spMKhAk(qVoZVyG){}Tvl*S6wDHgd6qkU_;wdZ?MI(m$=5*SKufEuKu z)ZVyWi$5G4SnTB&Xl99U?!tR8#cTd>>M8zmt2n7!+=N&}6Fapa1BL}=xe4KZ5tdol?Ht~PW2loG4@Rg0i=m)k%0v2789JR4 zP8$sxxxEO2sRAAj2Slswf|6i+p(coU;OLD|V0R!6M>V&y**lC}p)eWUU87tu10mC- zXuH>ZRPaD$kPJYK!Q3gNHCu_+K-K^NXdvg-o_hirBH_Tkv*r<9y$fupe9J2Y5)Sm2 zbMcc9J_vMVc4LN>_?8$GCGps_M7sg!ZmVn@a|oC9lKTLi)?TL%dx_IZ$Mir;mXh4y z;y(bVHv+ihs6+h{LMuE~gD?n!9Jw-ITL~x=57&iJdDc{wk-JWhjwMGgNa>VVH$Jl&=7cx4V08UoAY9J1_o zUDK_D8zs}aU8g|j{9dw$<}cmDu*^uxhe^B)UFicnpfO#LzO4xCjL5CG(8H8OMnTVH zu=WHL6Ex_8gKH{_Dbggv3sN_AllKyS%>V-WTZBA-0aRHRk2{S8*8- z(pEDq|HE-u=qzV-xyT;|y47~uKuFE=)`s0<%@$|ZJ+g%)ho_OgogoHL*0X<+!~b&U zzun5Ah5qydof~>xYY{sija~#A;=8(!;y8*Di-SKVwR^vncz;7JjZItpM?9e-cLfIAvs{uRT5@nqOz_|!$2c|~ z0gm4;czg>C{T8(1+oF`hkPBL&+dFV@2k+&Bmct(5IiheEFv9&DuB+oj^8LsmPSo?l z=+A{qdv*A_BL32_Wu}{AhPq=GZ_@GGG|KagOZJR+DPVq2Ua@Oa!k$fWwcit01SehC zl)R!p`SvER>bt?yO{*-FtM;5#rNZCW#hfnA9UderfT<@OnUt5XLQN2OJ&3oCK_nRXm zZ^^&M*yymhz;|(B#NtgaC7ae<-CS^Wi{xjXUr*7&pIh&7w&jEsb^P3ZiCcWB#9VcC z$IC4SGg|^?uV!}i?!wNeTA4~y+HWz70%sfy!}@~!idqzX($A=ZhmQ}KL8U8{rCa99 zu13lB6qO(C)a-fE&$Bs}Xi`^El|y$Gxvy%1UEO@(z+6$>{5%@CCO^EXW<`IE&9C@m z+&*`BU!Zq&)Ykp0w;pisJ+OLFT#ufYG_wsW5gVqW~aat_&3 z^+``%_x9BK?wY^uZF^D83AvonX?l1&-X5%u@(4) zHYPVn%gMZx!GV~F>ZFiQlh?Ai(h@Jzpt0rqkFD}A{_+D&cW!v*K}ZUz6sr5iJhq(B z>`=&|{EFi1OaW_c1@>lfBiOp}RW}dNbSk9qrqoDMLDm1ga1Sj_yjj$Fz2#j8hTc{D z#>cK@Uqnp(n(7EG1WG5lRkOS#Q6o-JmNb^z)W>`LdP!xQ-#OX1tOv%>%xS-x^@Lxj z86@}C?vst_gYzgu?%DainkZvCODf;QK(q4qH5FUyJtzn{eqj90ZGCrISjm2*o-4m5 zROtPt&aDk)S-<&9;@pAa*>#yT(-6d{&ELg`$}SxElUmSuboPG#LYrX#>qVELV`~$J z%A6qu6p!2864RVJbrHBA&9vRnp6`N)%QmR>Fs3L|^@|mOd-QKU`%q}>_4)qo23q)X zV%dhB-3ZXCmVcp?d+#r3f3S0_XzZ(yhX9?Y*PO**ojWl{!>l<=QR`UAN_c37quaK9 zvK&UZ)!wl&B26=ndi&Inv?vNW|i@pb+GZTxX^OTe+)C%lB}g*2R3r?Ok-)!EujNOsWt__|py zUyz)n8+vhe(xNB0$XrF3;i}kfl&)RtEzQoa*!hX9M66j}bvSmDXqxGmFiooeA;>kL zcJX;l4@fm3zFWRrLt>3P zUK7pv>$;=rtj23;`uS5#Y`AUBl+>j)Ar0dQ%Pq>x4+#k_-s!etE&GfjvCLAgW|lf{ z%mTH9V=ADb2wwMM)!Nx#{feWx(Kl?pe#(y5)#bJdKKx8egz#YO6C}KP60h91M3W#q z>W`ZTKrlwuZ}5uO+>n$K>IrIUa~7U3(O-(yada5cem8|j&@v2_bI*h`QzRSSJ5Zn1 zA0B^xp)S3| zbqumN%0zLO)^dwC{FAp~RObJoiPms}E^t(eF@DyjF(2Ne2=bE4le*ppe;=Vf%!X?;D(4mz(s9houu4lY*@W|{SVUDMth7UJ}`5BkpnA9;epJ; z=wCQh_e$Bz8QpJVtuByJg)nfodj)M39!zeygT`_(g(YvyyA4werN~e#7U_>{gK3wi z_d`EM-4&hIsEyV|P($FJdc;rljR-Psx2nk11hdlBN_0jIB?vyX{poZuR5D`FI1$V+ zZNM0QQ^*YDk|p2d$cfYh-{ZOvS~%zsz|bq=wgpng(qaO}M@Vbd-?tC=HnqIBAke!h z&7{5^eP8hCf-{$s7ufb!5Kl(9ZG^IaRa)wFZ<)@=4bM3fMOWo5LxFhqUXjn-AbR!$ z;qLa-d5J>EAe-${fc^y02|+}@kWlzA2)(=;df2IuZ)j%QTD+D7HE1w;Oq6BAEbLq^ zCd4_U;DhN!YiH3Q$p=1ia0!%FRI-;n*&plgX+EPGKM`dJlV2;HY!5C+zF0t#fCn+I z^NXE4K_?rw$~3PX+a`*ks?`HnX${RGq#3`k6mM(D!_LpWm`Yf1c6o0$wJRC5*jS`- zZ{@(NPg{d`xELU{mkDai=f24d-f96uq_$KRb_E*BZX$-1u|Y3ESU@ELEC@A_QG4K` zu%pLGHj1K_xw3`wL(g?h(^meD`3e6~QwX1T_JtnF=ba5`UrG9=HfM-#;^-P+j#doZ z5Dwp&9)VsKlmM;yj}s1bU_w%Bv}qf*6ds;B%!{WwV8*Er^o{?paTtpy&*wwR>rRMRYId7jDT?%uy(P+bVatF9jC`7blke(R-dza zSFL-ru01@i`=>W~d~X|$F$4Lu4=S<&vH7YNETL6qixx_WQl&LvB?cT9VF96rY}Cfv z_Q9D|I2n}hAs3Uc^Uxc15@KfF7F`xi(Heh-TDXj10|w?+652TK&zODWHlD<8%+#ZA z7Ez~^3yax znj&Np3=By98s2&Tep)4|mR^&Nd(p?A)^U9<`KIahQzXo&Y4bRn7RD-%$jsjQy+_JG zY=h{g+pf8kn}<#@9r@32Va@h2lWBU=q7T3YoVe$NXmP9{gf7$y+zfS#2p8KzDM9bb z)+O~Bgz=H1Z&UPwr-JrNAH%dHyNEySa$I zPEX|u{($YZy}--MvhZ8}4q1f~xX#7}66-+P%fupWX2INWoX@_5|Mds_pRX-dk zca_GSV$-@NGx+1FPoQNcu-{eaG0kBJPQPqhMBpkx{XMwpsy=-r?iffwQo9m`9i3;? z19rvpK8Gj)8O!Jnx_)yf0L3izj0jyngFf&>^HgNLY%FVi zMDfdlGN4jv^f=g5UW0$1VxpUrS*Rw+bhwXkbP>-s0HM+P*P(LZmBK)5KgS&wgSWvg zpHeJVov`Nz>p#B;nJe4Z0qa|MWaJTkRzayndn|no z)v+zB<47|pdgFcOjp9RRh1S#w)9Qcxr^Oa|6SqV#rBO@}3h`g;@Jy?`N;r1f(LNid zyr$}KGd7q{N~56Tt{a4K5*XJQX!WDTn0b`uqEO}D|K6=Z)!uimlFVHOd7S3pauxbb za9Y7}!gbAS#IkKukQ71G774N19=nv+lQF?4SCGP*h(7H5gFO7w*XF5u9|uxQ=Ah(W2Tf-CSMrQPzM>j3 z;t;mba1a%8blhne9jC?Ywqm7BS%t=0z7$({~Bbsjm9>#9$P-rhBn%cM~C&hx5EQf2|OG+cxEDFvgQ@(JeM3@@zjhv7$IQp({bP z4mA^OQX-}eD)8kRbowouJ~lQ3C~J##xM$!~=ADr-Vm}-@Hz$txMe{Lf0;wJP9^(DQCHArJ#wmv5CK8%yZV

b%I`}@pDa0 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 Lt~hW?KmY(cedEks From 03c3e1c1165e7f138f0998db044c8905e3cbc3cb Mon Sep 17 00:00:00 2001 From: simonmicro Date: Sun, 11 Dec 2022 17:17:39 +0100 Subject: [PATCH 113/154] First web UI draft --- docker/docker-py3-kms/requirements.txt | 5 +- py-kms/pykms_Sql.py | 23 ++++- py-kms/pykms_WebUI.py | 45 +++++++++ py-kms/static/LICENSE | 1 + py-kms/static/css/bulma.min.css | 1 + py-kms/templates/index.html | 125 +++++++++++++++++++++++++ 6 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 py-kms/pykms_WebUI.py create mode 120000 py-kms/static/LICENSE create mode 100644 py-kms/static/css/bulma.min.css create mode 100644 py-kms/templates/index.html diff --git a/docker/docker-py3-kms/requirements.txt b/docker/docker-py3-kms/requirements.txt index 4159f71..7bdfb22 100644 --- a/docker/docker-py3-kms/requirements.txt +++ b/docker/docker-py3-kms/requirements.txt @@ -1,2 +1,5 @@ dnspython==2.2.1 -tzlocal==4.2 \ No newline at end of file +tzlocal==4.2 + +Flask==2.1.2 +gunicorn==20.1.0 \ No newline at end of file diff --git a/py-kms/pykms_Sql.py b/py-kms/pykms_Sql.py index 270d76a..ceb57dd 100644 --- a/py-kms/pykms_Sql.py +++ b/py-kms/pykms_Sql.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +import datetime import os import logging @@ -23,7 +24,7 @@ def sql_initialize(dbName): try: con = sqlite3.connect(dbName) cur = con.cursor() - cur.execute("CREATE TABLE clients(clientMachineId TEXT, machineName TEXT, applicationId TEXT, skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER)") + cur.execute("CREATE TABLE clients(clientMachineId TEXT PRIMARY KEY, machineName TEXT, applicationId TEXT, skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER)") except sqlite3.Error as e: pretty_printer(log_obj = loggersrv.error, to_exit = True, put_text = "{reverse}{red}{bold}Sqlite Error: %s. Exiting...{end}" %str(e)) @@ -32,6 +33,26 @@ def sql_initialize(dbName): con.commit() con.close() +def sql_get_all(dbName): + if not os.path.isfile(dbName): + return None + with sqlite3.connect(dbName) as con: + cur = con.cursor() + cur.execute("SELECT * FROM clients") + clients = [] + for row in cur.fetchall(): + clients.append({ + 'clientMachineId': row[0], + 'machineName': row[1], + 'applicationId': row[2], + 'skuId': row[3], + 'licenseStatus': row[4], + 'lastRequestTime': datetime.datetime.fromtimestamp(row[5]).isoformat(), + 'kmsEpid': row[6], + 'requestCount': row[7] + }) + return clients + def sql_update(dbName, infoDict): con = None try: diff --git a/py-kms/pykms_WebUI.py b/py-kms/pykms_WebUI.py new file mode 100644 index 0000000..7f8b576 --- /dev/null +++ b/py-kms/pykms_WebUI.py @@ -0,0 +1,45 @@ +import os, uuid, datetime +from flask import Flask, render_template +from pykms_Sql import sql_get_all + +app = Flask('pykms_webui') + +start_time = datetime.datetime.now() +serve_count = 0 + +def _random_uuid(): + return str(uuid.uuid4()).replace('-', '_') + +@app.route('/') +def root(): + global serve_count + serve_count += 1 + error = None + # Get the db name / path + dbPath = None + envVarName = 'PYKMS_SQLITE_DB_PATH' + if envVarName in os.environ: + dbPath = os.environ.get(envVarName) + else: + error = f'Environment variable is not set: {envVarName}' + # Fetch all clients from the database. + clients = None + try: + if dbPath: + clients = sql_get_all(dbPath) + except Exception as e: + error = f'Error while loading database: {e}' + countClients = len(clients) if clients else 0 + countClientsWindows = len([c for c in clients if c['applicationId'] == 'Windows']) if clients else 0 + countClientsOffice = countClients - countClientsWindows + return render_template( + 'index.html', + start_time=start_time.isoformat(), + error=error, + clients=clients, + count_clients=countClients, + count_clients_windows=countClientsWindows, + count_clients_office=countClientsOffice, + serve_count=serve_count, + random_uuid=_random_uuid + ) \ No newline at end of file diff --git a/py-kms/static/LICENSE b/py-kms/static/LICENSE new file mode 120000 index 0000000..30cff74 --- /dev/null +++ b/py-kms/static/LICENSE @@ -0,0 +1 @@ +../../LICENSE \ No newline at end of file diff --git a/py-kms/static/css/bulma.min.css b/py-kms/static/css/bulma.min.css new file mode 100644 index 0000000..86ad2ff --- /dev/null +++ b/py-kms/static/css/bulma.min.css @@ -0,0 +1 @@ +/*! bulma.io v0.9.4 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:#00d1b2;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:#485fc7;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:#3e8ed0;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:#48c78e;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:#ffe08a;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:#f14668;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}@media screen and (max-width:768px){.button.is-responsive.is-small{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.button.is-responsive.is-small{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{right:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(2n){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(2n){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag:not(body).is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;right:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a!important;opacity:.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;right:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:first-child{top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:first-child{transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;right:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link.is-disabled,.pagination-link[disabled],.pagination-next.is-disabled,.pagination-next[disabled],.pagination-previous.is-disabled,.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/py-kms/templates/index.html b/py-kms/templates/index.html new file mode 100644 index 0000000..1db0335 --- /dev/null +++ b/py-kms/templates/index.html @@ -0,0 +1,125 @@ + + + + + py-kms web ui + + + + +

+ + + + + + \ No newline at end of file From 28e07ac7e13c30d335777c98fcbd77171150ae66 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Sun, 11 Dec 2022 17:51:38 +0100 Subject: [PATCH 114/154] Added sub-page for license information --- py-kms/pykms_WebUI.py | 30 +++++--- py-kms/static/LICENSE | 1 - py-kms/templates/base.html | 35 ++++++++++ py-kms/templates/clients.html | 101 +++++++++++++++++++++++++++ py-kms/templates/index.html | 125 ---------------------------------- py-kms/templates/license.html | 11 +++ 6 files changed, 168 insertions(+), 135 deletions(-) delete mode 120000 py-kms/static/LICENSE create mode 100644 py-kms/templates/base.html create mode 100644 py-kms/templates/clients.html delete mode 100644 py-kms/templates/index.html create mode 100644 py-kms/templates/license.html diff --git a/py-kms/pykms_WebUI.py b/py-kms/pykms_WebUI.py index 7f8b576..1030b67 100644 --- a/py-kms/pykms_WebUI.py +++ b/py-kms/pykms_WebUI.py @@ -2,14 +2,19 @@ from flask import Flask, render_template from pykms_Sql import sql_get_all -app = Flask('pykms_webui') - -start_time = datetime.datetime.now() serve_count = 0 def _random_uuid(): return str(uuid.uuid4()).replace('-', '_') +def _get_serve_count(): + return serve_count + +app = Flask('pykms_webui') +app.jinja_env.globals['start_time'] = datetime.datetime.now() +app.jinja_env.globals['get_serve_count'] = _get_serve_count +app.jinja_env.globals['random_uuid'] = _random_uuid + @app.route('/') def root(): global serve_count @@ -33,13 +38,20 @@ def root(): countClientsWindows = len([c for c in clients if c['applicationId'] == 'Windows']) if clients else 0 countClientsOffice = countClients - countClientsWindows return render_template( - 'index.html', - start_time=start_time.isoformat(), + 'clients.html', error=error, clients=clients, count_clients=countClients, count_clients_windows=countClientsWindows, - count_clients_office=countClientsOffice, - serve_count=serve_count, - random_uuid=_random_uuid - ) \ No newline at end of file + count_clients_office=countClientsOffice + ) + +@app.route('/license') +def license(): + global serve_count + serve_count += 1 + with open('../LICENSE', 'r') as f: + return render_template( + 'license.html', + license=f.read() + ) \ No newline at end of file diff --git a/py-kms/static/LICENSE b/py-kms/static/LICENSE deleted file mode 120000 index 30cff74..0000000 --- a/py-kms/static/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../LICENSE \ No newline at end of file diff --git a/py-kms/templates/base.html b/py-kms/templates/base.html new file mode 100644 index 0000000..28c22ce --- /dev/null +++ b/py-kms/templates/base.html @@ -0,0 +1,35 @@ + + + + + py-kms {% block title %}{% endblock %} + + + + +
+ {% block content %}{% endblock %} +
+ +
+
+

+ py-kms is online since {{ start_time }}. + This instance was accessed {{ get_serve_count() }} times. View this softwares license here. +

+
+
+ + + + \ No newline at end of file diff --git a/py-kms/templates/clients.html b/py-kms/templates/clients.html new file mode 100644 index 0000000..d1e6e29 --- /dev/null +++ b/py-kms/templates/clients.html @@ -0,0 +1,101 @@ +{% extends 'base.html' %} + +{% block title %}clients{% endblock %} + +{% block style %} + pre.clientMachineId { + overflow-x: auto; + padding: 0.5em; + } + th { + white-space: nowrap; + } +{% endblock %} + +{% block content %} +{% if error %} +
+
+ Whoops! Something went wrong... +
+
+ {{ error }} +
+
+{% else %} +{% if clients %} + + +
+ + + + + + + + + + + + + + + + {% for client in clients %} + + + + + + + + + + + {% endfor %} + +
Client IDMachine NameApplication IDSKU IDLicense StatusLast SeenKMS EPIDSeen Count
{{ client.clientMachineId }}
+ {% if client.machineName | length > 16 %} + {{ client.machineName | truncate(16, True, '...') }} + {% else %} + {{ client.machineName }} + {% endif %} + {{ client.applicationId }}{{ client.skuId }}{{ client.licenseStatus }}{{ client.lastRequestTime }} + {% if client.kmsEpid | length > 16 %} + {{ client.kmsEpid | truncate(16, True, '...') }} + {% else %} + {{ client.kmsEpid }} + {% endif %} + {{ client.requestCount }}
+{% else %} +
+
+

Whoops?

+
+
+ This page seems to be empty, because no clients are available. Try to use the server with a compartible client to add it to the database. +
+
+{% endif %} +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/py-kms/templates/index.html b/py-kms/templates/index.html deleted file mode 100644 index 1db0335..0000000 --- a/py-kms/templates/index.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - py-kms web ui - - - - -
- {% if error %} -
-
- Whoops! Something went wrong... -
-
- {{ error }} -
-
- {% else %} - {% if clients %} - - -
- - - - - - - - - - - - - - - - {% for client in clients %} - - - - - - - - - - - {% endfor %} - -
Client IDMachine NameApplication IDSKU IDLicense StatusLast SeenKMS EPIDSeen Count
{{ client.clientMachineId }}
- {% if client.machineName | length > 16 %} - {{ client.machineName | truncate(16, True, '...') }} - {% else %} - {{ client.machineName }} - {% endif %} - {{ client.applicationId }}{{ client.skuId }}{{ client.licenseStatus }}{{ client.lastRequestTime }} - {% if client.kmsEpid | length > 16 %} - {{ client.kmsEpid | truncate(16, True, '...') }} - {% else %} - {{ client.kmsEpid }} - {% endif %} - {{ client.requestCount }}
- {% else %} -
-
-

Whoops?

-
-
- This page seems to be empty, because no clients are available. Try to use the server with a compartible client to add it to the database. -
-
- {% endif %} - {% endif %} -
- -
-
-

- py-kms is online since {{ start_time }}. - This page was rendered {{ serve_count }} times. View this softwares license here. -

-
-
- - - - \ No newline at end of file diff --git a/py-kms/templates/license.html b/py-kms/templates/license.html new file mode 100644 index 0000000..be9cca7 --- /dev/null +++ b/py-kms/templates/license.html @@ -0,0 +1,11 @@ +{% extends 'base.html' %} + +{% block title %}license{% endblock %} + +{% block style %} + +{% endblock %} + +{% block content %} +
{{ license }}
+{% endblock %} \ No newline at end of file From 0cb3ee538f2d3202c640bbab199b707ce06eeeb0 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Sun, 11 Dec 2022 20:22:16 +0100 Subject: [PATCH 115/154] Added products sub-page --- py-kms/pykms_WebUI.py | 65 ++++++++++++++++++++++++++++++---- py-kms/templates/base.html | 20 ++++++++++- py-kms/templates/clients.html | 16 +++++---- py-kms/templates/license.html | 8 ++--- py-kms/templates/products.html | 53 +++++++++++++++++++++++++++ 5 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 py-kms/templates/products.html diff --git a/py-kms/pykms_WebUI.py b/py-kms/pykms_WebUI.py index 1030b67..8b2ab06 100644 --- a/py-kms/pykms_WebUI.py +++ b/py-kms/pykms_WebUI.py @@ -1,15 +1,49 @@ import os, uuid, datetime from flask import Flask, render_template from pykms_Sql import sql_get_all +from pykms_DB2Dict import kmsDB2Dict serve_count = 0 def _random_uuid(): return str(uuid.uuid4()).replace('-', '_') +def _increase_serve_count(): + global serve_count + serve_count += 1 + def _get_serve_count(): return serve_count +_kms_items = None +_kms_items_ignored = None +def _get_kms_items_cache(): + global _kms_items, _kms_items_ignored + if _kms_items is None: + _kms_items = {} + _kms_items_ignored = 0 + queue = [kmsDB2Dict()] + while len(queue): + item = queue.pop(0) + if isinstance(item, list): + for i in item: + queue.append(i) + elif isinstance(item, dict): + if 'KmsItems' in item: + queue.append(item['KmsItems']) + elif 'SkuItems' in item: + queue.append(item['SkuItems']) + elif 'Gvlk' in item: + if len(item['Gvlk']): + _kms_items[item['DisplayName']] = item['Gvlk'] + else: + _kms_items_ignored += 1 + #else: + # print(item) + else: + raise NotImplementedError(f'Unknown type: {type(item)}') + return _kms_items, _kms_items_ignored + app = Flask('pykms_webui') app.jinja_env.globals['start_time'] = datetime.datetime.now() app.jinja_env.globals['get_serve_count'] = _get_serve_count @@ -17,8 +51,7 @@ def _get_serve_count(): @app.route('/') def root(): - global serve_count - serve_count += 1 + _increase_serve_count() error = None # Get the db name / path dbPath = None @@ -39,19 +72,39 @@ def root(): countClientsOffice = countClients - countClientsWindows return render_template( 'clients.html', + path='/', error=error, clients=clients, count_clients=countClients, count_clients_windows=countClientsWindows, - count_clients_office=countClientsOffice + count_clients_office=countClientsOffice, + count_projects=len(_get_kms_items_cache()[0]) ) @app.route('/license') def license(): - global serve_count - serve_count += 1 + _increase_serve_count() with open('../LICENSE', 'r') as f: return render_template( 'license.html', + path='/license/', license=f.read() - ) \ No newline at end of file + ) + +@app.route('/products') +def products(): + _increase_serve_count() + items, ignored = _get_kms_items_cache() + countProducts = len(items) + countProductsWindows = len([i for i in items if 'windows' in i.lower()]) + countProductsOffice = len([i for i in items if 'office' in i.lower()]) + return render_template( + 'products.html', + path='/products/', + products=items, + filtered=ignored, + count_products=countProducts, + count_products_windows=countProductsWindows, + count_products_office=countProductsOffice + ) + \ No newline at end of file diff --git a/py-kms/templates/base.html b/py-kms/templates/base.html index 28c22ce..8b9f8d8 100644 --- a/py-kms/templates/base.html +++ b/py-kms/templates/base.html @@ -3,18 +3,36 @@ py-kms {% block title %}{% endblock %} + -
{% block content %}{% endblock %} + + {% if path != '/' %} + + {% endif %}
diff --git a/py-kms/templates/clients.html b/py-kms/templates/clients.html index d1e6e29..5b74d18 100644 --- a/py-kms/templates/clients.html +++ b/py-kms/templates/clients.html @@ -3,13 +3,9 @@ {% block title %}clients{% endblock %} {% block style %} - pre.clientMachineId { - overflow-x: auto; - padding: 0.5em; - } - th { - white-space: nowrap; - } +th { + white-space: nowrap; +} {% endblock %} {% block content %} @@ -43,6 +39,12 @@

{{ count_clients_office }}

+
+
+

Products

+

{{ count_projects }}

+
+

diff --git a/py-kms/templates/license.html b/py-kms/templates/license.html index be9cca7..34ef0d7 100644 --- a/py-kms/templates/license.html +++ b/py-kms/templates/license.html @@ -2,10 +2,8 @@ {% block title %}license{% endblock %} -{% block style %} - -{% endblock %} - {% block content %} -
{{ license }}
+
+
{{ license }}
+
{% endblock %} \ No newline at end of file diff --git a/py-kms/templates/products.html b/py-kms/templates/products.html new file mode 100644 index 0000000..9665304 --- /dev/null +++ b/py-kms/templates/products.html @@ -0,0 +1,53 @@ +{% extends 'base.html' %} + +{% block title %}clients{% endblock %} + +{% block content %} + + +
+ + + + + + + + + + {% for name, gvlk in products | dictsort %} + {% if gvlk %} + + + + + {% endif %} + {% endfor %} + +
NameGVLK
{{ name }}
{{ gvlk }}
+{% endblock %} \ No newline at end of file From ca7ba465079dc226785e56a29ee6539016d19fbc Mon Sep 17 00:00:00 2001 From: simonmicro Date: Sun, 11 Dec 2022 20:22:34 +0100 Subject: [PATCH 116/154] Fixed missing primary key --- py-kms/pykms_Sql.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-kms/pykms_Sql.py b/py-kms/pykms_Sql.py index ceb57dd..841c557 100644 --- a/py-kms/pykms_Sql.py +++ b/py-kms/pykms_Sql.py @@ -24,7 +24,7 @@ def sql_initialize(dbName): try: con = sqlite3.connect(dbName) cur = con.cursor() - cur.execute("CREATE TABLE clients(clientMachineId TEXT PRIMARY KEY, machineName TEXT, applicationId TEXT, skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER)") + cur.execute("CREATE TABLE clients(clientMachineId TEXT , machineName TEXT, applicationId TEXT, skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER, PRIMARY KEY(clientMachineId, applicationId))") except sqlite3.Error as e: pretty_printer(log_obj = loggersrv.error, to_exit = True, put_text = "{reverse}{red}{bold}Sqlite Error: %s. Exiting...{end}" %str(e)) From 5674e2697941b05783ca49c37f9079891ae376c0 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Sun, 11 Dec 2022 21:56:08 +0100 Subject: [PATCH 117/154] Added new webui support into docker --- docker/docker-py3-kms-minimal/Dockerfile | 3 +-- docker/docker-py3-kms/Dockerfile | 4 +++- docker/start.py | 19 +++++++++++++++++-- py-kms/pykms_WebUI.py | 2 +- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 789d562..883d12e 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -12,9 +12,7 @@ ENV HWID RANDOM ENV LOGLEVEL INFO ENV LOGFILE STDOUT ENV LOGSIZE "" -ENV TYPE MINIMAL -COPY ./py-kms /home/py-kms COPY docker/docker-py3-kms-minimal/requirements.txt /home/py-kms/requirements.txt RUN apk add --no-cache --update \ bash \ @@ -30,6 +28,7 @@ bash \ # Fix undefined timezone, in case the user did not mount the /etc/localtime && ln -sf /usr/share/zoneinfo/UTC /etc/localtime +COPY ./py-kms /home/py-kms COPY docker/entrypoint.py /usr/bin/entrypoint.py COPY docker/start.py /usr/bin/start.py diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 70a5b9b..83f8934 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -14,7 +14,6 @@ ENV LOGFILE STDOUT ENV LOGSIZE "" ENV TZ America/Chicago -COPY py-kms /home/py-kms/ COPY docker/docker-py3-kms/requirements.txt /home/py-kms/ RUN apk add --no-cache --update \ bash \ @@ -33,14 +32,17 @@ RUN apk add --no-cache --update \ # Fix undefined timezone, in case the user did not mount the /etc/localtime && ln -sf /usr/share/zoneinfo/UTC /etc/localtime +COPY py-kms /home/py-kms/ COPY docker/entrypoint.py /usr/bin/entrypoint.py COPY docker/start.py /usr/bin/start.py +COPY LICENSE /LICENSE RUN chmod 755 /usr/bin/entrypoint.py WORKDIR /home/py-kms EXPOSE ${PORT}/tcp +EXPOSE 8080/tcp HEALTHCHECK --interval=5m --timeout=3s --start-period=10s --retries=4 CMD echo | nc -z ${IP%% *} ${PORT} || exit 1 diff --git a/docker/start.py b/docker/start.py index f164fa7..0b2701f 100644 --- a/docker/start.py +++ b/docker/start.py @@ -28,8 +28,11 @@ listen_ip = os.environ.get('IP', '::').split() listen_port = os.environ.get('PORT', '1688') - def start_kms(): + # Make sure the full path to the db exists + if not os.path.exists(os.path.dirname(dbPath)): + os.makedirs(os.path.dirname(dbPath), exist_ok=True) + # Build the command to execute command = [PYTHON3, '-u', 'pykms_Server.py', listen_ip[0], listen_port] for (arg, env) in argumentVariableMapping.items(): @@ -41,10 +44,22 @@ def start_kms(): for i in range(1, len(listen_ip)): command.append("-n") command.append(listen_ip[i] + "," + listen_port) + command.append('-s') + command.append(dbPath) loggersrv.debug("server_cmd: %s" % (" ".join(str(x) for x in command).strip())) pykms_process = subprocess.Popen(command) + try: + time.sleep(2) # Wait for the server to start up + pykms_webui_env = os.environ.copy() + pykms_webui_env['PYKMS_SQLITE_DB_PATH'] = dbPath + pykms_webui_env['PORT'] = '8080' + pykms_webui_env['PYKMS_LICENSE_PATH'] = '/LICENSE' + pykms_webui_process = subprocess.Popen(['gunicorn', '--log-level', os.environ.get('LOGLEVEL'), 'pykms_WebUI:app'], env=pykms_webui_env) + except Exception as e: + loggersrv.error("Failed to start webui: %s" % e) + try: pykms_process.wait() except Exception: @@ -52,7 +67,7 @@ def start_kms(): pass except KeyboardInterrupt: pass - + pykms_webui_process.terminate() pykms_process.terminate() diff --git a/py-kms/pykms_WebUI.py b/py-kms/pykms_WebUI.py index 8b2ab06..2a61341 100644 --- a/py-kms/pykms_WebUI.py +++ b/py-kms/pykms_WebUI.py @@ -84,7 +84,7 @@ def root(): @app.route('/license') def license(): _increase_serve_count() - with open('../LICENSE', 'r') as f: + with open(os.environ.get('PYKMS_LICENSE_PATH', '../LICENSE'), 'r') as f: return render_template( 'license.html', path='/license/', From 37d09c679777bd1c8db1f1d7f8581c6faf09f777 Mon Sep 17 00:00:00 2001 From: simonmicro Date: Sun, 11 Dec 2022 22:00:05 +0100 Subject: [PATCH 118/154] Updated install instructions --- docs/Getting Started.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Getting Started.md b/docs/Getting Started.md index a562527..b3928fb 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -162,10 +162,10 @@ They might be useful to you: - Python 3.x. - If the `tzlocal` module is installed, the "Request Time" in the verbose output will be converted into local time. Otherwise, it will be in UTC. - It can use the `sqlite3` module, storing activation data in a database so it can be recalled again. -- Installation example on Ubuntu / Mint: +- Installation example on Ubuntu / Mint (`requirements.txt` is from the sources): - `sudo apt-get update` - - `sudo apt-get install python3-tk python3-pip` - - `sudo pip3 install tzlocal pysqlite3` (on Ubuntu Server 22, you'll need `pysqlite3-binary` - see [this issue](https://github.com/Py-KMS-Organization/py-kms/issues/76)) + - `sudo apt-get install python3-pip` + - `pip3 install -r requirements.txt` (on Ubuntu Server 22, you'll need `pysqlite3-binary` - see [this issue](https://github.com/Py-KMS-Organization/py-kms/issues/76)) ### Startup A Linux user with `ip addr` command can get his KMS IP (Windows users can try `ipconfig /all`). From 460a714f2d60dcc21a621a0156035e5def8c786e Mon Sep 17 00:00:00 2001 From: simonmicro Date: Sun, 11 Dec 2022 22:02:04 +0100 Subject: [PATCH 119/154] Fixed inaccessible products without clients --- py-kms/templates/clients.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py-kms/templates/clients.html b/py-kms/templates/clients.html index 5b74d18..fb3340b 100644 --- a/py-kms/templates/clients.html +++ b/py-kms/templates/clients.html @@ -19,7 +19,6 @@ {% else %} -{% if clients %}

C*H|lr0 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%0A+Gv_MfV*t=W+X%z60NCqkhya!4 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 z