[jenkins-ci PATCH 0/8] lcitool: Support MinGW cross-build Dockerfiles
by Andrea Bolognani
More details in the commit message for patch 7/8.
Pavel pointed out today that the current method of triggering MinGW
builds using our CI scaffolding, eg.
$ make ci-build@fedora-30 CI_CONFIGURE=mingw64-configure
is easy to get wrong and not very discoverable, so I took that as
motivation to implement a change that I had been thinking about for
a long time anyway. The new usage will be
$ make ci-build@fedora-30-cross-mingw64
which aligns with how we're already doing cross-builds for other
architectures and is discoverable via 'make ci-list-images'.
The implementation is not the prettiest, but the Dockerfile
generator in general could use some love so I don't think this
improvement should be blocked because of that; I'll try to spend
some time refactoring and cleaning up once this has been merged.
Andrea Bolognani (8):
lcitool: Introduce cross_arch local variable
lcitool: Change check for pip_pkgs formatting
lcitool: Separate computation and formatting
lcitool: Introduce _dockerfile_format()
lcitool: Introduce _dockerfile_build_varmap()
lcitool: Add RPM-specific _dockerfile_build_varmap() variant
lcitool: Support MinGW cross-build Dockerfiles on Fedora
lcitool: Add more checks to _action_dockerfile()
guests/lcitool | 219 ++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 172 insertions(+), 47 deletions(-)
--
2.24.1
4 years, 10 months
[PATCH] storage: Add support to set{uid,gid} and sticky bit
by Julio Faracco
This commit add more features to storages that supports setuid, setgid
and sticky bit. This extend some permission levels of volumes when you
run an hypervisor using a specific user that can run but cannot delete
volumes for instance. Additionally, when you create a directory without
`pool-build` command, you cannot import those extra permissions.
Example:
# mkdir /var/lib/libvirt/images/
# chmod 0755 /var/lib/libvirt/images/
# chmod u+s /var/lib/libvirt/images/
# pool-start default
# pool-dumpxml default
No setuid from `<mode>0755</mode>`.
Output should expect `<mode>4755</mode>`.
Signed-off-by: Julio Faracco <jcfaracco(a)gmail.com>
---
src/conf/storage_conf.c | 11 ++++++++---
src/storage/storage_util.c | 12 ++++++++----
2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 252d28cbfb..54e4a60ded 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -746,7 +746,7 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt,
if ((mode = virXPathString("string(./mode)", ctxt))) {
int tmp;
- if (virStrToLong_i(mode, NULL, 8, &tmp) < 0 || (tmp & ~0777)) {
+ if (virStrToLong_i(mode, NULL, 8, &tmp) < 0 || (tmp & ~07777)) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("malformed octal mode"));
goto error;
@@ -1187,9 +1187,14 @@ virStoragePoolDefFormatBuf(virBufferPtr buf,
def->target.perms.label) {
virBufferAddLit(buf, "<permissions>\n");
virBufferAdjustIndent(buf, 2);
- if (def->target.perms.mode != (mode_t) -1)
- virBufferAsprintf(buf, "<mode>0%o</mode>\n",
+ if (def->target.perms.mode != (mode_t) -1) {
+ if (def->target.perms.mode & (S_ISUID | S_ISGID | S_ISVTX))
+ virBufferAsprintf(buf, "<mode>%4o</mode>\n",
def->target.perms.mode);
+ else
+ virBufferAsprintf(buf, "<mode>0%o</mode>\n",
+ def->target.perms.mode);
+ }
if (def->target.perms.uid != (uid_t) -1)
virBufferAsprintf(buf, "<owner>%d</owner>\n",
(int) def->target.perms.uid);
diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
index c2754dbb93..5352ab9120 100644
--- a/src/storage/storage_util.c
+++ b/src/storage/storage_util.c
@@ -82,6 +82,10 @@ VIR_LOG_INIT("storage.storage_util");
# define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
#endif
+#ifndef S_IALLUGO
+# define S_IALLUGO (S_ISUID | S_ISGID | S_ISVTX | S_IRWXUGO)
+#endif
+
/* virStorageBackendNamespaceInit:
* @poolType: virStoragePoolType
* @xmlns: Storage Pool specific namespace callback methods
@@ -512,7 +516,7 @@ virStorageBackendCreateExecCommand(virStoragePoolObjPtr pool,
virCommandSetUID(cmd, vol->target.perms->uid);
virCommandSetGID(cmd, vol->target.perms->gid);
- virCommandSetUmask(cmd, S_IRWXUGO ^ mode);
+ virCommandSetUmask(cmd, S_IALLUGO ^ mode);
if (virCommandRun(cmd, NULL) == 0) {
/* command was successfully run, check if the file was created */
@@ -523,7 +527,7 @@ virStorageBackendCreateExecCommand(virStoragePoolObjPtr pool,
* If that doesn't match what we expect, then let's try to
* re-open the file and attempt to force the mode change.
*/
- if (mode != (st.st_mode & S_IRWXUGO)) {
+ if (mode != (st.st_mode & S_IALLUGO)) {
VIR_AUTOCLOSE fd = -1;
int flags = VIR_FILE_OPEN_FORK | VIR_FILE_OPEN_FORCE_MODE;
@@ -569,7 +573,7 @@ virStorageBackendCreateExecCommand(virStoragePoolObjPtr pool,
goto cleanup;
}
- if (mode != (st.st_mode & S_IRWXUGO) &&
+ if (mode != (st.st_mode & S_IALLUGO) &&
chmod(vol->target.path, mode) < 0) {
virReportSystemError(errno,
_("cannot set mode of '%s' to %04o"),
@@ -1825,7 +1829,7 @@ virStorageBackendUpdateVolTargetInfoFD(virStorageSourcePtr target,
if (!target->perms && VIR_ALLOC(target->perms) < 0)
return -1;
- target->perms->mode = sb->st_mode & S_IRWXUGO;
+ target->perms->mode = sb->st_mode & S_IALLUGO;
target->perms->uid = sb->st_uid;
target->perms->gid = sb->st_gid;
--
2.20.1
4 years, 10 months
[PATCH 0/7] util: More storage file detection cleanups
by Peter Krempa
Found while investigating options of how to improve image detection.
Peter Krempa (7):
tests: virstorage: Fix backing file format of created image
virStorageSourceUpdateCapacity: Drop 'probe' argument
util: storage: Store backing store format in virStorageSource
virStorageSourceNewFromBacking: Also transfer the format
virStorageBackendGlusterRefreshVol: Refactor handling of backing store
virStorageFileGetMetadataFromBuf: Remove 'backingFormat' argument
virStorageFileGetMetadataFromFD: Remove unused 'backingFormat'
argument
src/qemu/qemu_driver.c | 2 +-
src/storage/storage_backend_gluster.c | 12 ++---
src/storage/storage_util.c | 8 +--
src/util/virstoragefile.c | 75 +++++++++------------------
src/util/virstoragefile.h | 10 ++--
tests/virstoragetest.c | 2 +-
6 files changed, 36 insertions(+), 73 deletions(-)
--
2.24.1
4 years, 10 months
[libvirt PATCH] bhyve: command: remove unused includes
by Ján Tomko
These were needed for virBhyveTapGetRealDeviceName
but were not deleted after the function was moved
to src/util.
Signed-off-by: Ján Tomko <jtomko(a)redhat.com>
Fixes: a1bd8d2546c3e469f6a5ce119fad7da1cd473db5
---
Pushed as trivial.
src/bhyve/bhyve_command.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
index 2df7b60115..03bb99d496 100644
--- a/src/bhyve/bhyve_command.c
+++ b/src/bhyve/bhyve_command.c
@@ -21,10 +21,6 @@
#include <config.h>
-#include <sys/types.h>
-#include <net/if.h>
-#include <net/if_tap.h>
-
#include "bhyve_capabilities.h"
#include "bhyve_command.h"
#include "bhyve_domain.h"
--
2.24.1
4 years, 10 months
[libvirt PATCH] syms: fix comment for domain_driver.h
by Ján Tomko
Signed-off-by: Ján Tomko <jtomko(a)redhat.com>
Fixes: 8595948bc855bc5fb65c8362a5e5832a30f97f7e
---
Pushed as trivial.
src/libvirt_private.syms | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 28a3553bcf..907cef2390 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1397,7 +1397,7 @@ virDomainCgroupSetupDomainBlkioParameters;
virDomainCgroupSetupMemtune;
-# hypervisor/domain_cgroup.h
+# hypervisor/domain_driver.h
virDomainDriverMergeBlkioDevice;
virDomainDriverParseBlkioDeviceStr;
virDomainDriverSetupPersistentDefBlkioParams;
--
2.24.1
4 years, 10 months
[PATCH v2 00/14] vircgroup code duplication purge
by Daniel Henrique Barboza
Based on the feedback from version 1 [1], we can't put cross
directory dependencies in the utils files, but ATM we have no
good spot to put common driver code as well.
The solution then was to add a new directory structure, as proposed in
[2], to put the common cgroup and driver code between LXC and QEMU
into.
changes from v1:
- introduced src/hypervisor/domain_cgroup.c/h. Cgroup duplicated
code that depends on /conf includes now goes to this file
- introduced src/hypervisor/domain_driver.c/h. Common driver
code now goes to this file instead of putting more stuff in
domain_conf.c
[1] https://www.redhat.com/archives/libvir-list/2020-February/msg00425.html
[2] https://www.redhat.com/archives/libvir-list/2019-December/msg00817.html
Daniel Henrique Barboza (14):
vircgroup.c: adding virCgroupSetupBlkioDevice* helpers
lxc,qemu: use virCgroupSetupBlkioDevice* helpers
vircgroup.c: turn virCgroup{Get/Set}BlkioDevice* into static
src: introducing hypervisor/domain_cgroup.c
domain_cgroup.c: add virDomainCgroupSetupMemtune()
vircgroup.c: add virCgroupSetupCpusetCpus()
vircgroup.c: add virCgroupSetupCpuShares()
vircgroup.c: add virCgroupSetupCpuPeriodQuota()
src/hypervisor: introduce domain_driver.c
domain_driver.c: add virDomainDriverParseBlkioDeviceStr()
domain_cgroup.c: add virDomainCgroupSetupDomainBlkioParameters()
domain_driver.c: add virDomainDriverSetupPersistentDefBlkioParams()
domain_cgroup.c: add virDomainCgroupSetMemoryLimitParameters()
vircgroup: add virCgroupGetCpuPeriodQuota()
po/POTFILES.in | 2 +
src/Makefile.am | 1 +
src/hypervisor/Makefile.inc.am | 16 ++
src/hypervisor/domain_cgroup.c | 268 ++++++++++++++++++++
src/hypervisor/domain_cgroup.h | 38 +++
src/hypervisor/domain_driver.c | 252 +++++++++++++++++++
src/hypervisor/domain_driver.h | 36 +++
src/libvirt_private.syms | 32 ++-
src/lxc/Makefile.inc.am | 2 +
src/lxc/lxc_cgroup.c | 91 +------
src/lxc/lxc_driver.c | 430 ++-------------------------------
src/qemu/Makefile.inc.am | 1 +
src/qemu/qemu_cgroup.c | 112 +--------
src/qemu/qemu_driver.c | 401 +-----------------------------
src/util/vircgroup.c | 212 ++++++++++++++--
src/util/vircgroup.h | 53 ++--
16 files changed, 894 insertions(+), 1053 deletions(-)
create mode 100644 src/hypervisor/Makefile.inc.am
create mode 100644 src/hypervisor/domain_cgroup.c
create mode 100644 src/hypervisor/domain_cgroup.h
create mode 100644 src/hypervisor/domain_driver.c
create mode 100644 src/hypervisor/domain_driver.h
--
2.24.1
4 years, 10 months
[libvirt PATCH] fix paths to openrc.init.in files
by Ján Tomko
The inc.am Makfiles are included by src/Makefile.am.
Adjust the paths added to OPENRC_INIT_FILES_IN
accordingly.
Signed-off-by: Ján Tomko <jtomko(a)redhat.com>
Fixes: f4b1c020a2c8493473bf868231cee6a952d57e6f
---
Pushed as a build fix.
src/locking/Makefile.inc.am | 2 +-
src/logging/Makefile.inc.am | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/locking/Makefile.inc.am b/src/locking/Makefile.inc.am
index d0e36705b2..d1bf49cd3f 100644
--- a/src/locking/Makefile.inc.am
+++ b/src/locking/Makefile.inc.am
@@ -83,7 +83,7 @@ OPENRC_INIT_FILES += \
virtlockd.init \
$(NULL)
OPENRC_INIT_FILES_IN += \
- virtlockd.init.in \
+ locking/virtlockd.init.in \
$(NULL)
noinst_LTLIBRARIES += libvirt_driver_lock.la
diff --git a/src/logging/Makefile.inc.am b/src/logging/Makefile.inc.am
index 083d8773cb..dc09cfe3fa 100644
--- a/src/logging/Makefile.inc.am
+++ b/src/logging/Makefile.inc.am
@@ -59,7 +59,7 @@ OPENRC_INIT_FILES += \
virtlogd.init \
$(NULL)
OPENRC_INIT_FILES_IN += \
- virtlogd.init.in \
+ logging/virtlogd.init.in \
$(NULL)
noinst_LTLIBRARIES += libvirt_driver_log.la
--
2.24.1
4 years, 10 months
Re: [PATCH] Add missing files for OpenRC
by Michal Prívozník
On 2/22/20 4:04 PM, Ryan Moeller wrote:
> On Sat, Feb 22, 2020 at 9:24 AM Michal Prívozník <mprivozn(a)redhat.com> wrote:
>>
>> However, I have done fixes locally. How do you feel about me squashing
>> this in and then pushing?
>>
>
> That sounds terrific! Thank you :)
>
Alright then. Squashed in, and pushed.
Reviewed-by: Michal Privoznik <mprivozn(a)redhat.com>
Congratulations on your first libvirt contribution!
Michal
4 years, 10 months
[PATCH] Add missing files for OpenRC
by Ryan Moeller
Signed-off-by: Ryan Moeller <ryan(a)iXsystems.com>
---
src/locking/Makefile.inc.am | 7 +++++++
src/locking/virtlockd.init.in | 14 ++++++++++++++
src/logging/Makefile.inc.am | 10 ++++++++++
src/logging/virtlogd.init.in | 14 ++++++++++++++
4 files changed, 45 insertions(+)
create mode 100644 src/locking/virtlockd.init.in
create mode 100644 src/logging/virtlogd.init.in
diff --git a/src/locking/Makefile.inc.am b/src/locking/Makefile.inc.am
index e663d7146b..243e3ae767 100644
--- a/src/locking/Makefile.inc.am
+++ b/src/locking/Makefile.inc.am
@@ -79,6 +79,13 @@ VIRTLOCKD_UNIT_FILES_IN = \
SYSTEMD_UNIT_FILES += $(notdir $(VIRTLOCKD_UNIT_FILES_IN:%.in=%))
SYSTEMD_UNIT_FILES_IN += $(VIRTLOCKD_UNIT_FILES_IN)
+OPENRC_INIT_FILES += \
+ virtlockd.init \
+ $(NULL)
+OPENRC_INIT_FILES_IN += \
+ virtlockd.init.in \
+ $(NULL)
+
noinst_LTLIBRARIES += libvirt_driver_lock.la
libvirt_la_BUILT_LIBADD += libvirt_driver_lock.la
diff --git a/src/locking/virtlockd.init.in b/src/locking/virtlockd.init.in
new file mode 100644
index 0000000000..45eaed7971
--- /dev/null
+++ b/src/locking/virtlockd.init.in
@@ -0,0 +1,14 @@
+#!/sbin/openrc-run
+
+name=virtlogd
+
+command=@sbindir@/virtlockd
+pidfile="@runstatedir(a)/virtlockd.pid"
+command_args="--daemon --pid-file=${pidfile}"
+PATH="${PATH}:@sbindir@:@bindir@"
+supervisor=supervise-daemon
+
+depend() {
+ provide virtlockd
+ keyword -shutdown
+}
diff --git a/src/logging/Makefile.inc.am b/src/logging/Makefile.inc.am
index c4fa49106e..083d8773cb 100644
--- a/src/logging/Makefile.inc.am
+++ b/src/logging/Makefile.inc.am
@@ -55,6 +55,13 @@ VIRTLOGD_UNIT_FILES_IN = \
SYSTEMD_UNIT_FILES += $(notdir $(VIRTLOGD_UNIT_FILES_IN:%.in=%))
SYSTEMD_UNIT_FILES_IN += $(VIRTLOGD_UNIT_FILES_IN)
+OPENRC_INIT_FILES += \
+ virtlogd.init \
+ $(NULL)
+OPENRC_INIT_FILES_IN += \
+ virtlogd.init.in \
+ $(NULL)
+
noinst_LTLIBRARIES += libvirt_driver_log.la
libvirt_la_BUILT_LIBADD += libvirt_driver_log.la
@@ -126,6 +133,9 @@ logging/log_daemon_dispatch_stubs.h: $(LOG_PROTOCOL) \
virLogManagerProtocol VIR_LOG_MANAGER_PROTOCOL \
$(LOG_PROTOCOL) > logging/log_daemon_dispatch_stubs.h
+virtlogd.init: logging/virtlogd.init.in $(top_builddir)/config.status
+ $(AM_V_GEN)$(SED) $(COMMON_UNIT_VARS) $< > $@-t && mv $@-t $@
+
virtlogd.service: logging/virtlogd.service.in $(top_builddir)/config.status
$(AM_V_GEN)sed $(COMMON_UNIT_VARS) $< > $@-t && mv $@-t $@
diff --git a/src/logging/virtlogd.init.in b/src/logging/virtlogd.init.in
new file mode 100644
index 0000000000..61e41f7689
--- /dev/null
+++ b/src/logging/virtlogd.init.in
@@ -0,0 +1,14 @@
+#!/sbin/openrc-run
+
+name=virtlogd
+
+command=@sbindir@/virtlogd
+pidfile="@runstatedir(a)/virtlogd.pid"
+command_args="--daemon --pid-file=${pidfile}"
+PATH="${PATH}:@sbindir@:@bindir@"
+supervisor=supervise-daemon
+
+depend() {
+ provide virtlogd
+ keyword -shutdown
+}
--
2.24.1
4 years, 10 months
[jenkins-ci PATCH] guests: Update vault
by Andrea Bolognani
Add secrets for libvirt-centos-8, libvirt-opensuse-151,
libvirt-ubuntu-1604 and libvirt-ubuntu-1804 Jenkins builders.
Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
---
Pushed under the unreviewable vault update rule.
guests/vars/vault.yml | 100 +++++++++++++++++++++++++-----------------
1 file changed, 59 insertions(+), 41 deletions(-)
diff --git a/guests/vars/vault.yml b/guests/vars/vault.yml
index b6e591d..f1ee165 100644
--- a/guests/vars/vault.yml
+++ b/guests/vars/vault.yml
@@ -1,42 +1,60 @@
$ANSIBLE_VAULT;1.1;AES256
-65623833636335376266323136336664373431636637626132386363623335383730353431353066
-3037623836326161356332663335383132336432376132330a346664316165636132653830373939
-61653035306563323135303962343336383161336238623130653865303933626165303239616338
-3965636431663438310a343661323736343030323665346463316332333239323465313366333461
-38633833333230316435663131336161303638366462663236376364313631313463366635396332
-63366636653533653663343234633961633234323431656361373038616638316338363930363761
-31376237636262336435386339303139363966343337303564373530396630303062343431616161
-34353034393061396635323236663438316137396661626337353439353363353866346630323433
-39623764313535623331313232623464356439363037363436346232386333633834306630346632
-39343934343238626333323762353863316465303930653130656261643538393438333038666532
-38366464666362643236376335393032353138393833376362666233323930383963356531303535
-66326266623038373238366338306439306239633836346162303261646638353933643965376236
-66376630363035633663376339363132323836636436663565376537326235333531323632613333
-62333932633235336161333331373266326231626331383837343433633133623762633034363932
-30653433346634646232363966383433393131656364336532653135373862633562343230616466
-32633434323963363138666533623930666566393831643133353731646335343466306237376634
-34336133333131373134653438333766326432613636643938353966643336643663363763646230
-63636165663734643930323932643066663737383961346530653166313439663363363332373638
-63643364373137366261626366366435373034333065396236383737323265333435316166303336
-37333432336530616137663931643430303261653433366639633137656261616134326337346566
-37623036393766636631333766613134363135383434343737306339393061383737373832303033
-34393834373365336239323431646363636134653738393634613134363863663765666565303535
-30316331333437373264636265633364656163306533346339343262646465343465373365643962
-38323430613065666331313538353165326336393865346663633764333032363461343961353634
-61313330323639386264323233396465376333306466313562303332376162613739323833343864
-36326430386134323163363134646537386665626666663630663166323336623732373765353939
-64386233663831613736336230363136303539663962623935356436393834383734356164356666
-31366164663836626464333763323230336663633965326364653730393536633036313333336439
-38376638303336333731633037313839306335343364656133666331663862373232306337653638
-30653465366236356463656162336339656337393664666437623264396432303933663232356430
-62373236633936626666343866623936323934666331316632366664323166366362303530643737
-65346463333432613237353034616635366534666133656432383639363632316363343533363333
-33306533393764343963343663653164313033366162383232386636303063623964343337323137
-32316534313938343132653332373938383062646461366562313030623065613930396538613536
-61396230313534626139316165643938643365326133366664363361656631363438633036393733
-64313639623436373666643464626432316566336330646535616132613864316135363039363064
-61353135366530653166636365346237653033616431646635393461306339636662356532323732
-33616630396536636234303230653433386432393130636538313665643338373138393930386539
-64383334326435633666323762353462646264316265666535346134353862656164306331336363
-32303264303038656633613539343438366166343830643337373563636565336331326635613530
-66616235656161346230653031623331333830616164663333613137656636386635
+37333237623832363064323432326164363235616266636532363061616365363934333134376661
+3265306535343462616137356632383537626537366436630a636464303935636664383466663837
+61643362333631383263343461383130663764646433323465353434323935346637343639386334
+3163393931663364390a656436383233383633323964306233306131653164326264643231616339
+62613737663432343630613539306362356664363236396238386532323035393966663038656362
+33623764373139393936633236343033623064343531373239663562376330366139633935613832
+30623862663266383433323937353730313965333835346636326633663838363735373331353434
+37386230653138346333316232316164353938663538623833323839633732663333633031623935
+32393765646439643939623263326538366664393433316165643465333335653736396564656661
+31653834623265326464333333316533636236613766656132363936356335316638383865353266
+65616537306538393661306334336530353639343363313935383134356434346137613234663031
+39363364656561656134643734613737666664386164363663316635313431303337343262326161
+31323937643034653465613734383031623262386336346165383133366534653265346333323564
+61303763363563346537666364373832663466333535633435356562636338323361643666653663
+39336433323234306338393461383233313536373938313633396639656532646235383230636131
+61306462646131623963316165643830613731356639376435363537366236316634306430643338
+61656238373566383436643930303133643532363535346530363461643233313030343635393730
+38613538363166653562633738313962623330653532396431623630336438386435383365623230
+65393962333835363933623833393863343836393865623030346361653234646666616131623738
+30646330353731636238333235663838393762356432353634653036313732366262336230653637
+63303535643363633331326636363063653135386666646264303434396562353138653661633032
+61336237646531376339643765323135373738373161643034386163366538326236323335616230
+63613364323430356237663039393037313237326364346134623830613962613937356235383131
+30383432613432303636393032326534643264663962306539303065623261306538303961653033
+30393734643237623931323738343130626537636366383562646164386137663565323238363364
+35313239313333396461646234643330316266303939306639616631653962386530353331366338
+36613537353464613732393166336532666230643761336263653465353534373866303165373237
+30333633613938343266356334313230343166626638316433353636373835666237303438323065
+66326338326562383537616563313462643534373362653933656164666339346564343331653862
+36393134336233376265616135393063613832393064323265663561623361323637623963616539
+65666630316262376464373038303935346437623138663832623765653165366330323037363934
+61353534646466386535623063343234393865636462343930396366346535363362613130623432
+32623832306430383931393335373664653830386262623337646564633966316464316239366332
+31386132323137396436643764613938313262623661363766363632353561663336393231366632
+35383633356139313031666237313530666264633539343930306534646138396135356464616237
+30326139303338656133386234333034336561323237613131303965383031326262646665393031
+31343236643865373636353437613230386538376133643634363965326334376661643335376136
+35646666333363333161366237653635373565623737653961616232376135363732366662356434
+62373465373931636637346463633038656637393034393835643364303137643738633132313239
+31663065336566373466386636666164396264666634636539616539326539373638616438313737
+37373731643736393431303033613264346364313062333062313930636561633162636466616634
+33313035393264643039373563626466613764653262323064666530326264303633626337333936
+63643465653664373434643530386161653030613734656663613136643161316432366561396439
+66616565366539343966386338356438316263613732306335333734333966383432626565343463
+30343334646463646334383963383465313665353930386435323038313033393639373832353236
+66656537663762663138353363386539373732346238613362333035613431383461646166336332
+62626637663664363931653664303965633139663463396561336364373339623333343966393439
+65353034326166613036336134383062393664313765353062396261376336313631373163656130
+32343038663837393561363264313631656334613236383963333235353864643264383735636537
+37613330616136313632363035653863363936623163663831393935333439373237663432613165
+36653834643739656465343966343731323461616435373562393130663932666339633632656639
+35313835326438623866303362373734363831613661363535656531626165386463613932333363
+37636663623136356334393334623733636563383336326333303738303935613766366633376231
+62373961383463393465623035303439386262623036666632316237363566653161313164343863
+31326532656635633735326165333365646566663365646164636463613261326133363432636238
+32303962656563306134343564383462666563656531326136316662366633636364626463623135
+66323338643735336366326534383161326335616365646533646132613063303037663234353065
+38366234316435393262343535306333363835303139306630643532616536313965383663383961
+633836366539336630316533376133353239
--
2.24.1
4 years, 10 months