From ccae1ee4dfecf462a738ae4fada59a373a445aeb Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Thu, 22 Dec 2016 23:08:57 +0000 Subject: [PATCH] Update isl to isl-0.18-9-gd4734f3 llvm-svn: 290389 --- polly/lib/External/isl/AUTHORS | 3 +- polly/lib/External/isl/ChangeLog | 10 ++ polly/lib/External/isl/GIT_HEAD_ID | 2 +- polly/lib/External/isl/config.guess | 111 ++++++------ polly/lib/External/isl/config.sub | 20 ++- polly/lib/External/isl/configure | 23 ++- polly/lib/External/isl/configure.ac | 4 +- polly/lib/External/isl/doc/manual.pdf | Bin 475429 -> 475433 bytes polly/lib/External/isl/include/isl/ast_build.h | 12 +- polly/lib/External/isl/isl_affine_hull.c | 2 +- polly/lib/External/isl/isl_coalesce.c | 5 +- polly/lib/External/isl/isl_convex_hull.c | 13 +- polly/lib/External/isl/isl_equalities.c | 3 +- polly/lib/External/isl/isl_map.c | 3 + polly/lib/External/isl/isl_output.c | 225 +++++++++++++------------ polly/lib/External/isl/isl_schedule_tree.c | 3 + polly/lib/External/isl/isl_scheduler.c | 3 + polly/lib/External/isl/isl_tab.c | 61 ++++++- polly/lib/External/isl/isl_tab.h | 1 + polly/lib/External/isl/isl_test.c | 61 +++++++ polly/lib/External/isl/ltmain.sh | 6 +- polly/lib/External/isl/m4/libtool.m4 | 1 - 22 files changed, 370 insertions(+), 202 deletions(-) diff --git a/polly/lib/External/isl/AUTHORS b/polly/lib/External/isl/AUTHORS index 671a241..975d5b6 100644 --- a/polly/lib/External/isl/AUTHORS +++ b/polly/lib/External/isl/AUTHORS @@ -23,7 +23,7 @@ isl was written by Domaine de Voluceau - Rocquencourt, B.P. 105 78153 Le Chesnay France -2015 Polly Labs +2015-2016 Polly Labs Contributions by @@ -38,6 +38,7 @@ Andreas Kloeckner Michael Kruse Sebastian Pop Louis-Noel Pouchet +Benoit Pradelle Uday Kumar Reddy Andreas Simbuerger Sven van Haastregt diff --git a/polly/lib/External/isl/ChangeLog b/polly/lib/External/isl/ChangeLog index 14ff1b4..249acdf 100644 --- a/polly/lib/External/isl/ChangeLog +++ b/polly/lib/External/isl/ChangeLog @@ -1,3 +1,13 @@ +version: 0.18 +date: Sun Dec 18 11:01:58 CET 2016 +changes: + - improve elimination of redundant existentially quantified variables + - improve coalescing + - improve parametric integer programming + - preserve isolate option in isl_schedule_node_band_split + - print AST nodes in YAML format + - minor improvements to Python bindings +--- version: 0.17.1 date: Fri May 6 12:02:48 CEST 2016 changes: diff --git a/polly/lib/External/isl/GIT_HEAD_ID b/polly/lib/External/isl/GIT_HEAD_ID index 7ec4914..1c16ff7 100644 --- a/polly/lib/External/isl/GIT_HEAD_ID +++ b/polly/lib/External/isl/GIT_HEAD_ID @@ -1 +1 @@ -isl-0.17.1-314-g3106e8d +isl-0.18-9-gd4734f3 diff --git a/polly/lib/External/isl/config.guess b/polly/lib/External/isl/config.guess index 1659250..0967f2a 100755 --- a/polly/lib/External/isl/config.guess +++ b/polly/lib/External/isl/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2015 Free Software Foundation, Inc. +# Copyright 1992-2016 Free Software Foundation, Inc. -timestamp='2015-08-20' +timestamp='2016-04-02' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ timestamp='2015-08-20' # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2015 Free Software Foundation, Inc. +Copyright 1992-2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -237,6 +237,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; @@ -268,42 +272,42 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 @@ -376,16 +380,16 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build - SUN_ARCH="i386" + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` @@ -410,7 +414,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} @@ -635,13 +639,13 @@ EOF sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi @@ -680,11 +684,11 @@ EOF exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if [ ${HP_ARCH} = hppa2.0w ] then eval $set_cc_for_build @@ -697,12 +701,12 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} @@ -807,14 +811,14 @@ EOF echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) @@ -896,7 +900,7 @@ EOF exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix @@ -919,7 +923,7 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) @@ -965,6 +969,9 @@ EOF ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; @@ -1120,7 +1127,7 @@ EOF # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1269,6 +1276,9 @@ EOF SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux${UNAME_RELEASE} + exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; @@ -1282,9 +1292,9 @@ EOF UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in @@ -1306,7 +1316,7 @@ EOF exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi @@ -1337,7 +1347,7 @@ EOF # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" @@ -1379,7 +1389,7 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos @@ -1390,6 +1400,9 @@ EOF x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; esac cat >&2 <. # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='isl' PACKAGE_TARNAME='isl' -PACKAGE_VERSION='0.17.1' -PACKAGE_STRING='isl 0.17.1' +PACKAGE_VERSION='0.18' +PACKAGE_STRING='isl 0.18' PACKAGE_BUGREPORT='isl-development@googlegroups.com' PACKAGE_URL='' @@ -1375,7 +1375,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures isl 0.17.1 to adapt to many kinds of systems. +\`configure' configures isl 0.18 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1446,7 +1446,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of isl 0.17.1:";; + short | recursive ) echo "Configuration of isl 0.18:";; esac cat <<\_ACEOF @@ -1576,7 +1576,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -isl configure 0.17.1 +isl configure 0.18 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2471,7 +2471,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by isl $as_me 0.17.1, which was +It was created by isl $as_me 0.18, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3335,7 +3335,7 @@ fi # Define the identity of the package. PACKAGE='isl' - VERSION='0.17.1' + VERSION='0.18' cat >>confdefs.h <<_ACEOF @@ -3468,7 +3468,7 @@ fi AM_BACKSLASH='\' -versioninfo=17:1:2 +versioninfo=18:0:3 if test "x$prefix" != "xNONE"; then prefix_wd=`cd $prefix && pwd` @@ -19855,7 +19855,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by isl $as_me 0.17.1, which was +This file was extended by isl $as_me 0.18, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -19921,7 +19921,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -isl config.status 0.17.1 +isl config.status 0.18 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -21186,7 +21186,6 @@ $as_echo X"$file" | cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. diff --git a/polly/lib/External/isl/configure.ac b/polly/lib/External/isl/configure.ac index b6da64d..fabcf06 100644 --- a/polly/lib/External/isl/configure.ac +++ b/polly/lib/External/isl/configure.ac @@ -1,10 +1,10 @@ -AC_INIT([isl], [0.17.1], [isl-development@googlegroups.com]) +AC_INIT([isl], [0.18], [isl-development@googlegroups.com]) AC_CONFIG_AUX_DIR([.]) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([foreign]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) AC_SUBST(versioninfo) -versioninfo=17:1:2 +versioninfo=18:0:3 if test "x$prefix" != "xNONE"; then prefix_wd=`cd $prefix && pwd` diff --git a/polly/lib/External/isl/doc/manual.pdf b/polly/lib/External/isl/doc/manual.pdf index fb5e04309033a168e912847962d603f047be6c07..026db436006e7452baec47e4f87e7d894c59f665 100644 GIT binary patch delta 14252 zcmai3Q*<3bw~lQ#ww=bdZ8WxRoD(OF8r!yw#>Pn+JB@AY_Wxh*x=;6E_L})-X6>0Z z*!W6S>|D+0)Py!07;Cpf05$Ry1gkkP%x6lgan*fz^sp-f&QhdK{7D^4+S% zzhqXSqkhwDncL8o3rq`kF2gaAZfHNx`sGwk@<)geOz$%m3$nrxnL?cfKgN-AUegnY zo2BkcWYJWt6s#QXxe9o6Rpj>86|;x_?I0F9GwdxH#UyaQ|18!k;^i?=3FYf-&u2-D zl*mQdAK@MjD8TgrMf#>c2s|Ww0=^n3}J(bV1ohwS0Mfs$Tl_@C=H0T z1U@LbwputS5HtYz7*6JY!pp&L&p`K-Tncpyf8sOX%2NDTba4{78QUryRF2#H*T9PP zjETZfP5Yrm9>NON87=~xa6cF<)dB2H(X1)eH>u60*nz@{z~T>_hxKidH9K;knGOY!*O|C4zt8XXh-CSf9g6_p+rCMKB$#lM?|dJ zb}pWHk#oQ=r@5FwU`C9hLA8ydL3>jJazeKWX>uvE6n?Z?HFYIb(CGzJEvZmO7gD?Q z26oPoQt@fDdft(90Y^UEpKKy$m%aFTj#_;QDSe z5i{S^wRqmPFX>{0^Uyh+HT@%f-{tddbKT_Er=O?A^Awv^$#BrKy$RH0dzAP-;Edks z?&vN|P1kj>&{+^yj4}q{YLHve5Z3~4{mxd>qpolU;F|q@K5>jZ zW7kYR*vN6_aXXP_G4t2>Bq7s%%69o|(?Nh~$2a$e(y7how=?b1!QM!noWZUa8avzdM$CwrX&^%e+e0>tbtX?57Q&KEiIxkP z$>tm!p4B1Pt)_tjd5kO%Ahg^~2%L3t!2~;a78guzgESB-?Pu}#*B_uG0WszSg^n9| z#2NL$4y}QH<85ZRnMGbVB+e9kSQYiZSPSgq8-HxTYyjArA2h@nDqt+}G#}7A`})<1 zbLzlr)NZzTVNl3|FpOD^Hvhbcu>r@$254Fgxlchdy+CN-+*6$b0BmT1j#AnN=TN?f(O#ZV1bdA`k7<=`^ttxHoAW5TY6? zq%H+Mn#ATX{mjEG{3B3A99Fs1JoSBOlUJ_RYhC_I+u4xc79}f`g@_QYGDlp)NELi} zO$*ivOf$^`@URmSSC`tL%+mmB?O_q=aYR%ZefzuD5@5{-HoDA8>OLp93BC&<=G9P~ zql}Nm13X`;p}$C6ek1g39A{hkOPWTI{+YeMUK-{wphjlR{D~(J>NM&9k=>ct5|TR! zTIoNfjt!Vo7Pxi!s+%K#`A#H;KB(h*IBz{Q*Iknen46(WOO?2Z$jU_fOa1L(uE2av zhSiDql;iDXn4#S28ge+B0(@`)W=U|1f^*Kr-@yQl&cMbL=bPTikAp;;oxkq_ml-g$c;x^C2-a#7UvNrposs-xi84fxsFFF1cs;NyvBq>iu#WSB!Y=65nMiUGnCCq)iE96o&BB759AESd_U#LU0>S zw9EM;f2W?nZnTTcjqTgjBX$@gV*%{Q6$7bQ?8GE}k zKu0jQ6?l)PypCcB%$sp#PZgT3WIh|?=R}kJhS2zje0wCbOR;C#YY55dk<|u~!wH+f z=q>dxUu!rL4!u*F&l?&xxsB%d6F?@Z8 zai#V3GY-5i?Z&K(ikp!R>2oKhKK`Av6}Q{YUOOc_^~WQ7GDWeF;{wj}IJBpG8{t&4 zRSvHo+EMV&zmY^~6}J|1x3WY60R-9PAbK1IL-yC+8JDHmE}eis+HV&)-oAaN_I%wM zCU1c~%$2>kx;Ls`E1dV$URkCo>d5#P>)k&u`c58<3zBRo8iTtO&s|;KxE69gm3wj~E9vSX~VkL_L=h&Y$M7I!m-<a+^x(Xl&R@!SD3_tQTq|$BM4ZtGANW`B_a%9TBvc59SZ0t4Jbm z16}kXV@3@h4|a21{y;Qf2Kdw-xJxb}n3nxDvTFD)uJFfQ=Fj~xQdrVg7^=&48TrQ& zh%I;9F)F@DMya@P{yB#x^z$l_d>D&Fsj%O8G>K>zil0TAF(CNJVycsE8gd!oB;u2J zdT_ZR;pF$d!3hbdZH!S6EktD|F;BnI*Y;yLt!u}wL4+D|VBMcU3_u*o^39`b`u9*W ziQQgT@W~&v>H(TM2yc;_Yj33hS6grhm9{|nu+kcr?BgnBH8kJTzxWSxbS9!ylgPaR z8fQW&5s#R%h%qISkJE2B?(OLetXWT(qjgx5C>-lDzDC2Gp&K}d+DrLlC+@ESoYP=t zhogT&7FPG3H20h@Z~%>31&Xw}stMwb<9^Tx@%Y|B{;x3Mwyw5=sk$!q((` zM4{=Bz&Vl%;^+XIda`coW7xg3bs##jDur@x4zO+OanJJx`{4!32vrm&3=CfwC?2rm znA@{E!{3f*`69!W3e0qx@I5R}FI)5GR;X6z=O3u&Lr>Gws7F_(o~e=f0&{yNr+e+}x2CYOdNNtetF4yZW?le{19Adg7HoUEBfFCnr@yhq z3^Qjo*s0GtBCWoP3rg7!%O`MnoQTBz=oYzBK+TuK8KP|?o}dS-3W z<)oAwilgj>CqJx0UijjY4^3W6Th;v{Wy*PC;G3ghDKv^bgn@&2-{fbuyUl(yP$v1C zPAf?Mco>a~{7D~W?kh2z2R%v<^^JL8QP_D0(}f?PF9Ty`KJIq&9(cBlb`z9%;5zTWb;q<6k;|J1fr<@ z$QW+GUFh_!2Rb@#rvH)rveCuq#NDA&T&>R^d_>a?wLRq&$&RmZ3?zeAKZyjaOhogl z(^dRDQ-)D-dH`WSaFuNE4`?D6Lb>LmK8xPCa@6a=y9rHnVXX(QvH~YT%|)3K5#aaF zB}Z%wT}i*v7iSAw>I@&xXjoL*soZ5Q4KGaP9FCBw!7Gp@^4=G*CBO7M`y zx~x}bk;Hjb-)cpRUddm7^5IHP%I|kWoI2OiayC~S3|ojhix2w(@n-Ycz$jfIDrmT_tjI*lsvx2S70@;fqj2XeKt!5KG}@O8S76@o&{H(rB9n}d9&83c z=dIAE7l6uFc?4pM8wz3+cTbirP3H@Xd(F>|mMGphnW9rf2j*mtvw3V~v2%ZpT;Z#4 z%B3tUG0@nKAK{NbIn?fDl);kfdt$75W0b(UUW!2Xi?j?GWp~%Mtp`{v$DODz%TeSY zJ3_;1A=IVhbmJ_mW|vAY+n%-x@*o2sEU@;=dYeigkQoNDf7*g)b9oqK68aIla)ZnS z<8)KKI{v`X8ZAhs|I~PGXCbMe{uUp?5}X61TK0H><6GfL81c~JRx*?ZVHb1O-G)at zq1mvzRRgbD9aZwwfzbocLf2}QKkxBvyXvEt#q9YD!gO(lVd+_p5~rDKtw#XUgxv)5 z>6M&kVCo=ontAm&X%*q$mvGT-?jpt?H0pxqu~`vc!O*1Y2w^F0{+O?W1yjBszl;~U z$6RkRi(Ch|g$i=X<>vR}L9+$EuGo3e65}?6O7k+q;+y-KMUHX-YrF}n*+gVF@jIC? zh%i4o8qWsysWitf6x~_%SD*leTo!yhd&UiWxa%l7w|0hny7q`&b`>@qHBkinX0tec4$&B>&{`T=Pi}tL`rFg}4l2%tLVxBW``3)inh&KAD2^ zx;Lm9vMFbbKaeX4ZB>PopMwX(gS?o0n!2|{GneG!I`0CPbTA`tW9Wc4^l2+Yh;QJA z6oFKxk6u>1Bn%N&QAqZX3`!r`rA+YqZ}6n^;io#)jX_n0CUXVe`Kjs?FD%sCE&&q8Eh(#It;<#v#G2pg> zG`Yi!-VwdMoX26s7ZCyKwNIp{9^xJYl+0Fn=R_ty?s%wR`ykL!1zonR7;t%k z>#M%g>3o6Qq=fSb*>#PMPqB4q;Jn|$^!t`4JbBUI1I#=nct5@IDS8OTVF6nkrR5$Y0Agv!Te}^U<{szo7Gn6|M z^1*9>kOoQ)ms`ud0-wvG&!UB`ZmQ~yJGQq9q%QQg?@Q_*7`!C7!ejEZ(Jt0zh-`LPUY2Ya=ed9#I`v@W^#na;>d zX{zD2<5C3xs<&o%O$6@KO0b9VY@4QH91W~$cfqWP_#%ksJng08uK5VtuIc08Nr1j; z?uzCh zAZOHCI^9dIyQ9)SaUcMfaZZIobC#*hPHt z46$MI{dgReMI3T5=$Xv>TcAB%<(rf?^DPoR#ssmpYyvV|4 zDP0Zt`4Xu~mOJz)3M5g6edYl7>DmZW-__Z1TKi2yX!=~ar3XvV&_ts6(X|OPzbDqp z=P*d<_2<0LpuA*gVp(Noud`+Es$MV;<*25&DZYY z;N6kFvlImd4n@&8i*Kaoboi@}v4Da#uPzzDm}6s=oNr+r^uF@5S6sG8*8DyH%+*5? z+LRD$%kk=VntB@~l857c;F251)j5w$c$hhId{Z{0YP9b#U zqyMZBS`o+@E8m2KiIpt2hSIbOipcH{FX=C5S~}HD&^qb6c|!Q$Wm)gMl?hNyFGT{# zeD#va)?`WBl5*2qi1Iazcc|`rXg#(Cq{~A|oukSCvFmzq0!kiKZW{j33E>3)&BL$~ z;YaG{CU#{>?FBO&v{M!n{@cO$JCR=0G%D@*%hrJ7F%2jt#19cHR6id_VWZ6W@uN}A z;)WE#*&WAl`uc5LtHWio1f1*pkzWUZwZ9^4`yBep1s;mzMupzwb+og*d|%MTD@*!H zkUDA-5DRxhqihW%d2$q`qb@L%P{61gcuY38eO#@M5pB;YMJ5c1 z3ELDuODhSC(W~TlM)-}HhtCkUkfoG6p=oy)ww4fdjUZy9z2*-dQ%3}jisVv(6=B{UPd#yxRW|Cpw;qX4Kd?;l#RV7zHlq_ zK<+u#)qUK%NoRlUPLB`BTnbu^X9a1S?#JcJ5f1_jKp|%AL&EsZ#EGrDHRxTNPT02w z+KgMPr4M^rK;E<933Kd@;{rGW1AF=DNsQ`{i=Pf(cTj=!F)6{)=OTdY#fXEHr-_X4 zEJEGIIr(gPX&*oDNO_w1baFMl$Nl)Br1Pr6XYstLCB&Bqd7#2fhB4u%(lCxVkCxoE zmAX9yn1B!pm$CrqZXE+k9PQG3JY=|56ipE#1o!=}&D9LYw!P*TU%$$5k;cRRZCAh@ zn2FtQGPu_Cb}vRS!vjN=9g}lclmfUCKl><~0NY-tzKaaFd*HlH-FM053&Xs;h&w6p zXYXXfFT)-1og=b%`$ZkhP3|N0D|Ghx3Sx_8?@HyAfv$pSi=0|+E3`lrH)Y_##w zwbpb)Rp5xZ@XaaAw9bF$)vYTjiQs= z4BDe!7e!tekN&ujb;+j4E$1;Az(i3>bU?`$a~0!FjD}WLW2!wgM}#DGPh2|MSUauMvEVVq*C4gN#E~cKN|{U`-TmEKL7la zr#99J!db1w>Qn+BB1);*C261X5P=vCXl`p2omA+lRhguB9tzXVxC%dP*M!e)QD*vg z!nlI1HASqMItJ-h&$M3CRWCXiAZ>|Tp*j*zYYrH0C=W-Ctf!aaHN_qtio=a*AdA$Y za?F&|3Bt-Xv7jdp`(dg?T?IEWOlhuf8ufVC(5|D1jQ~HqmQ3PO$n{_*k6_BK2wr6> z7sP=PwHwkv$zDT$Ol7&3V4o7>)TbM{{J2Vw7msEzZ!C~lL!KoHuhnt_py8s2LgXcQ1XO~$lF_og9(;BDD4eH>!kk*&{gZ{05DXaBoNB}-g zInvQOyi13(PyqxcGg-6MsmMyb$X^QwD(@2r>^1tX#4&GU`SHblh$f~*B%ZV#TVSLp z%Rs@aGxKRC+E)`Kv>1XM!V=x3r9TUi{5${HW0}UWGNh!Wt8q6EaeB@6oW?K z^oFkRSLd%iZA*4`P7c!Vc5P?g@TA|)gTDb^sMYLmS)$XzfamMi{j$8vZAJ2} z{TcYK8?i30!BhcpT0%&r3wgd@Y3vBaINRp>ArVLCvRQIBptCVYK*BL+=1>)?bC#fu z^bK1qIo)a!o!anV#O1l?;A}K%^uh4xWK~AeL&i3`nA5r!iu}>Mutq2+&*C9uq0ZVTvWPV~*=7;t6AM)2|sZzW-K0GXODu#0$n|^(7@;ev6CbJI}k! zVQo3_p~w_x1{2RMnJinz$am~8h|X0ba&(4^4<5@ZFV4-jufF&_mTn4NdS zkD}8MVcXtzDb6wKxAtJq1S)KR9P#motAH_lH?x&`Kh=;Y#C`F)0s&k$Oi;E?vf<5G_hwN0>mn zN=zyiM@lHl>0+Vud2-yz`!8R^k5?O;EV;2 zF9xVtRJF!g$-Wfn9~J4xyUKM^fjd1@@x+@ULs#9Mh3<*f!52Bo@9>taiS?b0$Sz~c zZUd*wIpxl=C#2RBcS?f~ZfxtT%|M(mN-j}NV0m^i4s27JTlHHcSdc@nfv;2je$~jB z3u=U8!$jV}fnLKDRoH}-%;>#bDO_0~+5^z;!*Q$w|9XvgB0q>Eig+ zeKU!}9{##l!I&-Jb#}qQpz}Me}iaSaek3eD>sxVFw5$ z7~H?8Js1bc5<|ca{62w(9*S~=pCCd1)1&*ycv=o|VoCez z%4PYyzxo0;TYmcXcK6-`7$XMN`BZIH5|BVik|Ii;6kh(3sLNDnNBUu=;@wRu-2|0u zC5FZ8+Q5xkFtUz4%`p4Jj{=IE!qcAVx)^all^w{0$r9`Kgm&Ehb` zcb>W{nJ9Kxi+Qa)7J$a`!Z6C~jPK?J=H_?kYBhEH00;9IH2v_U?M6V@APPpr zm7}YyeyL<->wE1!Qd*YPFOlcIKg}~JRhC5)P@C}fgTmaz3 z_~g&8d1;!GCffDs9LW<#IV)AZ=(PxT5AhBaD^>pJHKPc=x;39gZvcofJi(zlUU`XA z%@e<}%>=Cw2PrU7S7G`%CyUp;k_kk&3SyMGVD( zVNYimp}3-0s;p8&Imud}gqu8KdHmy*BrxXh-^0f*)m@>j>%aA9&RtvZT-0FPUFH)N z2Q%g9t2f3}MGmNg(SRf3l;R@sN7KTo6?<%O8jufiv@vR;x zVdRpgX4q3&E;OGqMc73xu?o_!MKE|n2J#oMUHfxDb9<3VCIO0iE#ErxUw_%FU#2Qx_&;=VjU>}l0|F+AR z9|`;ZTB1?8;fJV^PDfc{T3 z^0RyoCy4ExjzqaGS#nBxLJIjWMIA-rbP{ELj?nwMPMe})tS5prty?>3?&d3B@+SSn zOr1Cpb<p)q`M<%+t?kopcEK?tV4R`bV4Pvf zJHffr>gZu9;n>;Pcv*SAbEd7+!xH>&>ysW<2aTJQR>MMvRKdp6f|Q+=jVsNP0hSn? zy)BFZ79B#Bi<5(0lvR?8SCorQRE*<0yEr?W6o(`$s{{`_CpXu3AyR?=cZdN3i-Lut zmAf@52hV>K-Dzmdu+V@-pOL4{9_>b^@kGW+2HjRF-Bc#sL?+#(2n+dC#?{_N3)xhA zp9ho4Wd!JOcn}f?(}hSTDy>ackPU4Z9V?|`Iu?u=yhGYA_wYn9{y}Pfc}qP$MR)~f z?h;x3#PHDh`47Q)lHa^nZkM&5vv1j6UbD4($?k#sd?kUH)-ZrBgVAxmL!Oklvz6GC z3LJ9~QoFULHF3c&(JCo7_@;cQ8Y0E4lwf4*w>iRrSYu2*>B{M9^wc2NW^wCfIEFsU zX0m1h6RL7C{-2&H_4xLp{Bf;vI*_e}IZ|C>I*6?WIg(up$02;p^41KY561j!>}%{M zkSjs0!L1VQnCAeo$s#5Uu3&csCVUA*xU7E1X7pzHP$py4HNrIr6NZ&&Pvi^oT_MmR z-=#hL8uWl?J;?>-nt%!Hu|(HTF6k9$lwv)FM5`H0VyMm9J*MTNX^cmp`$~@(#Tt?c z3r|d`LmB*=i13CIuCj`DIi@QaoMl8Hr2SHemSPDsl@DET?0 z3-C%sCj#!@@UwNB9h+6fkk1J-XT;0$i+_lmi4%}%h~a`>=iFb}#evlEBoxUBsi1uq zukY2P(e2@h_NpKC=ig6&mrhyI7uG*IGgiVkmaJbM?bn600DLVRc;l9m=7 zGr03mLLnrw5ZmN4k{$P7T090_DxS6k{V|TV7riu&b{SnOj`kWIrj(j*4u4TAjRvxl z)<-0*kP!r3j&J+Jh;Q;EnW#ZhM8R+=uPs$2{B#ZIRS<5bvKOAX5nnmc&HSGz7fIUYyU#?>sCSden z?5(^=6=E?w&uw|&JPe;G36Jqi)aarMntKQ_2$5F)ld;Aue>-~|!2PfX&I%U?RAsfF zd8w=Pf{F=Yb4zWL=Lc5`CQN5Ny7d)G7yKlzp<}g~Y1!6}2zP`j-t!M2b-UXG<1*phLa!x%B%5Ws5(PpSTc8SHo!rb2}|Op3M9TNn z!RA|(tC?yM@2q*r$&7d#c12b$a!JeethV(9WX++!xR-YVz>)JYgv;%-QC^R~&rUUh z7hphzoTcg=Ghl{ATtu#$+sj6W zKT9*+?fQ@!bdistk?wG=K5AJHt&x!eFw)~(LGV`rm}&JC$LZB0a{&38)=(EzQ9XmD z>IbXI)L?Oazvyc=^T(^l7v_-kM5A>lX^JnvJ2N)zTHAEjgz^cNJ)36uY&zR6z+gqw zRtpFg`=`&($v_TE+DtVO6rl9SAj779=|z`sgy0{RgGOo8G$_Gl#$)#H0Um_Vqy6=( zCq(lAsXlmCTdo%>8#7~!m@LHr)io%U5A{)-UliR^XM{Xvo;NhFH@d9QGa)ujJIo$a zKwW3>sSKts8KS!#jCSi(lC)N^R1xD=Pl+}1cBIs4N1c?B!JogS)(DFvoS!=nvyt+92@t473@Rl<_`nRhfl}A?il>}eH(n@y6zbTI(TRwgK z%WeW6{u)@Ko+p$>;45*C0B#(cB5)VyAg+xzY#(KcntQ;$h8-;9KRTK{LC}0ty&Nn6 z?`{ zlg+p9Bk3--Q%3+QWV4ZP-<4ut1}y)9Lhx#4fp%h~G4M zA2sh7do$l?MvkToee~Bj(jjd!ULyb&Hs0JLWo$|@N7KCwm?OA83hG)7X8z;n4-ZTb zagx1y;PRGV8&z=@r2K|lZ~b1y2H-qgy|$032y)eD5%cMMkJ4WkXncopsO2f(6=q*W zN(HcTqNgigm5HUW$BZ?Kq%9Y-$`xi53Qdh$m%9O`7v$c!_}-VX*3 zmjqdAPzk{y54kp&V}3Ovnkt%#xomR zC>~QG@;ikckX~~7VDhA_Ue;;NlFoR=Tl}dhtq`@r42LMcDIBn?g8=s(KId9Cdc*y8 z(745x(UfEFkE`RQHiBFjxYy@Gbb?! z-`Z7>>8E=@ysv|MF=_hn;YwaB`DqceMw==Zdb=i zo?yo9VyEN$oCJt^*#m&EKsVvGKmD*tQ2s`y+GaI7-atDl^`TJbf2J>CFLieq$(c!h2cXo) zWmqM!3)^i`N%tJ}OR_p`nZ|Q0G2SuC9O6#t>n4e9V7 zmy1p200LF9FPe9bugW&AR=Iz;^(xq$I>gW7;w-onD#I|N@pdww)}Q1DTP4qRrZS&S zFl_XKhAbrobT`bm1nbHnm2ucS8V0)G6!CKzU3Z4*?|R!6@lTl9ONam2l!c(0LqVMd zWmY?MGn}(&KLtF-zvJYe45hj6w??vmq*e(V)P@~mJLh!6==zp+U%40QuVjc!up;_8d#Jqp4%omXQT!(f_5i3sz^Ony7XIW ze&#PVEw>|dG}mT6^>?8Z47M8V`)VScyV|*xjgTA#*J%4d<_#b8Dc_V?`#H zV1YOVRY9q_c0io$Gtmx<%+!_;y`Aqv03oYn8i9!hq>#N(WMf!sh;^nv4>k^6m>j`c zAp4Ah^@Rq4W}u)ki8bVfvG6fiPCmhT%TxusLsii6t`0=K)EEK0(Z3J)7&=0fy=}B<3XibBr^Aep6N4dm8{h_2}sc4&Onvf1I!C*|`fP7EfNi?iY%>9CWr1cEiX{+WC)01K>H0ju0>0wJ1B16d1GY8spum+Zvsryf2uPoG zACaux?0wqfrm3@dyZXO=sQBJHpAizoHmu0=m-_^Y^2V7h42wl`uK0v!gPD{YYa3Q%L`}33)0V`hGR| zK-p{gU?U7_^*Glg2JprSi%GtC`J!J30+Vr@wZDF5tb=g{E9N65hadnoUG+toRv;Qv zYxv8EG=k~-Y;UIko_gy*dSpy;ZPbN1FnrNi3w)#DC{wmM#=`bGnzXjc7`|@$v#R5ILLhUQuzc84ldIPdg^<4G;N#n1#%vcq2*T$FK7U zb79IiGQcXTtp6BXSd2>f;HLSio7Wl0St1fo%pc7(=-(Jhp>x;}AQ`-@ZX}!dEly(N zFZ(b`dP-@s6Zi+c1gKCQ7IQRl|k^1yZT(K8#*)sn==G81Nh0FZTMuXU&HAGB0nj1?!B_4{jp5%_sw z!~lK}iYFNAd1K;Nk71_a*tOQ$@|j>|<18+AAi>T$US7O~f3A}MlB0jG`n3=2<()_H zY?gc86{&0iih470{%PXUwRhQmJYR?;A3k>61#B4(@^vfd8K=Z8JVwL%bJF>NTFHk>6*^KZK%W`6tX-cOIEYW5J>6 zNz=e12%Ou&pWeZx@tuqRkNC9)T!1O&B5es0ik|mU`A-eJ0(s0 z?Lbxlv)+MzO+emn*P^n0UI_iXef-zPFs#TBTZz!swon2dP#X!*xZqAUkhwUJrBd~9 zv=QJWYS7&=aLkZG-0{9;TSt}?`Z~k5scm2_alfXVdp2UUyNh^Y;dCxFF9TO-EQT>^EE&?} zL}h9tfO6BgAJ)&HYDqk*P5sp2`pdIhtbnAs9E0)X2o<5Qc(EF**+`mGN%L&{V&D6# z_NzqTOE4c%Fq6_^DBlsQ-|5udnsheOuauG8xb~O{bjfseksvm>Fg7^AKL`BhK+SA$ zU=1LEH;v;3z}Q@g0G@({1fo)EhF%sQOrO?P6|JdfVvW!j9UzW%#;?RR{h;>XTOorj zFr1F`%|nL(&&b@uLGF{4*6JIBFdg9_HC` z!;OEn8(QpEmy7-un;b~oTy+5yCQNz&KS88_!poZ;+w$vYZ+r84evS;q**rMZKW@5h zygg}KWrV3C{7svO2n3I7iAW_+!agCEAP(a^d9H4-0+Lxao1^BTFQ`$p=5&-t83Ghc zgm9?S@hm^gh&pW{U5;6UV8Oq97x+qCYgcR*bsX6BonNs{V`xqI#6`6eQB_Vogz){K z3nc)|zRFf>Ej0Ra$O;4RNjLGx>dvThxK_iy6_37-^2fEQl8^7ad4>ioW(S&ZPB4rV zg98gEq^mn|4xJyl8!Uu|yAIAbH&GAQ*!6+gjyTuh^$dR?TugfjNtN#+$yNQL+qC+x z>WTi&tqeBh#NLGY3Sjb}%})7VL$NL*3NV4BmyTL8E-@ zb9eE)1@(7=QuOmA_}9qgVPNFPubmDmBiq!%M0maXlbw%)SC_{abJHJB?B`ADM1L3_ znk-2zM=`!BQB?H4}fsO1~9dw9NA=siF^R=?{o9_o2k6HTb36P7`yXE3=6`A0(tmECQ5x8LbEZl* zmH)1+n8;puyXVjGS441%JhDTNSGO}030p+vy`}pc{-}#yJ5+_Gp)T5)LNtT0_p?JE z#xkUSJoEIYKvZj> zz^j2#i)s;%PJ)R|qKBaFQ6!a_Nv*kxk{+Jj>d|@)3G0?+<~4)ef^M@DgVx~9C@Yb0 zQgox}9=gWY99b=jBJ;%I^`-Sw%NDuW4=#}TraL#wq{F%QoE}G{?rA&Dq%w;cMN0{G zJJT76kB{jM>T0U@dTobD*~yOiS3-k+=i+vYahij&SpT%XHx8d>{uqm)5q2X;nNoXs zlasdI_2Ep)-=Q%oL1r?8+0U=iKV2-QuO1@$evXYUYbK=_B`cTv&X)BRbBq5$<|BdN z4Q(?Mpgv1~y5o3Gt!W5!J71}sICzr^w$wV=25$ORG`J*b)4I)t=cUVDjLjzK$6?cL z^Y97o%WVj`C&NOFQ8h#$CtjXBiYH4#L!0SwMTkC+BbiOPqrGP$!b zt-)LtVe~BgDkukfh{!>&EfoCPb`zp=8m25_N)cwN3bYMjvoJGnqhrU+WErY3AHwKg zQMdMpDieFvp_k|#9AO`)gXTVdGpoWQo)I(7o}ZYTo{&K8QG`v;7wtQB(4>Sw>wW^F zHEAW#h|{Xwbky0(?ws`}tv*t*r_@l*A^PNtV;I)`z zp_&8}MTaUshZ)@X_4@?JFhlK%OaQ{%emi#{QM!ug&V7E9LP zU%SPoc7L8Yum!M(mec^P4K+@d)zY*bLEL79KSjL)4%%{=Kh#|JpxK;9{feE6B<^~zazSaJZa%g+ zmr_Z3`!#Y1O^eU=w83E~Anq9wv%#KjgC9vSl!%=LHbdJdwSy3z8n_T9F}yXJVN0xm z3pa$4HHZ;I*=SEcOMI-&R{mU&7TX>GHlVI_I)p1{eFU6Vy1Ri&VoE@iS?6fX?Pzm3;uB|K899L-@9e*4JlV+&|(6>l2!_NR=X3 zOhY=q9h=oB3Lz?d>TV*<-AiuKtixg(Nq)iND6m`5BMn$QY+^*zXsDiOi?@Oy_!v^9 z*G&04%=obnub0c4I&5ZLSoRyDU!2+OY;0{J$Z8G8o3MI1XmQg*5zLgZ3r4bbe3}I# zseMCOxv7AkR7xB&HJ7U(B$@Mv*|ACNAb`@GYSM)PAcx+qPS!Pu*M<+_(Ofsf%)+&z zmLkOf)L+uZlhk<_96Fzx3wrYXYNqfV&*cR{QD$!U_#M<(^u|-}l$7YCz@aUu9KX zftk<`9`dZtZ;7oE4GI};_g)Z&3lY=PbR+Z~3Oufful0ChmgC)5`ia=!b>H@-z7Pe5 zB%0sjCfDD>UN(9-EYoNZZ|DC3yZm`EJWw-X^SdDA#eK~2SX z7deEe_4lr79%iUOA~mIqNxccg!!ep{@^n*4%aaK;*L0 zar>(RP1t}O%PM9l@PnHvnnF4P)@n1Xy!6|IP48yKEX8dfnLq5cK3IvQ(*Q1C{?uY<}=ZixRG35&zOaEhJ2$ruYXx1VA+>Mz`t0ht#Dap=9#Iw_n?WrI}(*BQF&-n zI|+x~(qB|W?rX<;mn}=RNGPOI(|R|GUSls_|5`bquMp0V0)4YbRVmh<-?DD0nVL}l z?YbY&pqT^S((O;Z{i;~gvAx_mFq@l+rqU+2Rzip>L zRBFO0yH3!$IXN&ih^Mj`#m@EMb#);D;-do}uGZlPr^u!rmsc+yBMwg5FW5GMUsy~c zQlC!Gw-v#FC^z4d{_tNE!tJZyU%9`TDXnT`R81a4Q6x94wqlqLl|pVp!VG94pg;au z8aV9|4kLc_(N+|zZt5@NiYC{7+4I~LzL#_5oZqN2OeGtA>|N9`>*~>)>IYXAYHO}* zytF$q-+dq6c9gJCmB|r$TeO_`JkLF)%_{m>oc5O`=rR$#o1g;nhmH&8wBK#IFc5P) zhm%t6=dmxLj~&^=BoJi*{O$3**1N*yd4t}U)~yCvqE&~6odji`eH()QsKRrNL@sCL zZ>Jv7M4Zs}BX;9PgG2LL!!Sjg->jR-%X30BNld5vZXJm5TsX6BxfEL{-(~S@Hl6al zlEJ2?Q&JrHPi9;@1(7-!*5 zcUY(@@)|vqDc8flv4Jr_9ES8zY_!|Udu@-2Qux~KL8%}Z;tChLGS4%Ca+%bDjGZg> zt~f7zkPGelcX!LEP!F(fv-Ks9d)CZH_4lDa1H?)3&X|yny^xSi`=82ZB@^>`yNqCB>+REdDWA3A(b|p8@g3GIIv}gqtvEl(G%V@~hbE%iNxeD z{fHV#83Z{1)4{0~vR3Jbx^CMKoRQQ?udv^L}82aWi(rR8K?e5v>A zmmT6nAHQgumgWLa2qG2m4m{6z!KMDKFEXzr&kzzOpH)8|GngQILgy1aEHL)6A!r7@ zx5)5NNRYf(^;Hr1CA}m~&X2(EqQC!*y?fM#>%5`OwOml5Qd!O3gxPdlV(9mH1R!U% zUP3*Vha&jO3?mH(HiP@tV_m-kKy?-jphHAPCo!A^iMDs-<9gn(e^02x`KjxP088yg zB?7^XAQit%MME%sH;x=$XmNiuf`8c)%dfjebL?{iH+nl70UkMPswKLxtkW)0 zRCG$r)kyq;Y|7KpOH{W*qBYo2d)3A@_!|}SVOK2jRKlnM$Vr8A``-{`)GXdL z?a$>?@Xcg5UyGk74`UcW<@)g3QM|^ivLHetm9t;9v29ve<|_=aQ&dXC~xIMg?A(Jg+4Bvnn|#0SB_y}IY-@zdZa z>-%g8M%v>>^>rI)3rD+_nWac=Vyv(g1cy!SX78}X#+lY!{I**W-lTT05qbVCFb456 z@!O0-A>q64Uydnr1>XAy>~JCc;%uPpvwu#{ncX|7X%V7ANAo>Tz!gN(6{m<-{k^8y z)}Y(T6Os$X^GCX<9yf3yzYB;CE-*`zHd(Nk#jxpv2jFhWWF;vhB%f21w9h%dAp!+k z_6qaQi+?S$mU`=|<<`o98_<_UOd$F{b7ug?-6*>O15Q`$_aW7Be)+KZ_V{)Ip+|co zDyR~MGoS0J(SYUm0wjpd0ltbspGNj*w=dpjF=s+9pWYf}f>~65>ChVg zR;4vQIG{xzL0d(KMHfPWMgQ`_Yw5&BS(58JbUOlg&J7~z!K4=aJzO_L!T@<}8n;41 zk>J7WJVB>L4py$8CXvJQf&Ud+UJ+4BjS0%f=WzFQ&B$XY*y)v&2$nYO?!;}M-iq@sK7(Hh6!K8kA3d6a-5T(A+N z2+P)=W{|r2CH0woF>3aLy$!Mi>Qkinqd^4HScCiA*VnoC-P$?n^De&va3<~s%vpH6 zD9GyR{}eX1I@V3U?cHp$;c)Rgb7dt-v{={sJa%MQ^{U@CLLG>>O~K~%^(6EuP?G3; zSgau5@rm8Z{tPbGAh(p8wx0nZ?Te%DuD{CESR+pqq!A8;eA;gL5DV#Q#1CH{{W`vJ z+NP7lOMc}k`v^QbL!X#*M$D{11!lZ^F`6<_g6brK0x2)ZcG$7`Ir2b`Kw<&E!TG&=lFcpzz48pth8>5RREZnL~ zF0o4vT;c7K?D!OZnB$r+bsYn68^FGW)H8#Bwb;S3fxO_zljx^?K&tZ?4KQs+s|7Du z!7K9uiQ>8l@RYNfq~YR=DIr9=<8zpDgvQG;jP;~&*ss%7Rgij@q$<+$T^xEj0w-xQ z8e_|)WT9sq%D$P~ z(Tfy4oxL)%;gC;V>7Okwt$X;kXWQ$~Y~jpddbXST+-7iPByo-9DvWjp;7mXJ(9q#} z4}tvRN0>!2Mj*2YqwcLI%E37C_G`biNL}s<)-2IPjgiH!($SGL2_#M0PmK>mJq^9^#fi~yF%YKek;$pv$HuX zW_?;J_bvCE?~lS5wyUFKpP%W0$S;aGAsU~SsLIi_!bJ!AIgXRt8>WTG9*)gvc!ym&GSAG_uV4rC z{Ydv*iJ*bti>ejrns@(P*E3}|^$!CsU6o{+L^qNViJ%D<4$D~G{+J_-N1Hv130oN} zb`)#89Br7M@~RH6nQnpVUeh*p>;2HYkJ>~uA`X+BIxPawOfkF~aBxP3M&#{su(=1& z2!AvW;c;kZ1AwW9^x0UQ=(dgS18csjjSTRsLGK_JV~u&K=-un?_oC*}RH*~9?kC;e zY@qv=3oH%U#AE62H0z(ZhGizLawh}_(_sq)ASSUs)!R}Ss$1|#B!5*43R){%nLrRd zzG$DzMd^EfT+N#yhlmDtVHrSC9_r5cSUoGzRK0vmJ8MJV;3<>G`RDR*^KEEHL4at~ zWif=pB|MS>nLZu_G^$6x4}RIV(37XSEL@7ssC%2Or{j?kYp6B49oub6OP$>Ga6N)nhy4 z4;wgcRGerUZC*rLG3z(AIzo(Q#wN_wq#$(^iZVusas5hvxL+WuQLtQ#2}5YY)EuoJ ztT+k%w89MxS^v6jhI_y4A^#X#_s=(wlpBd_uL1g5Xx)>;yiB2=R?Fi%)|cPkXuP1fDu0M6hMhUUR}X$MYODy$=TPr!>QTX7@LqJYK&Z3fng5SBhObI%LkO5Q2Ei zddW%A+omKku0sNG6h#^9m_G5}{&ML+d2>NUC_rXwg+hKLM)WS8gna%itgny+-Pm^a z@ZLejd^6s`2r!+3+>p1?V8*Z^%n;yoTqxb~FpnD1gUi8Dnp14=O*Lc`^)uZVIQq(K zLdh^Sy{g+L=PqPrg!7*DBz6x{{>r5k8yO>~&{=0kE}Pj?!!HJI2NtB4h?ljpTGt4d zH`cmZ8W|?&^MiA;VbCL;xKB1zTG-CO9AJNYh@uY3@Efr`MjYLjO}_{7NEcYi|794I zda#$sARcy(G-r6=KZ^0iQJ)XX@1bVP?8ey8#ZnFpxlnATx&hWBfNB!BiW=DCJXiT! z3<<{~;q^g8GNPW8zb(?;0$j(K`CWiy(y0qa0SDh;k0je1UtzpDF^UmK5ihF;-9leH zwsa+0kO`5iFP70XG;sH86sS~6G=f$-4Tr0>yn=QWMxWZl7=rnzR`&<2j71FlLMdOL zVC>8x8XVV_0}9ZalNnTt2BU#-P-OrNiN=sWTMR!1VtWXpkw8tnUE{H~yIBC?$ffW6 z`=QVzGn+MjA?4ygcyJGGQ|GbH;Ju5x!MulDk4fPf21(XH3!;Dtwl+XPzAOe@z+-|F zkFV4#vn;O(0mMnL4ayLH#FBkxZldMz6$?%v`V*{XiY;d z0ckJMNuwQARVyi!RX!8N^>Z52IkIP9>k0aNlG{~k`VJDnN~Kb z2x>^jNwzFQC`4oYfv?q^*kTtmaSSW-)IK>=fmZyiB++-H954nt+J%(``2Wp9oTfc_E+;lj}1K%x6buc!NVVnLe(hGt7sn5W#6Sj zCu8w$!V(XSOdOmDiXmCFOtN-r&^bJII8MbmGnplRRE~qI>AA7uCc}r&sBRioipt(*E?0?vEIv~0lKA>zn}Zj*URsER^_24c6?(`nXtk+Z@nU4A%_Cz z6QKQ`mbAc%6!!Bx-}1tiiNLp+*mAN5!TL-Ah_^i5)iG$?Qe`E=Z?sUZ(W`9vbi6$BMi#o);Pw3nuYF^N6ZGGwKevt={Q zK$x3FR>$5U-wAsj8n9t?bK^W>7O-_AxV}jasyOP3%-CSnmiD=CGz- zSdP)HKKeX9U!GiYiHao{t-2d*QxU?6U0&&q^q=&-hg*FU$?u?CX^Wb2)Xo!l+4Xrl zxV$~BbSB6#tg6Pp**1M#j50cVM}PlPCHlsXa?$nZ8D-b4(?x#iKY%fMc}fCt)L=;2 z#WwCh-wzG36F!%k*cjbF!*fOs|{@;zA0>3JMSF31kzxB1{eZ zOanUyMPS z(u6HEOql2BbON=`sZ<`=afNKT29QOH9$i|>+_CtRj8*p`a&+HO)@00;Ng1uC880wTLREk%#Y6ff`db;t4UCf@youyEvJ;!VjrxmnTM5T8C5>f+1YIhx$^mBI zB=L|=@6XuzqJJ8H>jCdxxLeb;MBtIaI%ADfct`1zEv^P)7j75?b4XvD9kxaj4UZs= zQZ@XMuQLzIKdc|fIr7xAWr{9NS%AeX-KP?o+~gp#gIoRbdbPDW_UFC&AnN1m^GAxR zjP9HdH6LEd$F`l)$jls6w^8DgXvHSA5`;tt!Zv9!()0sNB|ErOJDxRu78pi0D?sNy zL1}5o&nsLvzI0SW@b{xNT921(L#Qa6N9BqRH?B`R8wGqS!Y&MzG=;IP)uo_yA8a0l zKNZ$u3eZX^m*MSse@j$`F-7zN=p)pHwcZhfSJMM0@Vjdww zf-8SrAa_LNfxD5^RIDWsw_z@Ymsj%p#O<5Pid_09(st4g$m50&KGj~(bXVh*6Qu>2 z?mEy`Kc)v!rjg#B-^+2mnM1_H2)06352Ks@3<|F`%=$y@BZfnI<^}V)eP>k-aRM7^r4k0I>R_nHoYZP)232~4^3I=R|Z2J!|H+7qiw!U zSIJ>`57~DvP#^Bk)g8 z$;M{o#)j#$ok&LIUW-Q7Q zcMB+^2#J{e%4*nU(kg$sk+b`Jl9g|W%aX#>LydNozN}t`5yfdTS@6akI+09O0c&HU z)h&?YOA_^jaU<@y8;WKhL;qg#x2C(r}r$m7AD!7*EF6pAp=UdHGT$kHktYBvB7410Q!N+@6xTvHbHk8~M z89nS0E&2`08yo9Qn7qY;ilij^kzzQB~Q8$*~AReE0!Q&z>kPKL!>j49y9)8O;flQ2nc#{4F9v3Y*TLYWV9>D8p-{B(u%O^%=io{E$_!5i;AoCw zhQ|b|@^Nx-$#6(Z@p15TNpNv-aqw_RNlHjaNb(Et@(S>nis5vJwsVxn)j*2JtJ8`(j@23W6fh#w+F9Ir%tDq@&=q) zk6CL&N_m4wtzjFb%ULN%)uTdx1IvZPiB~upVav~q@mEMzgy+}uKxafN7UkJ_WA1Cq zoQ(<^?Y(4;>el#W=ddEy+Q0Wp?*qFuq7bjgVauPzx=*|mVyqi9;Kc+_4eMa-Lysx= zp(SQN%E-Wy*4fqvWn{p9>&QPi^ZmwPd-4^CK)Gy>TBCSlgNAG`MAzys$DWggLK#+?(^SI{-{n9+&Io-ecf$(c-PIH#x_l6+60ek?s(HusCMQM3_T z!#!Zux(&@;GKec`A&yr@6C@N?axzWJz>qeLRzO-<4xKDS%|E)f2!&B1`}j#yrY#Uc z7iV{9-e=J$--ubxdC8RdQfZR*x28ZTA60#Rpf%J3R*BMVM*7ISrfW9eBqfxR+tNN+ z`QU5sbh!6`c^s#;KqE*a<5Z1M4@Bf2k$$Qsu!7e3`Y+`-95*VJVO09*Zy9c-aQ||} zdu!|!d2U}Kj^%&XeT1EHOi3au(H;;Y)HvCHdB`i$jb#6X7_v{7&GCtDs7>o-QLQ;g z{!6na&YT=xi~I*JxIA{vriZUd_pK3BMHu5v_zz5r8@4g%9~f1NjN(;k|ICZjLX-#K ztwzP%7f60I{*-ncC0Mp`Qt#GDgb))Ss%%!?tA&F@HW*Wy==vQ2LM}x>(LxaLSk|oPKd$5L$$9sU>=$7jmbr8N+dNNS33K>9`Vb#E}J+JHVc)AlwwSH zFct^ph@J8PcetD$=6;-01=wHcSC8+_ z#rSB^54DnE+W>zcPzNDgF}|#r@5ZCwQ7>i?nOcL9w>ktKDswgXqM2NYRLa{T7HphS zk1ao?G0X?hsX8j36!=#XN1?k3*?`+3PQj}aM^CZ-izsf3)_^r;2b!bJCCf>%V*eSm z7J)T}Zg8@XI1#iT{e=EY9y|%yZ~yyaFwuR0KRXN@z~&bux7ZB_C4=j4qQ5T!N>INs zN_3{{c9N|K99>U~fWpL#GE|)cT{*Mi8jgqk+l%xkb>o@ub`PcEl6;^UXaDuYMjLi` z%Zb(_zZo`|nCj|>0s+3wlF%{ZoY@njYN)iUgLk)H4V1?TwKDT2tk8B#^l+9)jkZRY zrow>lpqdy`)Vlw|Qh`+x!MX2yXsOA8l`&TEUEpDp6_qcck!8hr67(@e3$a|>HWMDg z5(AHil`PG(FTBPaV?_gr_$*S&b+GHG2@0jA)@_{sE=!gc8YU->$CG(;h&;oNwLDxf zCzs3isb8*$I7)BayTc$eNBCAJq3tN*NAb^_sWe82d*J%MuYUv4ZD}36TgJ_xzs)*K zjr6w(?|Nk-Ug|4?h+#Ql8JT(p_jRN9X8*twIT;yF&d>4EpnYNLk4af;%RqF}wpeNy z`ow4!B8~&*o2PXK5!$XI+Nh!NzbhXrOh~rctoyznR5Vw?z4*ne5|v+W6{VU02`gLO6Z)kW12 zojEjw74-P^9Rg|BbLXI`vYz< zG(x60@{+>>PDKE5CnV)Fu{Dp~M5zh=66(stieo|(@}Wsnf2CPkqjDbnqC-OtosCb^ zI`VyhVZ*DVDhR!y;aR+UxtDbY?l55JmV$tr*k1<~zQ=^!ocBq<#$|_{A4z7M&QJ@| zkLg4botbTu;DPcT#>_G)PL3Ep$+++9vA+#{z;!OsBvg3bE_pJj!7>d}K%NUy-vXxd zB5zcM60#$+1qd`0Clav*!a6NiI_a$lw*Y|+C$hz?fw;Bi_fK{+UbYt6YCj7st zqIxm#ep;N^@WR(SO@AHcVlwGl;%SGR@oCS}hPEwp1n-0Pmgp=M`J`LjUd_vr_A`PoZ&B^zqE8S)oAo^W zQ=aFg4sH_Shal00j}=Lwy1U}+#`nMOZjS6zf03aFfGl%;8i?5KqJ?%PE#qw11_-!@ z(w%L`r~HkGhN3wvzZ2ac*U0s!a|}hRn~7>NqnZu<5VIZc7NAyAnL#on`_B73^DqaM z-fe)PA4;->Fn15Ma1BLVc{f0;qGn2ZN#thd7PX7F*9mfm_&K_)@0BvxyT;}8y`e1D=;r@x-W6Qx2=TTJiQ4~nXQB*aEM-_#Ik7hWYz6iJ_7jRZ7EUFl{1 z&Az$1j}D*bK?3oD_dnccZh_gwjew%2*TEtpCNW$&`{yzGB6~0og*)VQti4DxNbsLr z${nPU@GGqT_*;#ko`^Nje`Rw~epcZ#VKJ$3d+SCdQRctBf~kXtp&s)R?8^8AtGpe2 zwsCW7%9k0z9r@A`RyGZ9*VL72R%itB60FU$R)kWt$yT59%KeEM_yBI{kTkb*`mM5|+yZWWrahrK(xn_**CkqO*bL7RjcvxHtt8>o> zd1iRxUI?74(Mv$%Csk1SIBO@9J@yjNcH(t;c7``da4X2i_5GlpsA&e2orlPs{yYl* z&nz|t;MJ}RKNtL)j%d?xdK0U+!?sI^f@1C7cMwK<{6o0xeV+HuMz(3tefr`8wUS-x z&*Y~bm_weLlQG+M_@`b#?Pf;~Uxf(<2@rk)a$-c@M(IQl4OL_Rx^ekb7K_0rsPWlz zxR>K*$g}j0p8%xyTi9fyY*W1-{5ngK1Nbp6)J`T|zL2B<9u&j3#6oD$tq>R*b0POnGfv`^8HP; zr#hpV59dfWdI1BLw8FY8#v5OZv_Uy6CdZ#sydNx!wtr!fewa`9G%Doo`(mo7aA(YH z4WmEa{vP&(Xvu0a{<+YbTobI|RUiBg`BX;#@hzFV3Vh7sRX=CCQFyIahHKo1HN;Xp z&2yM%fVolDRCCPp;GV$wNdc$2e1i<+D2q{HaGt_@*CT}+`9JFc*Lmm>;guB$(5 zxIV%jOWY{x5;6F(reV;=R+7+~#9e2`o+@f^#dsb@a#7L&B#QZ8Svkc?s;(8fGl z88Bz^@z%XEF>j%v#ueX%@e9wzpLds1L6TMEd)@um4+^s@?sysiRxa(JPg}Yr`xm!D zRaSO@cA)ig8@e@S8=m!1E1GpLq!sgPqvA=XvMRc7=+Z$Xl1AKgnwryhTkIt?yCNL+$by?pIw0); zQ#aHtIx?O52;HV*ffOg@Kv%4eggqEId3L$Lu*5l0a_i~1D}}&fEM7jWYR+XT6?&*F z?g0%?>ffZeLj;x-<1z^NfMz9Y$uvXuV}+Kz(W4kKju&+=H)5{>5$jFxPJ(e6Sb8<3PRXn7&iGfmYX%BqarU> zLKp%@!ab%b7}8MJMCz?PiyVlQ>_5O~8XYD=5I_At2rY*l24p2hZDIAe{}S#AMoj%w ztMRXmEGb)Q;BJ~nS`$u8XuU6Cyrve*i7-`+RO$nZ(3^+muk^nzssLW-r&>%6KxN`4 z@VM799`f^RKWug$(Hx9cl2w!13R1F7I>uj_yimGn;4w>kyC(f~D4vkcw#lb|wA32D zy~kl1ASnLN%6#iFoCb|B{S~c6zXj1|yuy(0p+hC}=IdWC)XN=jr7OSv@( z2|TQ-e>EFmpb^e*!bKDdzmtIDn2VRAW}p;D#Kj2}F<+7-qw8Z9i^GWaY5@}5JE5}Q zn*bPK7XQkAb$aeV{!17SOOy{`95Xawq(5k|+~d-g)WY(`3L;?n)%sRZQB#jm3{SBXXxN;!0K%1KnONh#3{E1 z+t*{puj}LG&&LU(!jIO=d?`n_@GRd>zG(M`d4K(4XXX>b zk7J0;-(H_Ev9<2!E=r3u#a^ZTi7OVLAv>zOoXt@Fd;w`j)Sx>by z{>zV#Q3bsOo5w?gvEpU^eY}ElV_{U~Az{>uk#ip*)A`j)tpQz>#V-Hzz#y_sU>`wz z9?+CS6T#)WTu&Gk-~s{wsJsL09017Vy#xgC!jJGB zs&HV69wmUv9e`X8R(KCyI16^X7mEG~*rkpz3A*nIBJANtSfWMNnMd$CLGYqNW&?TH zfHv?zB{H=La$x}S&#+%*z|7DoC1B3me_5irNII;@>1p|9t(^~8=7w-CMI$8WDgxK$ nv7T5#20E6lB1uOVJ`Y0g=zN8nJE`LEln9(iw6xMHGD!aeKVART diff --git a/polly/lib/External/isl/include/isl/ast_build.h b/polly/lib/External/isl/include/isl/ast_build.h index 1ee932c..bf08e03 100644 --- a/polly/lib/External/isl/include/isl/ast_build.h +++ b/polly/lib/External/isl/include/isl/ast_build.h @@ -94,22 +94,22 @@ __isl_give isl_ast_build *isl_ast_build_set_create_leaf( __isl_give isl_ast_node *(*fn)(__isl_take isl_ast_build *build, void *user), void *user); -__isl_export +__isl_overload __isl_give isl_ast_expr *isl_ast_build_expr_from_set( __isl_keep isl_ast_build *build, __isl_take isl_set *set); -__isl_export +__isl_overload __isl_give isl_ast_expr *isl_ast_build_expr_from_pw_aff( __isl_keep isl_ast_build *build, __isl_take isl_pw_aff *pa); -__isl_export +__isl_overload __isl_give isl_ast_expr *isl_ast_build_access_from_pw_multi_aff( __isl_keep isl_ast_build *build, __isl_take isl_pw_multi_aff *pma); -__isl_export +__isl_overload __isl_give isl_ast_expr *isl_ast_build_access_from_multi_pw_aff( __isl_keep isl_ast_build *build, __isl_take isl_multi_pw_aff *mpa); -__isl_export +__isl_overload __isl_give isl_ast_expr *isl_ast_build_call_from_pw_multi_aff( __isl_keep isl_ast_build *build, __isl_take isl_pw_multi_aff *pma); -__isl_export +__isl_overload __isl_give isl_ast_expr *isl_ast_build_call_from_multi_pw_aff( __isl_keep isl_ast_build *build, __isl_take isl_multi_pw_aff *mpa); diff --git a/polly/lib/External/isl/isl_affine_hull.c b/polly/lib/External/isl/isl_affine_hull.c index 1c2b212d..cb95b5c 100644 --- a/polly/lib/External/isl/isl_affine_hull.c +++ b/polly/lib/External/isl/isl_affine_hull.c @@ -628,7 +628,7 @@ __isl_give isl_basic_set *isl_basic_set_drop_constraints_involving_dims( /* Drop constraints from "map" by applying "drop" to each basic map. */ -__isl_give isl_map *drop_constraints(__isl_take isl_map *map, +static __isl_give isl_map *drop_constraints(__isl_take isl_map *map, enum isl_dim_type type, unsigned first, unsigned n, __isl_give isl_basic_map *(*drop)(__isl_take isl_basic_map *bmap, enum isl_dim_type type, unsigned first, unsigned n)) diff --git a/polly/lib/External/isl/isl_coalesce.c b/polly/lib/External/isl/isl_coalesce.c index 20da8db..6d2e956 100644 --- a/polly/lib/External/isl/isl_coalesce.c +++ b/polly/lib/External/isl/isl_coalesce.c @@ -3,7 +3,7 @@ * Copyright 2010 INRIA Saclay * Copyright 2012-2013 Ecole Normale Superieure * Copyright 2014 INRIA Rocquencourt - * Copyright 2016 Sven Verdoolaege + * Copyright 2016 INRIA Paris * * Use of this software is governed by the MIT license * @@ -14,6 +14,8 @@ * and Ecole Normale Superieure, 45 rue d’Ulm, 75230 Paris, France * and Inria Paris - Rocquencourt, Domaine de Voluceau - Rocquencourt, * B.P. 105 - 78153 Le Chesnay, France + * and Centre de Recherche Inria de Paris, 2 rue Simone Iff - Voie DQ12, + * CS 42112, 75589 Paris Cedex 12, France */ #include @@ -2364,6 +2366,7 @@ static enum isl_change coalesce_with_expanded_divs( init_status(info_i); bmap = isl_basic_map_copy(bmap); bmap = isl_basic_map_expand_divs(bmap, isl_mat_copy(div), exp); + bmap = isl_basic_map_mark_final(bmap); if (!bmap) goto error; diff --git a/polly/lib/External/isl/isl_convex_hull.c b/polly/lib/External/isl/isl_convex_hull.c index e61139f..2be7187 100644 --- a/polly/lib/External/isl/isl_convex_hull.c +++ b/polly/lib/External/isl/isl_convex_hull.c @@ -86,7 +86,12 @@ int isl_basic_set_constraint_is_redundant(struct isl_basic_set **bset, * Since some constraints may be mutually redundant, sort the constraints * first such that constraints that involve existentially quantified * variables are considered for removal before those that do not. - * The sorting is also need for the use in map_simple_hull. + * The sorting is also needed for the use in map_simple_hull. + * + * Note that isl_tab_detect_implicit_equalities may also end up + * marking some constraints as redundant. Make sure the constraints + * are preserved and undo those marking such that isl_tab_detect_redundant + * can consider the constraints in the sorted order. * * Alternatively, we could have intersected the basic map with the * corresponding equality and then checked if the dimension was that @@ -110,8 +115,14 @@ __isl_give isl_basic_map *isl_basic_map_remove_redundancies( bmap = isl_basic_map_sort_constraints(bmap); tab = isl_tab_from_basic_map(bmap, 0); + if (!tab) + goto error; + tab->preserve = 1; if (isl_tab_detect_implicit_equalities(tab) < 0) goto error; + if (isl_tab_restore_redundant(tab) < 0) + goto error; + tab->preserve = 0; if (isl_tab_detect_redundant(tab) < 0) goto error; bmap = isl_basic_map_update_from_tab(bmap, tab); diff --git a/polly/lib/External/isl/isl_equalities.c b/polly/lib/External/isl/isl_equalities.c index caefd52..07b053e 100644 --- a/polly/lib/External/isl/isl_equalities.c +++ b/polly/lib/External/isl/isl_equalities.c @@ -689,7 +689,8 @@ static struct isl_basic_set *compress_variables( isl_mat_free(*T2); *T2 = NULL; } - return isl_basic_set_set_to_empty(bset); + bset = isl_basic_set_set_to_empty(bset); + return return_with_identity(bset, T, T2); } bset = isl_basic_set_preimage(bset, T ? isl_mat_copy(TC) : TC); diff --git a/polly/lib/External/isl/isl_map.c b/polly/lib/External/isl/isl_map.c index 27eff8e..5d22aa2 100644 --- a/polly/lib/External/isl/isl_map.c +++ b/polly/lib/External/isl/isl_map.c @@ -3,6 +3,7 @@ * Copyright 2010 INRIA Saclay * Copyright 2012-2014 Ecole Normale Superieure * Copyright 2014 INRIA Rocquencourt + * Copyright 2016 INRIA Paris * Copyright 2016 Sven Verdoolaege * * Use of this software is governed by the MIT license @@ -14,6 +15,8 @@ * and Ecole Normale Superieure, 45 rue d’Ulm, 75230 Paris, France * and Inria Paris - Rocquencourt, Domaine de Voluceau - Rocquencourt, * B.P. 105 - 78153 Le Chesnay, France + * and Centre de Recherche Inria de Paris, 2 rue Simone Iff - Voie DQ12, + * CS 42112, 75589 Paris Cedex 12, France */ #include diff --git a/polly/lib/External/isl/isl_output.c b/polly/lib/External/isl/isl_output.c index c9c0265..a5fb459 100644 --- a/polly/lib/External/isl/isl_output.c +++ b/polly/lib/External/isl/isl_output.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -729,24 +730,52 @@ static __isl_give isl_printer *print_div_list(__isl_take isl_printer *p, return p; } -/* Does printing "bmap" require an "exists" clause? +/* Does printing an object with local variables described by "div" + * require an "exists" clause? * That is, are there any local variables without an explicit representation? + * An exists clause is also needed in "dump" mode because + * explicit div representations are not printed inline in that case. */ -static isl_bool need_exists(__isl_keep isl_printer *p, - __isl_keep isl_basic_map *bmap, __isl_keep isl_mat *div) +static isl_bool need_exists(__isl_keep isl_printer *p, __isl_keep isl_mat *div) { - int i; + int i, n; - if (!p || !bmap) + if (!p || !div) return isl_bool_error; - if (bmap->n_div == 0) + n = isl_mat_rows(div); + if (n == 0) return isl_bool_false; - for (i = 0; i < bmap->n_div; ++i) + if (p->dump) + return isl_bool_true; + for (i = 0; i < n; ++i) if (!can_print_div_expr(p, div, i)) return isl_bool_true; return isl_bool_false; } +/* Print the start of an exists clause, i.e., + * + * (exists variables: + * + * In dump mode, local variables with an explicit definition are printed + * as well because they will not be printed inline. + */ +static __isl_give isl_printer *open_exists(__isl_take isl_printer *p, + __isl_keep isl_space *space, __isl_keep isl_mat *div, int latex) +{ + int dump; + + if (!p) + return NULL; + + dump = p->dump; + p = isl_printer_print_str(p, s_open_exists[latex]); + p = print_div_list(p, space, div, latex, dump); + p = isl_printer_print_str(p, ": "); + + return p; +} + /* Print the constraints of "bmap" to "p". * The names of the variables are taken from "space". * "latex" is set if the constraints should be printed in LaTeX format. @@ -763,15 +792,9 @@ static __isl_give isl_printer *print_disjunct(__isl_keep isl_basic_map *bmap, return NULL; dump = p->dump; div = isl_basic_map_get_divs(bmap); - if (dump) - exists = bmap->n_div > 0; - else - exists = need_exists(p, bmap, div); - if (exists >= 0 && exists) { - p = isl_printer_print_str(p, s_open_exists[latex]); - p = print_div_list(p, space, div, latex, dump); - p = isl_printer_print_str(p, ": "); - } + exists = need_exists(p, div); + if (exists >= 0 && exists) + p = open_exists(p, space, div, latex); if (dump) div = isl_mat_free(div); @@ -851,6 +874,23 @@ static __isl_give isl_printer *isl_set_print_omega(__isl_keep isl_set *set, return p; } +/* Print the list of parameters in "space", followed by an arrow, to "p", + * if there are any parameters. + */ +static __isl_give isl_printer *print_param_tuple(__isl_take isl_printer *p, + __isl_keep isl_space *space, struct isl_print_space_data *data) +{ + if (!p || !space) + return isl_printer_free(p); + if (isl_space_dim(space, isl_dim_param) == 0) + return p; + + p = print_tuple(space, p, isl_dim_param, data); + p = isl_printer_print_str(p, s_to[data->latex]); + + return p; +} + static __isl_give isl_printer *isl_basic_map_print_isl( __isl_keep isl_basic_map *bmap, __isl_take isl_printer *p, int latex) @@ -858,10 +898,7 @@ static __isl_give isl_printer *isl_basic_map_print_isl( struct isl_print_space_data data = { .latex = latex }; int rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL); - if (isl_basic_map_dim(bmap, isl_dim_param) > 0) { - p = print_tuple(bmap->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, bmap->dim, &data); p = isl_printer_print_str(p, "{ "); p = isl_print_space(bmap->dim, p, rational, &data); p = isl_printer_print_str(p, " : "); @@ -1224,10 +1261,7 @@ static __isl_give isl_printer *isl_map_print_isl(__isl_keep isl_map *map, { struct isl_print_space_data data = { 0 }; - if (isl_map_dim(map, isl_dim_param) > 0) { - p = print_tuple(map->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, s_to[0]); - } + p = print_param_tuple(p, map->dim, &data); p = isl_printer_print_str(p, s_open_set[0]); p = isl_map_print_isl_body(map, p); p = isl_printer_print_str(p, s_close_set[0]); @@ -1240,10 +1274,7 @@ static __isl_give isl_printer *print_latex_map(__isl_keep isl_map *map, struct isl_print_space_data data = { 0 }; data.latex = 1; - if (isl_map_dim(map, isl_dim_param) > 0) { - p = print_tuple(map->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, s_to[1]); - } + p = print_param_tuple(p, map->dim, &data); p = isl_printer_print_str(p, s_open_set[1]); data.print_dim = &print_dim_eq; data.user = aff; @@ -1383,14 +1414,11 @@ static __isl_give isl_printer *isl_union_map_print_isl( { struct isl_union_print_data data; struct isl_print_space_data space_data = { 0 }; - isl_space *dim; + isl_space *space; - dim = isl_union_map_get_space(umap); - if (isl_space_dim(dim, isl_dim_param) > 0) { - p = print_tuple(dim, p, isl_dim_param, &space_data); - p = isl_printer_print_str(p, s_to[0]); - } - isl_space_free(dim); + space = isl_union_map_get_space(umap); + p = print_param_tuple(p, space, &space_data); + isl_space_free(space); p = isl_printer_print_str(p, s_open_set[0]); data.p = p; data.first = 1; @@ -1612,10 +1640,7 @@ static __isl_give isl_printer *print_qpolynomial_isl(__isl_take isl_printer *p, if (!p || !qp) goto error; - if (isl_space_dim(qp->dim, isl_dim_param) > 0) { - p = print_tuple(qp->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, qp->dim, &data); p = isl_printer_print_str(p, "{ "); if (!isl_space_is_params(qp->dim)) { p = isl_print_space(qp->dim, p, 0, &data); @@ -1757,10 +1782,7 @@ static __isl_give isl_printer *print_pw_qpolynomial_isl( if (!p || !pwqp) goto error; - if (isl_space_dim(pwqp->dim, isl_dim_param) > 0) { - p = print_tuple(pwqp->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, pwqp->dim, &data); p = isl_printer_print_str(p, "{ "); if (pwqp->n == 0) { if (!isl_space_is_set(pwqp->dim)) { @@ -1821,10 +1843,7 @@ static __isl_give isl_printer *print_pw_qpolynomial_fold_isl( { struct isl_print_space_data data = { 0 }; - if (isl_space_dim(pwf->dim, isl_dim_param) > 0) { - p = print_tuple(pwf->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, pwf->dim, &data); p = isl_printer_print_str(p, "{ "); if (pwf->n == 0) { if (!isl_space_is_set(pwf->dim)) { @@ -2063,14 +2082,11 @@ static __isl_give isl_printer *print_union_pw_qpolynomial_isl( { struct isl_union_print_data data; struct isl_print_space_data space_data = { 0 }; - isl_space *dim; + isl_space *space; - dim = isl_union_pw_qpolynomial_get_space(upwqp); - if (isl_space_dim(dim, isl_dim_param) > 0) { - p = print_tuple(dim, p, isl_dim_param, &space_data); - p = isl_printer_print_str(p, " -> "); - } - isl_space_free(dim); + space = isl_union_pw_qpolynomial_get_space(upwqp); + p = print_param_tuple(p, space, &space_data); + isl_space_free(space); p = isl_printer_print_str(p, "{ "); data.p = p; data.first = 1; @@ -2208,14 +2224,11 @@ static __isl_give isl_printer *print_union_pw_qpolynomial_fold_isl( { struct isl_union_print_data data; struct isl_print_space_data space_data = { 0 }; - isl_space *dim; + isl_space *space; - dim = isl_union_pw_qpolynomial_fold_get_space(upwf); - if (isl_space_dim(dim, isl_dim_param) > 0) { - p = print_tuple(dim, p, isl_dim_param, &space_data); - p = isl_printer_print_str(p, " -> "); - } - isl_space_free(dim); + space = isl_union_pw_qpolynomial_fold_get_space(upwf); + p = print_param_tuple(p, space, &space_data); + isl_space_free(space); p = isl_printer_print_str(p, "{ "); data.p = p; data.first = 1; @@ -2243,17 +2256,43 @@ error: return NULL; } +/* Print the isl_constraint "c" to "p". + */ __isl_give isl_printer *isl_printer_print_constraint(__isl_take isl_printer *p, __isl_keep isl_constraint *c) { - isl_basic_map *bmap; + struct isl_print_space_data data = { 0 }; + isl_local_space *ls; + isl_space *space; + isl_bool exists; if (!p || !c) goto error; - bmap = isl_basic_map_from_constraint(isl_constraint_copy(c)); - p = isl_printer_print_basic_map(p, bmap); - isl_basic_map_free(bmap); + ls = isl_constraint_get_local_space(c); + if (!ls) + return isl_printer_free(p); + space = isl_local_space_get_space(ls); + p = print_param_tuple(p, space, &data); + p = isl_printer_print_str(p, "{ "); + p = isl_print_space(space, p, 0, &data); + p = isl_printer_print_str(p, " : "); + exists = need_exists(p, ls->div); + if (exists < 0) + p = isl_printer_free(p); + if (exists >= 0 && exists) + p = open_exists(p, space, ls->div, 0); + p = print_affine_of_len(space, ls->div, p, c->v->el, c->v->size); + if (isl_constraint_is_equality(c)) + p = isl_printer_print_str(p, " = 0"); + else + p = isl_printer_print_str(p, " >= 0"); + if (exists >= 0 && exists) + p = isl_printer_print_str(p, s_close_exists[0]); + p = isl_printer_print_str(p, " }"); + isl_space_free(space); + isl_local_space_free(ls); + return p; error: isl_printer_free(p); @@ -2268,10 +2307,7 @@ static __isl_give isl_printer *isl_printer_print_space_isl( if (!space) goto error; - if (isl_space_dim(space, isl_dim_param) > 0) { - p = print_tuple(space, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, space, &data); p = isl_printer_print_str(p, "{ "); if (isl_space_is_params(space)) @@ -2310,10 +2346,7 @@ __isl_give isl_printer *isl_printer_print_local_space(__isl_take isl_printer *p, if (!ls) goto error; - if (isl_local_space_dim(ls, isl_dim_param) > 0) { - p = print_tuple(ls->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, ls->dim, &data); p = isl_printer_print_str(p, "{ "); p = isl_print_space(ls->dim, p, 0, &data); n_div = isl_local_space_dim(ls, isl_dim_div); @@ -2379,10 +2412,7 @@ static __isl_give isl_printer *print_aff_isl(__isl_take isl_printer *p, if (!aff) goto error; - if (isl_local_space_dim(aff->ls, isl_dim_param) > 0) { - p = print_tuple(aff->ls->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, aff->ls->dim, &data); p = isl_printer_print_str(p, "{ "); p = print_aff(p, aff); p = isl_printer_print_str(p, " }"); @@ -2425,10 +2455,7 @@ static __isl_give isl_printer *print_pw_aff_isl(__isl_take isl_printer *p, if (!pwaff) goto error; - if (isl_space_dim(pwaff->dim, isl_dim_param) > 0) { - p = print_tuple(pwaff->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, pwaff->dim, &data); p = isl_printer_print_str(p, "{ "); p = print_pw_aff_body(p, pwaff); p = isl_printer_print_str(p, " }"); @@ -2648,10 +2675,7 @@ static __isl_give isl_printer *print_union_pw_aff_isl( isl_space *space; space = isl_union_pw_aff_get_space(upa); - if (isl_space_dim(space, isl_dim_param) > 0) { - p = print_tuple(space, p, isl_dim_param, &data); - p = isl_printer_print_str(p, s_to[0]); - } + p = print_param_tuple(p, space, &data); isl_space_free(space); p = print_union_pw_aff_body(p, upa); return p; @@ -2711,10 +2735,7 @@ static __isl_give isl_printer *print_multi_aff_isl(__isl_take isl_printer *p, if (!maff) goto error; - if (isl_space_dim(maff->space, isl_dim_param) > 0) { - p = print_tuple(maff->space, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, maff->space, &data); p = isl_printer_print_str(p, "{ "); p = print_multi_aff(p, maff); p = isl_printer_print_str(p, " }"); @@ -2771,10 +2792,7 @@ static __isl_give isl_printer *print_pw_multi_aff_isl(__isl_take isl_printer *p, if (!pma) goto error; - if (isl_space_dim(pma->dim, isl_dim_param) > 0) { - p = print_tuple(pma->dim, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, pma->dim, &data); p = isl_printer_print_str(p, "{ "); p = print_pw_multi_aff_body(p, pma); p = isl_printer_print_str(p, " }"); @@ -2873,10 +2891,7 @@ static __isl_give isl_printer *print_union_pw_multi_aff_isl( isl_space *space; space = isl_union_pw_multi_aff_get_space(upma); - if (isl_space_dim(space, isl_dim_param) > 0) { - p = print_tuple(space, p, isl_dim_param, &space_data); - p = isl_printer_print_str(p, s_to[0]); - } + p = print_param_tuple(p, space, &space_data); isl_space_free(space); p = isl_printer_print_str(p, s_open_set[0]); data.p = p; @@ -2955,10 +2970,7 @@ static __isl_give isl_printer *print_multi_pw_aff_isl(__isl_take isl_printer *p, if (!mpa) return isl_printer_free(p); - if (isl_space_dim(mpa->space, isl_dim_param) > 0) { - p = print_tuple(mpa->space, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, mpa->space, &data); p = isl_printer_print_str(p, "{ "); data.print_dim = &print_dim_mpa; data.user = mpa; @@ -3007,10 +3019,7 @@ static __isl_give isl_printer *print_multi_val_isl(__isl_take isl_printer *p, if (!mv) return isl_printer_free(p); - if (isl_space_dim(mv->space, isl_dim_param) > 0) { - p = print_tuple(mv->space, p, isl_dim_param, &data); - p = isl_printer_print_str(p, " -> "); - } + p = print_param_tuple(p, mv->space, &data); p = isl_printer_print_str(p, "{ "); data.print_dim = &print_dim_mv; data.user = mv; @@ -3065,11 +3074,7 @@ static __isl_give isl_printer *print_multi_union_pw_aff_isl( isl_space *space; space = isl_multi_union_pw_aff_get_space(mupa); - if (isl_space_dim(space, isl_dim_param) > 0) { - struct isl_print_space_data space_data = { 0 }; - p = print_tuple(space, p, isl_dim_param, &space_data); - p = isl_printer_print_str(p, s_to[0]); - } + p = print_param_tuple(p, space, &data); data.print_dim = &print_union_pw_aff_dim; data.user = mupa; diff --git a/polly/lib/External/isl/isl_schedule_tree.c b/polly/lib/External/isl/isl_schedule_tree.c index b764edd..1bf08453 100644 --- a/polly/lib/External/isl/isl_schedule_tree.c +++ b/polly/lib/External/isl/isl_schedule_tree.c @@ -1,6 +1,7 @@ /* * Copyright 2013-2014 Ecole Normale Superieure * Copyright 2014 INRIA Rocquencourt + * Copyright 2016 INRIA Paris * * Use of this software is governed by the MIT license * @@ -8,6 +9,8 @@ * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France * and Inria Paris - Rocquencourt, Domaine de Voluceau - Rocquencourt, * B.P. 105 - 78153 Le Chesnay, France + * and Centre de Recherche Inria de Paris, 2 rue Simone Iff - Voie DQ12, + * CS 42112, 75589 Paris Cedex 12, France */ #include diff --git a/polly/lib/External/isl/isl_scheduler.c b/polly/lib/External/isl/isl_scheduler.c index 709e1ab..cc4794c 100644 --- a/polly/lib/External/isl/isl_scheduler.c +++ b/polly/lib/External/isl/isl_scheduler.c @@ -2,6 +2,7 @@ * Copyright 2011 INRIA Saclay * Copyright 2012-2014 Ecole Normale Superieure * Copyright 2015-2016 Sven Verdoolaege + * Copyright 2016 INRIA Paris * * Use of this software is governed by the MIT license * @@ -9,6 +10,8 @@ * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, * 91893 Orsay, France * and Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France + * and Centre de Recherche Inria de Paris, 2 rue Simone Iff - Voie DQ12, + * CS 42112, 75589 Paris Cedex 12, France */ #include diff --git a/polly/lib/External/isl/isl_tab.c b/polly/lib/External/isl/isl_tab.c index ceaaeff..e38c7fe 100644 --- a/polly/lib/External/isl/isl_tab.c +++ b/polly/lib/External/isl/isl_tab.c @@ -3378,6 +3378,29 @@ static int ununrestrict(struct isl_tab *tab, struct isl_tab_var *var) return 0; } +/* Unmark the last redundant row in "tab" as being redundant. + * This undoes part of the modifications performed by isl_tab_mark_redundant. + * In particular, remove the redundant mark and make + * sure the sample value respects the constraint again. + * A variable that is marked non-negative by isl_tab_mark_redundant + * is covered by a separate undo record. + */ +static isl_stat restore_last_redundant(struct isl_tab *tab) +{ + struct isl_tab_var *var; + + if (tab->n_redundant < 1) + isl_die(isl_tab_get_ctx(tab), isl_error_internal, + "no redundant rows", return isl_stat_error); + + var = isl_tab_var_from_row(tab, tab->n_redundant - 1); + var->is_redundant = 0; + tab->n_redundant--; + restore_row(tab, var); + + return isl_stat_ok; +} + static int perform_undo_var(struct isl_tab *tab, struct isl_tab_undo *undo) WARN_UNUSED; static int perform_undo_var(struct isl_tab *tab, struct isl_tab_undo *undo) { @@ -3387,10 +3410,10 @@ static int perform_undo_var(struct isl_tab *tab, struct isl_tab_undo *undo) var->is_nonneg = 0; break; case isl_tab_undo_redundant: - var->is_redundant = 0; - tab->n_redundant--; - restore_row(tab, isl_tab_var_from_row(tab, tab->n_redundant)); - break; + if (!var->is_row || var->index != tab->n_redundant - 1) + isl_die(isl_tab_get_ctx(tab), isl_error_internal, + "not undoing last redundant row", return -1); + return restore_last_redundant(tab); case isl_tab_undo_freeze: var->frozen = 0; break; @@ -3429,6 +3452,36 @@ static int perform_undo_var(struct isl_tab *tab, struct isl_tab_undo *undo) return 0; } +/* Restore all rows that have been marked redundant by isl_tab_mark_redundant + * and that have been preserved in the tableau. + * Note that isl_tab_mark_redundant may also have marked some variables + * as being non-negative before marking them redundant. These need + * to be removed as well as otherwise some constraints could end up + * getting marked redundant with respect to the variable. + */ +isl_stat isl_tab_restore_redundant(struct isl_tab *tab) +{ + if (!tab) + return isl_stat_error; + + if (tab->need_undo) + isl_die(isl_tab_get_ctx(tab), isl_error_invalid, + "manually restoring redundant constraints " + "interferes with undo history", + return isl_stat_error); + + while (tab->n_redundant > 0) { + if (tab->row_var[tab->n_redundant - 1] >= 0) { + struct isl_tab_var *var; + + var = isl_tab_var_from_row(tab, tab->n_redundant - 1); + var->is_nonneg = 0; + } + restore_last_redundant(tab); + } + return isl_stat_ok; +} + /* Undo the addition of an integer division to the basic map representation * of "tab" in position "pos". */ diff --git a/polly/lib/External/isl/isl_tab.h b/polly/lib/External/isl/isl_tab.h index afb50a6..df5642e 100644 --- a/polly/lib/External/isl/isl_tab.h +++ b/polly/lib/External/isl/isl_tab.h @@ -201,6 +201,7 @@ int isl_tab_detect_implicit_equalities(struct isl_tab *tab) WARN_UNUSED; __isl_give isl_basic_map *isl_tab_make_equalities_explicit(struct isl_tab *tab, __isl_take isl_basic_map *bmap); int isl_tab_detect_redundant(struct isl_tab *tab) WARN_UNUSED; +isl_stat isl_tab_restore_redundant(struct isl_tab *tab); #define ISL_TAB_SAVE_DUAL (1 << 0) enum isl_lp_result isl_tab_min(struct isl_tab *tab, isl_int *f, isl_int denom, isl_int *opt, isl_int *opt_denom, diff --git a/polly/lib/External/isl/isl_test.c b/polly/lib/External/isl/isl_test.c index 3353c3d..1ebfef3 100644 --- a/polly/lib/External/isl/isl_test.c +++ b/polly/lib/External/isl/isl_test.c @@ -2430,6 +2430,33 @@ static int test_min_special(isl_ctx *ctx) return 0; } +/* A specialized isl_set_min_val test case that would return an error + * in earlier versions of isl. + */ +static int test_min_special2(isl_ctx *ctx) +{ + const char *str; + isl_basic_set *bset; + isl_aff *obj; + isl_val *res; + + str = "{ [i, j, k] : 2j = i and 2k = i + 1 and i >= 2 }"; + bset = isl_basic_set_read_from_str(ctx, str); + + obj = isl_aff_read_from_str(ctx, "{ [i, j, k] -> [i] }"); + + res = isl_basic_set_max_val(bset, obj); + + isl_basic_set_free(bset); + isl_aff_free(obj); + isl_val_free(res); + + if (!res) + return -1; + + return 0; +} + struct { const char *set; const char *obj; @@ -2476,6 +2503,8 @@ static int test_min(struct isl_ctx *ctx) if (test_min_special(ctx) < 0) return -1; + if (test_min_special2(ctx) < 0) + return -1; return 0; } @@ -4550,6 +4579,35 @@ int test_aff(isl_ctx *ctx) return 0; } +/* Check that the computation below results in a single expression. + * One or two expressions may result depending on which constraint + * ends up being considered as redundant with respect to the other + * constraints after the projection that is performed internally + * by isl_set_dim_min. + */ +static int test_dim_max_1(isl_ctx *ctx) +{ + const char *str; + isl_set *set; + isl_pw_aff *pa; + int n; + + str = "[n] -> { [a, b] : n >= 0 and 4a >= -4 + n and b >= 0 and " + "-4a <= b <= 3 and b < n - 4a }"; + set = isl_set_read_from_str(ctx, str); + pa = isl_set_dim_min(set, 0); + n = isl_pw_aff_n_piece(pa); + isl_pw_aff_free(pa); + + if (!pa) + return -1; + if (n != 1) + isl_die(ctx, isl_error_unknown, "expecting single expression", + return -1); + + return 0; +} + int test_dim_max(isl_ctx *ctx) { int equal; @@ -4559,6 +4617,9 @@ int test_dim_max(isl_ctx *ctx) isl_map *map; isl_pw_aff *pwaff; + if (test_dim_max_1(ctx) < 0) + return -1; + str = "[N] -> { [i] : 0 <= i <= min(N,10) }"; set = isl_set_read_from_str(ctx, str); pwaff = isl_set_dim_max(set, 0); diff --git a/polly/lib/External/isl/ltmain.sh b/polly/lib/External/isl/ltmain.sh index 147d758..2ad8be8 100644 --- a/polly/lib/External/isl/ltmain.sh +++ b/polly/lib/External/isl/ltmain.sh @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.6 Debian-2.4.6-0.1" +VERSION="2.4.6 Debian-2.4.6-1" package_revision=2.4.6 @@ -1977,7 +1977,7 @@ func_version () # End: # Set a version string. -scriptversion='(GNU libtool) 2.4.6' +scriptversion='(GNU libtool) 2.4.6 Debian-2.4.6-1' # func_echo ARG... @@ -2068,7 +2068,7 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname (GNU libtool) 2.4.6 + version: $progname $scriptversion automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` diff --git a/polly/lib/External/isl/m4/libtool.m4 b/polly/lib/External/isl/m4/libtool.m4 index 10ab2844..ee80844 100644 --- a/polly/lib/External/isl/m4/libtool.m4 +++ b/polly/lib/External/isl/m4/libtool.m4 @@ -728,7 +728,6 @@ _LT_CONFIG_SAVE_COMMANDS([ cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. -- 2.7.4