1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
|
# Contributor: Travis Tilley <ttilley@gmail.com>
# Maintainer: Travis Tilley <ttilley@gmail.com>
pkgname=llvm
pkgver=3.6.1
pkgrel=0
use_svn="false"
pkgdesc="low level virtual machine compiler system"
arch="x86 x86_64 armhf"
url="http://llvm.org/"
license="UOI-NCSA"
depends=""
depends_dev="perl"
makedepends="$depends_dev cmake make flex bison groff musl-dev binutils-dev libffi-dev libxml2-dev libxml2-utils zlib-dev ncurses-dev python python-dev py-sphinx chrpath"
[ "${use_svn}" = "true" ] && makedepends="$makedepends subversion"
install=
subpackages="clang clang-doc:clang_doc $pkgname-dev $pkgname-doc $pkgname-libs"
source="
llvm-0001-fix-shared-build.patch
llvm-0002-musl-triple.patch
llvm-0003-musl-hacks.patch
compiler-rt-0001-musl-no-dlvsym.patch
compiler-rt-0002-musl-no-sanitizers.patch
compiler-rt-0003-off_t.patch
clang-0001-fix-stdint.h.patch
clang-0002-fix-unwind-header.patch
clang-0003-add-alpine-linux-distro.patch
clang-0004-alpine-use-z-relro.patch
clang-0005-alpine-hash-style-gnu.patch
clang-0006-musl-alpine-triple.patch
clang-0007-musl-dynamic-linker-paths.patch
clang-0008-alpine-PIE-by-default.patch
clang-0009-pass-host-triple-to-compiler-rt.patch
"
if [ "${use_svn}" != "true" ]; then
source="$source
http://llvm.org/releases/$pkgver/llvm-$pkgver.src.tar.xz
http://llvm.org/releases/$pkgver/cfe-$pkgver.src.tar.xz
http://llvm.org/releases/$pkgver/clang-tools-extra-$pkgver.src.tar.xz
http://llvm.org/releases/$pkgver/compiler-rt-$pkgver.src.tar.xz"
fi
_builddir="$srcdir"/build
_bootstrap_prefix="$srcdir"/bootstrap
_cmake_flags="\
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_VERBOSE_MAKEFILE=NO \
"
# the binutils include directory setting appears to be necessary in order to
# build the LLVMGold plugin, even if the headers are in /usr/include and easily
# detected.
# auto-detection of both go and ocaml are explicitly disabled here, as they
# currently do not compile.
_cmake_common_flags="\
${_cmake_flags} \
-DLLVM_DEFAULT_TARGET_TRIPLE=$CBUILD \
-DLLVM_HOST_TRIPLE=$CHOST \
-DLLVM_BINUTILS_INCDIR=/usr/include \
-DLLVM_ENABLE_ASSERTIONS=NO \
-DLLVM_ENABLE_FFI=YES \
-DLLVM_ENABLE_LIBCXX=NO \
-DLLVM_ENABLE_PIC=YES \
-DLLVM_ENABLE_ZLIB=YES \
-DLLVM_ENABLE_RTTI=YES \
-DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND \
-DOCAMLFIND=OCAMLFIND-NOTFOUND \
-DCLANG_BUILD_EXAMPLES=NO \
-DLLVM_BUILD_EXAMPLES=NO \
-DLLVM_INCLUDE_EXAMPLES=NO \
-DLIBXML2_INCLUDE_DIR=/usr/include/libxml2 \
"
# attempt to build the bootstrap compiler as quickly as is sane. unfortunately,
# there is no way to turn off ObjC support. we can, however, disable building
# ARCMT (automatic reference counting migration tool), the static analyzer, and
# documentation. also, since we're using the cmake build and not autotools, the
# tests aren't automatically built (targets for testing are emitted, just not
# built as part of the default target).
_cmake_bootstrap_flags="\
${_cmake_common_flags} \
-DCMAKE_INSTALL_PREFIX=${_bootstrap_prefix} \
-DLLVM_TARGETS_TO_BUILD=host \
-DBUILD_SHARED_LIBS=NO \
-DCLANG_ENABLE_ARCMT=NO \
-DCLANG_ENABLE_STATIC_ANALYZER=NO \
-DCLANG_INCLUDE_DOCS=NO \
-DLLVM_ENABLE_CXX1Y=NO \
-DLLVM_ENABLE_SPHINX=NO \
-DLLVM_ENABLE_TERMINFO=NO \
-DLLVM_INCLUDE_DOCS=NO \
-DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_BUILD=NO \
"
# setting compiler-rt to compile as if it were an external build allows it to
# use the freshly built clang to compile, rather than the bootstrap compiler.
# NOTE: there appears to be an issue building compiler-rt as an external project
# and using ninja as the build tool, so stick to good old fashioned makefiles.
_cmake_final_flags="\
${_cmake_common_flags} \
-DCMAKE_INSTALL_PREFIX=/usr \
-DLLVM_TARGETS_TO_BUILD=all \
-DLLVM_BUILD_EXTERNAL_COMPILER_RT=YES \
-DBUILD_SHARED_LIBS=YES \
-DLLVM_BUILD_DOCS=YES \
-DLLVM_ENABLE_CXX1Y=YES \
-DLLVM_ENABLE_SPHINX=YES \
-DLLVM_ENABLE_TERMINFO=YES \
-DLIBCLANG_BUILD_STATIC=YES \
"
_srcdir="$srcdir"/"$pkgname-$pkgver.src"
_srcdir_clang="$_srcdir"/tools/clang
_srcdir_clang_extra="$_srcdir_clang"/tools/extra
_srcdir_compiler_rt="$_srcdir"/projects/compiler-rt
prepare() {
if [[ "${use_svn}" = "true" ]]; then
pkgsvnver="tags/RELEASE_${pkgver//./}/final/"
svn_source="http://llvm.org/svn/llvm-project"
cd "$srcdir"
svn co "$svn_source/llvm/$pkgsvnver" llvm-$pkgver.src
svn co "$svn_source/cfe/$pkgsvnver" cfe-$pkgver.src
svn co "$svn_source/clang-tools-extra/$pkgsvnver" clang-tools-extra-$pkgver.src
svn co "$svn_source/compiler-rt/$pkgsvnver" compiler-rt-$pkgver.src
fi
msg "Preparing LLVM project sources..."
mv "$srcdir"/cfe-$pkgver.src \
"$_srcdir_clang" || return 1
mv "$srcdir"/clang-tools-extra-$pkgver.src \
"$_srcdir_clang_extra" || return 1
mv "$srcdir"/compiler-rt-$pkgver.src \
"$_srcdir_compiler_rt" || return 1
msg "Patching LLVM core..."
cd "$_srcdir" || return 1
update_config_sub || return 1
sed -i -e '/case "\${UNAME_MACHINE}:\${UNAME_SYSTEM}:\${UNAME_RELEASE}:\${UNAME_VERSION}" in/i \' \
-e 'if [ x != "x$CBUILD" ]; then echo "$CBUILD"; exit; fi' \
./autoconf/config.guess || return 1
for i in $source; do
case $i in
llvm-*.patch)
msg "Applying $i..."
patch -s -p1 -N -i "$srcdir"/$i || return 1
;;
esac
done
msg "Patching clang..."
cd "$_srcdir_clang" || return 1
# FIXME: I have never seen these tests pass on any system, be it vanilla clang
# or patched, musl or glibc, autoconf or cmake. It fails on alpine, gentoo,
# and ubuntu.
rm ./test/Driver/lto.c
for i in $source; do
case $i in
clang-*.patch)
msg "Applying $i..."
patch -s -p1 -N -i "$srcdir"/$i || return 1
;;
esac
done
msg "Patching compiler-rt..."
cd "$_srcdir_compiler_rt" || return 1
for i in $source; do
case $i in
compiler-rt-*.patch)
msg "Applying $i..."
patch -s -p1 -N -i "$srcdir"/$i || return 1
;;
esac
done
}
build() {
# cmake is funky. it uses several flag related settings in addition to picking
# up what's in the CFLAGS/CXXFLAGS env variables. to make using any abuild-set
# flags sane, we pass them in as options to cmake and unset the environment
# variables. we also back up the original flags so that we can tweak them
# without losing the original setting (see below re: -fno-devirtualize).
orig_cflags="${CFLAGS}"
orig_cxxflags="${CXXFLAGS}"
unset CFLAGS
unset CXXFLAGS
# just in case those were set to blank strings, we _really_ want to make sure
# we're not building what will effectively be a -O0 build here...
test -z "${orig_cflags}" && orig_cflags="-O3"
test -z "${orig_cxxflags}" && orig_cxxflags="-O3"
# -fno-devirtualize is added here because, to quote the fedora spec file,
# "gcc has scary template-related bugs". the flag is removed post-bootstrap.
# -DNDEBUG is required to disable assertions
cflags="${orig_cflags} -DNDEBUG"
cxxflags="${orig_cxxflags} -DNDEBUG -fno-devirtualize"
# The cmake logic appears to use the result of config.guess in a few places
# even though we override the various triple settings manually. export CBUILD
# to the tweaked config.guess just to be safe.
export CBUILD
# cmake doesn't call out to pkg-config to determine the include path for FFI,
# and since alpine installs the headers to a versioned directory cmake can't
# auto-detect it by guessing either.
ffi_include_dir="$(pkg-config --cflags-only-I libffi | sed 's|^-I||g')"
mkdir -p "$_builddir"
cd "$_builddir"
msg "Compiling bootstrap compiler"
cmake -G "Unix Makefiles" -Wno-dev ${_cmake_bootstrap_flags} \
-DCMAKE_C_FLAGS_RELEASE="${cflags}" \
-DCMAKE_CXX_FLAGS_RELEASE="${cxxflags}" \
-DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}" \
-DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}" \
-DFFI_INCLUDE_DIR="$ffi_include_dir" \
"${_srcdir}" || return 1
make || return 1
make install || return 1
cflags="${orig_cflags} -DNDEBUG"
cxxflags="${orig_cxxflags} -DNDEBUG"
CC="${_bootstrap_prefix}/bin/clang"
CXX="${_bootstrap_prefix}/bin/clang++"
cd ..
rm -rf "$_builddir"
mkdir -p "$_builddir"
cd "$_builddir"
msg "Compiling final compiler"
cmake -G "Unix Makefiles" -Wno-dev ${_cmake_final_flags} \
-DCMAKE_C_COMPILER="${CC}" \
-DCMAKE_CXX_COMPILER="${CXX}" \
-DCMAKE_C_FLAGS_RELEASE="${cflags}" \
-DCMAKE_CXX_FLAGS_RELEASE="${cxxflags}" \
-DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}" \
-DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}" \
-DFFI_INCLUDE_DIR="$ffi_include_dir" \
"${_srcdir}" || return 1
make || return 1
# llvm tests don't run under PaX, almost certainly due to MCJIT
# TODO: detect when running a vanilla kernel and run all tests
# make check-llvm || return 1
make check-clang || return 1
# 27 failures, all related to clang-tidy.
# clang-format/clang-modernize and friends pass their test suites
# make check-clang-tools || return 1
make check-compiler-rt || return 1
}
package() {
cd "$_builddir"
make DESTDIR="$pkgdir" install
rm "$pkgdir"/usr/lib/LLVMHello.so
file "$pkgdir"/usr/lib/*.so | awk -F: '$2~/ELF/{print $1}' | xargs -r chrpath -d
file "$pkgdir"/usr/bin/* | awk -F: '$2~/ELF/{print $1}' | xargs -r chrpath -d
}
clang() {
pkgdesc="A C language family front-end for LLVM"
mkdir -p "$subpkgdir"/usr/bin \
"$subpkgdir"/usr/lib "$subpkgdir"/usr/share/clang "$subpkgdir"/usr/include
mv "$pkgdir"/usr/bin/*clang* \
"$subpkgdir"/usr/bin/ || return 1
mv "$pkgdir"/usr/lib/clang \
"$pkgdir"/usr/lib/libclang* \
"$pkgdir"/usr/lib/libmodernize* \
"$subpkgdir"/usr/lib/ || return 1
mv "$pkgdir"/usr/include/clang "$pkgdir"/usr/include/clang-c \
"$subpkgdir"/usr/include/ || return 1
cp -r "$_srcdir"/tools/clang/tools/scan-build "$subpkgdir"/usr/share/clang/scan-build
cp -r "$_srcdir"/tools/clang/tools/scan-view "$subpkgdir"/usr/share/clang/scan-view
ln -s /usr/share/clang/scan-build/scan-build "$subpkgdir"/usr/bin/scan-build
ln -s /usr/share/clang/scan-view/scan-view "$subpkgdir"/usr/bin/scan-view
}
clang_doc() {
pkgdesc="clang documentation"
mkdir -p "$subpkgdir"/usr/share/doc/ || return 1
mv "$pkgdir"/usr/share/doc/clang "$subpkgdir"/usr/share/doc/ || return 1
}
libs() {
pkgdesc="LLVM shared libraries"
mkdir -p "$subpkgdir"/usr/lib/
mv "$pkgdir"/usr/lib/*.so "$subpkgdir"/usr/lib/
}
md5sums="0947294a8c83c8d7f857dfc16204c4eb llvm-0001-fix-shared-build.patch
d10fc3574c560ccfae3eeacdc4a988f2 llvm-0002-musl-triple.patch
056178d87918d531f531b1b765a59e7c llvm-0003-musl-hacks.patch
346081b2f0825ca7f491155c4b3ca0ea compiler-rt-0001-musl-no-dlvsym.patch
eb3797555357896a92f74bf1bacfbdc2 compiler-rt-0002-musl-no-sanitizers.patch
8bc11d4a60af51a7fc10643bd0970d3a compiler-rt-0003-off_t.patch
eab0123372fa909817ed21cfcffdbe16 clang-0001-fix-stdint.h.patch
069f5cd7a6d0b01eade62bb72aac9e8b clang-0002-fix-unwind-header.patch
93ffbede80bc857c8ae6bed5ff016a52 clang-0003-add-alpine-linux-distro.patch
231fad6dc619ef6a54567c14082bf7af clang-0004-alpine-use-z-relro.patch
2967fea7ed0624d99808bc091be1bab4 clang-0005-alpine-hash-style-gnu.patch
15044d16ec3e46b89f698bf63e73bb08 clang-0006-musl-alpine-triple.patch
e24a82edcd6caa5e405ff67a45d6befc clang-0007-musl-dynamic-linker-paths.patch
6bc4b7047042f9afec452a97c35c2cd5 clang-0008-alpine-PIE-by-default.patch
0ae0c5939c27750c52b39158fbc7a7a9 clang-0009-pass-host-triple-to-compiler-rt.patch
ebf9e97be405ae126e134d3a357cd58a llvm-3.6.1.src.tar.xz
9ff6811757735051f8651833b22ae014 cfe-3.6.1.src.tar.xz
1ad810536f0f7fefd4541a907aff83b3 clang-tools-extra-3.6.1.src.tar.xz
6f204b1feb324b1672ac907b32d927c0 compiler-rt-3.6.1.src.tar.xz"
sha256sums="4f75c2a76cf4c439d65c8e67511cd91c895edf8ccf003a5f94ffa07c29456296 llvm-0001-fix-shared-build.patch
3062c6135b12eab1ff365d1d609193723bb4c6ff3dfa9fcf76fe2b75948668c9 llvm-0002-musl-triple.patch
c6892c843b38c9a852367e5d76ffc29c21bdfd522adbc4c4e3e3c890a513c0db llvm-0003-musl-hacks.patch
94f5626b4729afb39ad00a6cac4f8d44e3ee6f3d87362268bcd2c0ec637edc22 compiler-rt-0001-musl-no-dlvsym.patch
7dd2d22c61892eb651809649606fb3722520a5d12f8d88c2e96be977d0f8b71a compiler-rt-0002-musl-no-sanitizers.patch
45bcfa7d1c757e32183c5cd95703f150ec3d1ed966a9cfa68b13b648e5310e78 compiler-rt-0003-off_t.patch
516a1dbba85731a557840ee3ebc9cc82a2e5ce625cf5b37f5392bd089ef40bdc clang-0001-fix-stdint.h.patch
3be240b78d2371728280ffb15191573c969b304ed784883b79c662ff73c2bc43 clang-0002-fix-unwind-header.patch
78449c4f7c9fdfaccef3b68039c69e7e041fb34862d39c803d7e6fac17f659aa clang-0003-add-alpine-linux-distro.patch
501ab6e3fb99c9ffb82329475051a633797bf824c0dea437843266f190c062a0 clang-0004-alpine-use-z-relro.patch
1c4dbd1d474bf08de5979d6f4399aeba29de9ba8950aa0688d081d82e552d7d3 clang-0005-alpine-hash-style-gnu.patch
772b1492022d1088ccf1c4ac491d9ffa326ad98a3ca8949aa52225b27641642a clang-0006-musl-alpine-triple.patch
c7612168defefcb35cc8c988ff8b519aa983f07a62fd3b2c67f7d468459ca48a clang-0007-musl-dynamic-linker-paths.patch
39c275490e3360d50fe339406992616fad0fa9127204c9b93578ee2403ae850c clang-0008-alpine-PIE-by-default.patch
ec0c2014d455040499f599dc3d690fb92e54baf6058605be5f25c2c845629cfe clang-0009-pass-host-triple-to-compiler-rt.patch
2f00c615913aa0b56607ee1548936e60ad2aa89e6d56f23fb032a4463366fc7a llvm-3.6.1.src.tar.xz
74f92d0c93b86678b015e87655f59474b2f657769680efdeb3c0524ffbd2dad7 cfe-3.6.1.src.tar.xz
f4ee70d870d550a9147ac6a548ce7daf7d9e6897348bf411f43c572966fb92b6 clang-tools-extra-3.6.1.src.tar.xz
fcbf610c77be6047f11ca10c4725610417beba832565115a9e2fcfe2897b649f compiler-rt-3.6.1.src.tar.xz"
sha512sums="b3c0e0f74680e9b2d02f1c923a191ef5eb913be84105e4d63aae6a88b1dac758467cecad3430496a7945cebdc73ec5ee1f643dc5dc7b336fee920e3c8b6d54d2 llvm-0001-fix-shared-build.patch
8088e79c51694d237f0e29a1c9032776f943561aff389f8706f1c10b3b0405d4fa72643fb83c973be55370e89d893f7b7592bb8c64dcf2310369c0d1b7ba5db2 llvm-0002-musl-triple.patch
df8959d43af48054bc35e4125f98e5dab1e1b5beaf7b67e95791caf144efec06764bd31a9eb5efc2179932591de8b862ebf89592d131e47070c89f19412979b7 llvm-0003-musl-hacks.patch
f1e6d17f4cc618b6a1edba64bda652f210d3c839bd8d2d4eff81af0895176062dab1e8fa963d0fe2403311863aee083d257bdb57ad9b44e23a958286a0d2e12b compiler-rt-0001-musl-no-dlvsym.patch
45f64cd5863238b7f7ad2f4a3733455e17eb3ab3121ba3404404f312beb91bb4d109c7c3278f77fc78730086e70cfe6532e159efef30e34af0132ca44a965220 compiler-rt-0002-musl-no-sanitizers.patch
effed16bed6160c1629c72960424afed87f8c1c1290bf4eccd43da5a1fcb5b350242c01fcc1cc7355b420f5ac80231ea7a33ca71cafad884ea4c756cbdfbdd59 compiler-rt-0003-off_t.patch
6ad0a3409eb9c9bd43115c696f2894b683e4659b16b7ce29c7d88c35b3f585c10870c9df224a63fa14ff78810ee829b88a60dbf426f5b36084dfce7541a0cc00 clang-0001-fix-stdint.h.patch
0e3c9fbc70a12986e0531c9c642f9fff97d9d7617fd33ee69ac81d283ee14e86b6de435f1b51478a9c304f787c1b21ebc804d39a57a1ebeedce7308362d93614 clang-0002-fix-unwind-header.patch
0b8108c96948a1704275a93f3b872572fe2c61a0cd3e7f4caf63c0ca262cc079e2424b70f41d20f4a9aebe30333e39e3c594b4240fd41f7bd9a6682e751a23d9 clang-0003-add-alpine-linux-distro.patch
ac72ea29d6f889f2b54915b97d56bc388e849da2f524b872241053fa6bb9dde4eb6b1333813070e3671115121da34c22ff1e87aa19ce82a393166143b30c7de4 clang-0004-alpine-use-z-relro.patch
0594cc85b6cf0be66e747eb7ba6af5aff401d65b4072f3da4a3e531795965f72df5a3850c7abbbe4e1fde3dc6ad583ecfc4a77429531bae02143b5ca36bed37e clang-0005-alpine-hash-style-gnu.patch
7c58ea951c14f6e61c7b687cf9f54ff706d8e400e3af9593879aa124e43d02a0290f1078c8af00365f7c4b8b3e760e8f6edf092f4eee89fdfc053b1b5417d081 clang-0006-musl-alpine-triple.patch
c4365cbf9645e7aacbef2392cd7418c055a45e178e4ad956dfe45eafc90ab1db70ff620dfeeec11a4fab550ec557385f2d75f68adc0830ce74b5ece7077a3baf clang-0007-musl-dynamic-linker-paths.patch
2a217800aefbce07017b793a8c91e174dac20546343de47749b4b07b4905db9a55411ef45e482b8df93cb4dbbdf25415202c3257be36ae095a6f2de11935f80b clang-0008-alpine-PIE-by-default.patch
7628c1b12febb27d0a9ecb846205edec61044fbb963ba5e588863652bccbb05d1436febf8840ff4b47dfb326689bb142464be59a18b17bd5d30aa03bb7e76a9f clang-0009-pass-host-triple-to-compiler-rt.patch
fa07d0fe6c527d86c0b91b1b62597f949d777e3609e4e8ca2ea5e07931e1ebc7a363273cc705cf4a13b45e7ab00716b76de26688d077c1b51341d9dd2972de3f llvm-3.6.1.src.tar.xz
a96944bccfd9341be7adafdcc40367d458e85e7e74b0d2f3a7ea18edf1454d04a232c2d0003d6449c52f81d1e235b434acc1bb63eb5f7d16f8f4a43b70826743 cfe-3.6.1.src.tar.xz
3273f8c1fa1683de231d0c0b9371d4b7537381e939fe38996e70a8005a1e6185da459ace2f260fad41df4840b459448ed1498c2fd576dd560005117a54e2ccb9 clang-tools-extra-3.6.1.src.tar.xz
121c048fe60bccccd4a188a18613c94e1e1d9abd8fbae6405d23418f0c9b3562fff72fe77aea9bc0f8632ec9ad89503b9c67fcab5bf378001f90ad7492a1845a compiler-rt-3.6.1.src.tar.xz"
|