aboutsummaryrefslogtreecommitdiff
path: root/doc/images/coreutils-size-map.png
blob: 21d73a84587fec3ee66c4b78f14f9a8192f0ea62 (about) (plain)
ofshex dumpascii
0000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 02 28 00 00 00 af 08 02 00 00 00 58 45 b2 .PNG........IHDR...(.........XE.
0020 9b 00 00 00 06 62 4b 47 44 00 ff 00 ff 00 ff a0 bd a7 93 00 00 1a 18 49 44 41 54 78 9c ed dd 7d .....bKGD..............IDATx...}
0040 54 13 67 be 07 f0 67 12 11 12 22 88 46 04 a2 14 a8 a2 08 d8 da 45 59 b6 ab 15 ab 14 5f aa bd 6b T.g...g...".F........EY....._..k
0060 ef 41 a0 1e 04 79 11 b5 ca 4b 5b d1 b6 ab b5 75 41 41 ce 55 da 8a 49 15 71 05 45 ba ca 52 6c 05 .A...y...K[....uAA.U..I.q.E..Rl.
0080 69 cf 55 b7 75 cb a2 77 69 51 4b 75 91 53 44 05 41 05 24 a0 bc e4 fe 31 d7 b9 d3 99 64 08 2c 0c i.U.u..wiQKu.SD.A.$....1....d.,.
00a0 31 7c 3f c7 e3 09 f3 3c 33 f3 84 3f 9e df 79 9e 4c be 50 3a 9d 8e 00 00 00 88 45 32 d4 03 00 00 1|?....<3..?..y.L.P:......E2....
00c0 80 e1 05 85 07 00 00 44 85 c2 03 00 00 a2 42 e1 01 00 00 51 a1 f0 00 00 80 a8 50 78 00 00 40 54 .......D......B....Q......Px..@T
00e0 28 3c 00 00 20 2a 14 1e 00 00 10 15 0a 0f 00 00 88 0a 85 07 00 00 44 85 c2 03 00 00 a2 42 e1 01 (<...*................D......B..
0100 10 55 f6 91 9c 59 bf 9f f3 dc 4c df e7 66 fa 12 42 e8 ff 01 86 95 11 43 3d 00 80 a1 f1 dc 4c df .U...Y....L..f..B......C=.....L.
0120 8a 7f 7c 2f fe 7d 0f 1f c9 29 fc 4b be c3 f8 f1 e2 df 1a c0 44 60 c5 03 20 aa 7b f7 ef a3 ea c0 ..|/.}...).K........D`....{.....
0140 30 87 c2 03 c3 85 e6 60 d6 4b 0b 5e a1 f7 b8 98 6d 2e fa 45 d5 b5 6b 21 61 e1 be b3 5f 0a 5d 15 0......`.K.^....m..E..k!a..._.].
0160 71 fd 5f ff a2 9b 52 d2 76 ff c6 ef 45 42 c8 2f b5 b5 ab d7 c4 fe 76 ce dc d7 83 43 2a 2f 5f 66 q._...R.v...EB./......v....C*/_f
0180 5f f3 b9 99 be 7b 3e fe e4 b7 73 e6 2e 5f 11 72 f5 a7 2a ce 89 7a 2f db d3 d3 c3 df 64 13 b8 05 _....{>...s.._.r..*..z/.....d...
01a0 80 19 d2 01 0c 0f 7e 73 e6 fe e5 64 41 47 47 07 fd e3 74 9f 59 4c 53 f0 ca b0 dc 63 79 5a ad 36 ......~s...dAGG...t.YLS....cyZ.6
01c0 f7 58 5e 48 58 38 dd 5a 58 74 aa bb bb 5b a7 d3 ad 8a 8a fe eb 17 45 8f 1e 3d 3a ff ed b7 af 07 .X^HX8.ZXt...[........E..=:.....
01e0 87 b0 af 39 dd 67 d6 b1 fc fc f6 f6 f6 dc 63 79 c1 2b c3 38 27 f2 2f cb be 2f fd 82 fe 5f e0 16 ...9.g........cy.+.8'./../..._..
0200 00 e6 07 2b 1e 18 2e de db 9c 74 b2 b0 f0 e5 85 8b f7 a9 35 9c a6 eb d5 d5 7f 78 6d 99 4c 26 7b ...+......t........5......xm.L&{
0220 6d e9 ab f4 d2 84 10 b2 28 f0 15 89 44 42 08 b9 fa 53 d5 fb 1f 6c 9f f9 e2 ec 75 1b e3 af ff ab m.......(...DB...S...l....u.....
0240 9a 73 ee 6b af be 6a 65 65 f5 1f cb 96 5e af ae e6 9c a8 f7 b2 7a 09 df 02 c0 cc e0 e1 02 18 2e .s.k..jee....^.......z..........
0260 16 05 be b2 28 f0 95 cb 57 af 46 44 af 89 8d 8e b2 b4 b4 6c 6c 6c 54 2a 95 84 90 49 6e 6e 85 45 ....(...W.FD.......lllT*...Inn.E
0280 a7 5e 5d bc a8 a0 f0 8b 67 dd dc e8 fe 52 a9 94 7e 31 75 8a fb 1f 96 2d 0b 98 ff b2 95 95 15 ff .^].....g....R..~1u....-........
02a0 b2 85 45 a7 96 2e 59 fc d7 a2 a2 49 bc 13 f5 5e 56 2f e1 5b 00 98 19 ac 78 60 b8 a0 3f d1 59 bb ..E...Y....I...^V/.[....x`..?.Y.
02c0 21 2e 2a 22 9c 10 12 f4 9f af bf ba fc 75 fa 83 96 3f be bb f9 e4 5f 0b e7 cc 0f f8 e2 d4 97 5b !.*".........u...?...._........[
02e0 df db c2 39 71 c7 07 db 4a 4a 4b e7 05 2e 62 3e 13 62 bb 75 fb f6 9c f9 01 c7 3f 3f f1 fe 96 cd ...9q...JJK...b>.b.u......??....
0300 9c 26 e1 cb 1a 7f 0b 00 33 43 e9 74 ba a1 1e 03 c0 d3 6a a8 9e c9 06 78 aa 61 c5 03 00 00 a2 c2 .&......3C.t......j....x.a......
0320 8a 07 00 00 44 85 15 0f 00 00 88 0a 85 07 00 00 44 85 c2 03 00 00 a2 42 e1 01 00 00 51 a1 f0 00 ....D...........D......B....Q...
0340 00 80 a8 50 78 00 00 40 54 28 3c 00 00 20 aa 5e b2 da ba 0b 5e 12 67 1c 00 00 60 36 a4 af 9d 15 ...Px..@T(<....^....^.g...`6....
0360 68 c5 8a 07 00 00 44 85 e4 02 00 00 10 15 b6 da 00 00 60 80 61 ab 0d 00 00 4c 08 b6 da 00 00 40 h.....D...........`.a....L.....@
0380 54 d8 6a 03 00 80 01 86 ad 36 00 00 30 21 d8 6a 03 00 00 51 61 ab 0d 80 74 2b 67 3d d0 3e 1e ea T.j......6..0!.j...Qa...t+g=.>..
03a0 51 00 98 0f fb 80 3d 02 ad d8 6a 03 00 00 51 61 ab 0d 00 00 44 d5 cb 56 5b 43 c9 46 71 c6 61 0c Q.....=...j...Qa....D..V[C.Fq.a.
03c0 a9 85 52 ba ee e8 50 8f 62 00 b4 07 2c bd 30 7a c6 d0 8e e1 d6 d4 29 37 3a 86 76 08 00 60 b6 76 ..R...P.b...,.0z......)7:.v..`.v
03e0 af 7a 5e a0 15 5b 6d 00 00 20 2a 6c b5 01 00 80 a8 7a d9 6a 4b 3c f4 4f 71 c6 01 00 00 66 03 5b .z^..[m...*l.....z.jK<.Oq....f.[
0400 6d 00 00 60 42 b0 d5 06 00 00 a2 c2 56 1b 00 00 0c 30 6c b5 01 00 80 09 c1 56 1b 00 00 88 0a 5b m..`B.......V....0l......V.....[
0420 6d 00 00 30 c0 b0 d5 06 00 00 26 04 5b 6d 00 00 20 2a 6c b5 0d 19 95 92 74 3f 17 35 d4 a3 00 00 m..0......&.[m...*l.....t?.5....
0440 18 78 6f 4f fc 87 40 2b b6 da 00 00 40 54 d8 6a 03 00 00 51 f5 b2 d5 96 5a 3b 53 9c 71 00 00 80 .xoO..@+....@T.j...Q....Z;S.q...
0460 d9 c0 56 1b 00 00 98 10 6c b5 01 00 80 a8 b0 d5 06 00 00 03 0c 5b 6d 00 00 60 42 b0 d5 06 00 00 ..V.....l............[m..`B.....
0480 a2 c2 56 1b 00 00 0c 30 6c b5 01 00 80 09 c1 56 1b 00 00 88 0a 5b 6d 00 00 30 c0 b0 d5 06 00 00 ..V....0l......V.....[m..0......
04a0 26 04 5b 6d 00 00 20 2a 6c b5 01 00 c0 00 c3 56 1b 00 00 98 10 6c b5 01 00 80 a8 b0 d5 06 00 00 &.[m...*l......V.....l..........
04c0 03 0c 5b 6d 00 00 60 42 b0 d5 06 00 00 a2 c2 56 1b 00 00 0c 30 6c b5 01 00 80 09 c1 56 1b 00 00 ..[m..`B.......V....0l......V...
04e0 88 0a 5b 6d 00 00 30 c0 b0 d5 06 00 00 26 04 5b 6d 00 00 20 2a 6c b5 01 0c 98 58 a7 2f 15 d2 71 ..[m..0......&.[m...*l....X./..q
0500 43 3d 0a 00 53 87 ad 36 00 00 10 15 b6 da 00 00 40 54 58 f1 00 00 80 a8 50 78 00 00 40 54 28 3c C=..S..6........@TX.....Px..@T(<
0520 00 00 20 2a 14 1e 00 00 10 15 0a 0f 00 00 88 0a 85 07 00 00 44 85 c2 03 00 00 a2 42 e1 01 00 00 ...*................D......B....
0540 51 a1 f0 00 00 80 a8 7a c9 6a 83 3e 41 b4 1d 00 00 c1 9f 45 00 00 00 93 32 88 85 87 a2 28 23 7b Q......z.j.>A......E....2....(#{
0560 a6 a5 a5 c9 e5 72 e3 fb 73 6e c1 fe 1f 00 00 4c 9c 49 ac 78 76 ef de 5d 55 55 a5 d3 e9 4a 4b 4b .....r..sn.....L.I.xv..]UU...JKK
0580 3d 3d 3d 47 8d 1a b5 64 c9 92 a6 a6 26 23 4f ef 47 ce 69 7e 7e be a7 a7 a7 5c 2e 9f 39 73 e6 b9 ===G...d....&#O.G.i~~....\..9s..
05a0 73 e7 84 9b a8 27 fa 7a 17 00 00 d3 57 f1 c5 bd 54 ff ca 77 dd 2f ed 5d 72 b5 fa ef ad 84 90 ab s....'.z....W...T..w./.]r.......
05c0 5f 37 a7 f9 57 6e 99 74 31 cd bf f2 ea d7 cd 84 90 87 8d 9d 9a d0 9f df 9f f6 3f 9a d0 9f 1f 36 _7..Wn.t1.................?....6
05e0 76 12 42 74 3d e4 ec fe 3b 3b e7 fc b8 c9 a5 fc 1d e7 72 4e 9f fa fa 7a 81 3b 9a 44 e1 69 68 68 v.Bt=...;;........rN...z.;.D.ihh
0600 98 38 71 22 21 24 3c 3c 7c d7 ae 5d 8d 8d 8d b1 b1 b1 9b 37 6f 1e bc 3b e6 e7 e7 e7 e5 e5 dd bb .8q"!$<<|..].......7o..;........
0620 77 2f 26 26 26 38 38 58 b8 49 a7 d3 21 c3 1b 00 cc d5 d5 af 9b 23 8f b8 6f fb e1 f9 d9 91 e3 73 w/&&&88X.I..!........#..o......s
0640 d7 57 13 42 8e 27 de 58 f2 c7 89 db af bc b0 f8 fd 89 c7 df ba 41 08 f9 32 b9 ce 71 aa ec dd ef .W.B.'.X.............A..2..q....
0660 a7 3b 4c 91 7d 99 52 47 08 f9 5b 56 fd df 73 ee 86 7e ec 96 52 ed b3 eb 17 1f 4e 1f e1 09 7c d0 .;L.}.RG..[V..s..~..R.....N...|.
0680 0b 0f 45 51 1f 7e f8 e1 e8 d1 a3 1d 1d 1d f3 f2 f2 08 21 3b 76 ec 18 37 6e 1c b3 86 a0 28 aa a7 ..EQ.~............!;v..7n....(..
06a0 a7 87 7e dd dd dd 4d 9e 6c 9a 7d f5 d5 57 9c 4b 95 97 97 7b 79 79 29 14 8a a4 a4 24 f6 fa 83 79 ..~...M.l.}..W.K...{yy)....$...y
06c0 9d 94 94 a4 50 28 bc bd bd 2f 5d ba 44 08 a9 ac ac f4 f3 f3 b3 b4 b4 e4 2f 56 8e 1f 3f ee e5 e5 ....P(.../].D.........../V..?...
06e0 65 65 65 e5 ef ef 2f 93 c9 8c 6c 02 00 30 3f 2b fe cb d5 4e 35 92 92 50 23 46 52 d6 63 47 10 42 eee.../...l..0?+...N5..P#FR.cG.B
0700 6c c6 5b 10 42 e8 89 d3 d6 61 24 21 e4 e7 73 cd b3 a3 c6 5b 8d 92 ce 89 1e 7f ed 5c 0b 21 e4 ef l.[.B....a$!..s....[.......\.!..
0720 47 ee 2e de 32 61 c2 74 6b ea 49 19 61 f7 29 29 29 11 b8 a3 18 2b 1e 3b 3b bb db b7 6f 67 65 65 G...2a.tk.I.a.)))....+.;;...ogee
0740 25 24 24 10 42 76 ee dc 99 9c 9c ac d5 6a e9 65 04 fb 7f 8d 46 13 17 17 67 67 67 f7 cd 37 df 34 %$$.Bv.......j.e....F...ggg..7.4
0760 36 36 72 ae b3 66 cd 9a f5 eb d7 37 34 34 38 3b 3b eb bd 91 b3 b3 73 43 43 43 74 74 74 4c 4c 0c 66r..f.....7448;;.....sCCCtttLL.
0780 21 24 22 22 62 c5 8a 15 2d 2d 2d 86 d6 2b 77 ee dc 09 0a 0a 4a 4f 4f ef 53 13 00 80 99 79 c7 b9 !$""b...---..+w.....JOO.S....y..
07a0 7c cb a4 8b 9f 6f aa 59 9e ec 42 08 59 9e e2 92 bb be 7a f3 b3 17 8f be 59 fd 87 3f 3d 43 08 69 |....o.Y..B.Y.....z.....Y..?=C.i
07c0 bb d7 a5 50 5a 10 42 14 4a 8b 87 4d 9d 84 90 fb b5 8f ae fd ad f5 bd a9 97 76 bd 54 59 f5 df cd ...PZ.B.J..M.............v.TY...
07e0 9c 3e 77 ef de 15 b8 9d 18 85 67 ed da b5 32 99 2c 30 30 f0 d6 ad 5b 84 90 cc cc cc 03 07 0e 38 .>w.......g...2.,00...[........8
0800 39 39 6d db b6 8d d3 73 f1 e2 c5 d7 ae 5d 6b 6b 6b 9b 3d 7b b6 ab ab 2b f9 f5 e7 2b 57 ae 5c 09 99m....s.....]kkk.={...+...+W.\.
0820 0b 0b 93 cb e5 ab 56 ad d2 7b a3 f0 f0 70 b9 5c be 7a f5 ea cb 97 2f 13 42 2a 2b 2b a3 a2 a2 2c ......V..{...p.\.z..../.B*++...,
0840 2d 2d e9 56 ce 47 35 65 65 65 7e 7e 7e f1 f1 f1 4b 97 2e e5 5c 47 a0 09 00 c0 fc ec fa c5 67 c7 --.V.G5eee~~~...K...\G........g.
0860 cf 2f bc f6 e1 33 47 e3 aa 09 21 c7 e2 6e 84 7c ec f6 a7 eb bf 09 ce 70 cb 8b bf 41 08 b1 1e 33 ./...3G...!..n.|.......p...A...3
0880 82 fe 68 e7 61 63 a7 62 ac 05 21 44 6e 37 62 ea 3c db 6d 3f cc 78 75 eb c4 fc b7 6b 38 7d c6 8d ..h.ac.b..!Dn7b.<.m?.xu....k8}..
08a0 13 fa 1b f0 62 14 1e 89 e4 57 77 09 09 09 b9 70 e1 c2 99 33 67 52 53 53 f9 9d 7b 7a 7a 2e 5e bc ....b....Ww....p...3gRSS..{zz.^.
08c0 f8 ce 3b ef c4 c6 c6 92 27 9f af d0 4b 96 69 d3 a6 65 67 67 b7 b7 b7 1f 3a 74 48 ef 8d 98 56 4f ..;.....'...K.i..egg....:tH...VO
08e0 4f 4f 42 88 b7 b7 b7 46 a3 79 f4 e8 11 dd ca be 94 46 a3 59 ba 74 a9 5a ad 0e 0d 0d e5 5c 44 a0 OOB....F.y.......F.Y.t.Z.....\D.
0900 09 00 c0 fc 14 6e ab 6d 6b ea 22 84 50 12 d2 fd 58 47 08 e9 68 e9 22 4f b6 da da 5b ba 09 21 93 .....n.mk.".P...XG..h."O...[..!.
0920 67 db 9c d7 d4 77 b4 76 9f d7 d4 4f 9e 6d 43 08 99 32 d7 96 e9 43 49 28 4e 9f 05 0b 16 08 dc 71 g....w.v...O.mC..2...CI(N......q
0940 10 ff f4 35 45 51 3a 9d 8e fe 9f 73 84 10 a2 54 2a e3 e3 e3 b7 6c d9 c2 1c a7 5f 48 24 12 57 57 ...5EQ:....s...T*....l...._H$.WW
0960 d7 d8 d8 d8 f8 f8 78 4e c5 2a 2f 2f 0f 0b 0b ab a9 a9 89 8c 8c 3c 78 f0 60 6b 6b 2b fb 16 14 45 ......xN.*//.........<x.`kk+...E
0980 6d da b4 29 23 23 c3 cd cd 2d 3b 3b fb 85 17 5e f8 f1 c7 1f 23 23 23 2f 5d ba d4 d5 d5 c5 79 9b m..)##...-;;...^....###/].....y.
09a0 9c 4f 7d 5a 5b 5b 47 8d 1a c5 8c 81 df c4 3e 22 f0 1b c3 17 48 01 e0 a9 f3 8f bc c6 e2 b4 ba 8e .O}Z[[G.......>"....H...........
09c0 87 dd 8e 53 e5 4b de 9b f0 cc 6f 14 97 4b 1e 7c f9 a7 9b f7 6f 3e b2 9b 60 b9 f8 bd 09 d3 e6 8f ...S.K....o..K.|....o>..`.......
09e0 6e bd db 79 74 c3 8d 5f fe f9 d0 f9 79 45 f0 5e d7 51 e3 2c 1e 36 75 1d 4f b8 51 fd 7d eb 68 a7 n..yt.._....yE.^.Q.,.6u.O.Q.}.h.
0a00 91 cb b6 3b 4f fe bd 0d bb cf f9 cf ab 1c 1c 1c 0c dd 71 10 0b cf 20 79 fc f8 71 46 46 46 41 41 ...;O.............q....y..qFFFAA
0a20 c1 f9 f3 e7 87 7a 2c 00 00 d0 67 4f 59 64 0e 45 51 52 a9 d4 d3 d3 d3 d0 6e 1b 00 00 98 b8 a7 6f .....z,...gOYd.EQR......n......o
0a40 c5 63 ca 12 0f fd 73 a8 87 00 a6 cb da 72 c4 f6 60 af a1 1e 05 c0 d0 33 89 2f 90 02 00 c0 f0 31 .c....s......r..`......3./.....1
0a60 58 85 e7 69 0f 98 41 0a 1c 00 c0 20 e9 4f e1 e9 5f a2 1a c5 a2 54 2a fb 71 5f 61 db b6 6d e3 57 X..i..A......O.._....T*.q_a..m.W
0a80 88 a2 a2 22 0f 0f 0f 2b 2b 2b 0f 0f 8f a2 a2 22 23 cf 62 60 1f 12 00 cc 1e 3f 8e b2 a7 a7 27 2d ..."...+++....."#.b`.....?....'-
0aa0 2d 6d f2 e4 c9 52 a9 94 3e 5e 5f 5f 1f 10 10 60 63 63 13 10 10 40 e7 b0 f1 fb b0 27 79 e1 3b f6 -m...R..>^__...`cc...@.....'y.;.
0ac0 a7 f0 f4 2f 51 8d f9 1a cd 77 df 7d b7 66 cd 9a 7e dc 57 40 79 79 b9 5a ad e6 1f 0f 0f 0f 4f 4f .../Q....w.}.f..~.W@yy.Z......OO
0ae0 4f 6f 6e 6e 4e 4b 4b 8b 88 88 30 f2 2c 00 80 e1 83 1f 47 b9 77 ef de fd fb f7 1f 3d 7a b4 b3 b3 OonnNKK...0.,.....G.w......=z...
0b00 93 6e 4a 4a 4a f2 f6 f6 ae ad ad f5 f2 f2 a2 a7 7d 7e 1f f2 eb af 4b 0a 30 b6 f0 50 14 b5 61 c3 .nJJJ...........}~....K.0..P..a.
0b20 86 91 23 47 12 7d 89 6a fc 40 36 c2 4b 4e 63 ec d8 b1 63 dd ba 75 9c eb f3 73 d8 38 49 6b 02 c1 ..#G.}.j.@6.KNc...c..u...s.8Ik..
0b40 6b 1d 1d 1d 11 11 11 39 39 39 fc 61 3b 39 39 31 43 55 a9 54 46 9e c5 7e d7 c2 ef 05 00 c0 fc 64 k......999.a;991CU.TF..~.......d
0b60 66 66 ee da b5 cb c7 c7 87 f9 32 65 49 49 49 42 42 82 ad ad 6d 62 62 22 9d c3 c6 ef 43 08 b1 b3 ff........2eIIIBB...mbb"....C...
0b80 b3 1b 3b 76 ec f2 e5 cb 6f de bc 29 70 fd 3e ac 78 7c 7c 7c da db db 89 81 44 35 4e 20 1b e1 25 ..;v....o..)p.>.x|||.....D5N...%
0ba0 a7 d1 be fd f6 db 31 63 c6 38 3a 3a 72 2e ce cf 61 e3 24 ad 09 04 af 25 25 25 85 87 87 fb fb fb ......1c.8::r...a.$....%%%......
0bc0 f3 c7 ac 56 ab 83 83 83 2d 2d 2d 43 43 43 33 33 33 8d 3c 8b 4f ef 7b 01 00 30 4b 35 35 35 a5 a5 ...V....---CCC333.<.O.{..0K555..
0be0 a5 0a 85 c2 dd dd fd f4 e9 d3 84 90 c6 c6 46 7b 7b 7b 42 88 bd bd 3d 9d c3 c6 ef a3 d3 e9 ee df ..............F{{{B...=.........
0c00 bf 7f f5 ea 55 17 17 97 b0 b0 30 81 eb 1b fb 38 35 45 51 9d 9d 9d 23 46 fc ea 7b 3f 05 05 05 5b ....U.....0....85EQ...#F..{?...[
0c20 b6 6c b9 72 e5 0a 45 51 dd dd dd 74 dd 63 72 04 b4 5a ad 4c 26 d3 6a b5 4a a5 52 ab d5 d2 a7 cc .l.r..EQ...t.cr..Z.L&.j.J.R.....
0c40 9f 3f 3f 35 35 75 c6 8c 19 84 b5 9e d0 e9 74 72 b9 bc a9 a9 89 ee 6f 6d 6d 4d 1f 69 6c 6c 94 cb .??55u........tr......ommM.ill..
0c60 e5 74 1f ce 8f ec 73 25 12 09 fb 5d b0 5f bb bb bb ef d9 b3 67 de bc 79 a5 a5 a5 09 09 09 55 55 .t....s%...]._......g..y......UU
0c80 55 4c 13 ff 2c f6 35 39 99 08 7a df 0b 1f 1e a7 06 01 78 9c 1a 4c 19 3b 65 46 a5 52 a9 d5 ea f9 UL..,.59..z.......x..L.;eF.R....
0ca0 f3 e7 97 96 96 46 47 47 d7 d5 d5 a9 54 aa b2 b2 32 95 4a 55 57 57 e7 eb eb 7b f3 e6 4d 7e 1f e6 .....FGG....T...2.JUWW...{..M~..
0cc0 52 2d 2d 2d 2a 95 aa b5 b5 d5 d0 bd fa b0 e2 61 57 1d 4e a2 1a e1 05 b2 11 5e 72 1a 21 e4 dc b9 R---*..........aW.N......^r.!...
0ce0 73 5d 5d 5d 74 d5 21 bd e5 b0 71 92 d6 04 82 d7 7a 7a 7a 98 d7 9c 3a da dc dc 4c 9e 54 29 fa 35 s]]]t.!...q.....zzz...:...L.T).5
0d00 fb 2d 70 ce 12 d8 9d e4 bf 17 00 00 73 15 18 18 48 9e cc 9c f4 dc be 60 c1 02 fa f3 f2 f4 f4 74 .-p.........s...H......`.......t
0d20 3a 87 8d df 87 f6 e0 c1 83 94 94 14 66 9e d7 ab 3f 0f 17 50 14 65 61 61 11 14 14 14 13 13 c3 ff :...........f...?..P.eaa........
0d40 b4 86 51 53 53 a3 54 2a f7 ed db b7 7f ff 7e fa c8 d6 ad 5b e3 e2 e2 f4 76 ce cc cc cc c8 c8 50 ..QSS.T*......~....[....v......P
0d60 2a 95 55 55 55 0a 85 82 10 f2 d9 67 9f e5 e6 e6 2a 14 0a fa 8d 71 7e ec 75 84 f4 0b b5 5a 1d 17 *.UUU......g....*....q~.u....Z..
0d80 17 67 63 63 93 90 90 a0 d1 68 48 7f 9f 8d e6 bf 17 00 00 f3 c0 fe eb 68 f4 8b e4 e4 e4 4f 3e f9 .gcc.....hH............h.....O>.
0da0 64 cc 98 31 6f bf fd 76 56 56 16 21 24 25 25 a5 a2 a2 62 c2 84 09 15 15 15 c9 c9 c9 7a fb d0 a7 d..1o..vVV.!$%%...b.........z...
0dc0 bb b8 b8 54 54 54 64 67 67 0b dd d1 a4 9e 18 46 0e 1b 00 80 d9 33 a1 ac 36 e4 b0 01 00 0c 07 a6 ...TTTdgg......F.....3..6.......
0de0 b5 e2 79 da 9d d8 f6 7f 8f 92 8f 76 b4 9b 17 13 30 b4 83 01 00 30 4d c8 6a 03 00 00 51 f5 f3 e1 ..y........v....0....0M.j...Q...
0e00 82 01 e9 03 00 00 c3 d0 c0 ac 78 fa 97 c3 d6 d7 b3 d8 c5 cc 98 c2 96 9f 9f ef e9 e9 29 97 cb 67 ..........x.................)..g
0e20 ce 9c 79 ee dc 39 7e 07 81 a0 36 76 13 3f 92 08 00 60 58 c9 cb cb 9b 3a 75 2a 3d 9d 9e 3d 7b 56 ..y..9~...6v.?...`X....:u*=..={V
0e40 ef 11 e3 a7 ca 81 29 3c fd cb 61 1b d4 f4 36 42 48 7e 7e 7e 5e 5e de bd 7b f7 62 62 62 82 83 83 ......)<..a...6BH~~~^^..{.bbb...
0e60 39 ad 02 41 6d 9c 26 bd 91 44 00 00 c3 c7 a9 53 a7 8a 8b 8b 9b 9a 9a e2 e3 e3 e9 e9 94 7f a4 0f 9..Am.&..D.....S................
0e80 53 a5 ae ef 08 21 9b 36 6d b2 b6 b6 f6 f2 f2 ba 78 f1 22 bb 69 f1 e2 c5 b7 6e dd a2 fb 6c df be S....!.6m.......x.".i....n...l..
0ea0 dd d6 d6 d6 c1 c1 e1 d8 b1 63 3a 9d ee e2 c5 8b 5e 5e 5e d6 d6 d6 9b 36 6d e2 dc 97 39 8b 7f 23 .........c:.....^^^....6m...9..#
0ec0 8a a2 5c 5d 5d 8b 8b 8b 05 c6 4f 08 79 f3 cd 37 2d 2c 2c 0c 0d f8 fa f5 eb cf 3e fb 2c fb 48 7b ..\]].....O.y..7-,,.......>.,.H{
0ee0 7b bb b7 b7 f7 37 df 7c c3 ff 0d f0 9b a6 4c 99 72 e2 c4 09 63 7e 33 7f d9 7a 8c fe f7 75 66 b1 {....7.|......L.r...c~3..z...uf.
0f00 31 fd 01 00 9e 22 1d 1d 1d 9f 7f fe f9 f4 e9 d3 f5 1e 31 7e aa ec e7 8a c7 98 1c 36 4e 7a 5b 4c 1...."............1~.......6Nz[L
0f20 4c 4c 6c 6c 6c 43 43 03 27 ac d3 50 7a 1b 3d ef 77 75 75 65 65 65 6d dc b8 51 c7 0b 17 60 5e 10 LLlllCC.'..Pz.=.wuueeem..Q...`^.
0f40 56 8e 1c df 9d 3b 77 82 82 82 d2 d3 d3 d9 07 05 82 da f8 4d fc 48 22 00 80 e1 86 a2 28 2b 2b ab V....;w............M.H".....(++.
0f60 a8 a8 28 e6 7b f4 9c 23 7d 98 2a fb 51 f4 08 21 5a ad 56 a7 d3 b5 b5 b5 c9 64 32 e6 f8 cb 2f bf ..(.{..#}.*.Q..!Z.V......d2.../.
0f80 7c e9 d2 25 a6 4f 77 77 37 bb 48 d0 59 67 f4 59 ec fb 72 ce 62 46 f5 e9 a7 9f ba ba ba d2 39 3d |..%.Oww7.H.Yg.Y..r.bF........9=
0fa0 52 a9 d4 50 e1 a1 5f d3 2b 3b ce 15 74 3a dd f7 df 7f ef e2 e2 72 e4 c8 11 ce 5b e0 ec 3f 0a 37 R..P.._.+;..t:.......r....[..?.7
0fc0 39 39 39 15 15 15 75 74 74 14 15 15 39 39 39 09 fc 66 b0 e2 01 00 33 a6 d5 6a 73 72 72 26 4d 9a 999...utt...999..f....3..jsrr&M.
0fe0 a4 f7 88 f1 53 65 3f 57 3c bd e6 b0 11 5e 7a 9b a7 a7 27 27 8d 8d 7f 16 33 2c 42 48 52 52 d2 c7 ....Se?W<....^z...''....3,BHRR..
1000 1f 7f fc e0 c1 83 c2 c2 42 fa 0f 31 c8 64 b2 db b7 6f d3 3d d9 af 09 2b 47 8e 7d 05 8d 46 b3 74 ........B..1.d...o.=...+G.}..F.t
1020 e9 52 b5 5a 1d 1a 1a ca 19 bf 40 bc 1b bf c9 50 24 11 00 c0 30 11 17 17 47 87 52 4b 24 12 3a 33 .R.Z......@....P$...0...G.RK$.:3
1040 93 7f a4 0f 53 65 3f 8a 1e 21 64 d3 a6 4d 72 b9 9c fd 19 cf dc b9 73 4f 9e 3c c9 ee c3 79 4d 7f ....Se?..!d..Mr.......sO.<...yM.
1060 c6 23 97 cb d9 9f f1 70 ce 62 a3 3f 22 72 74 74 fc e0 83 0f e8 fe 89 89 89 74 8c 1b e7 b5 a1 77 .#.....p.b.?"rtt.........t.....w
1080 c1 79 a7 74 54 2a bf 0f 7f c0 9c 23 f5 f5 f5 0b 17 2e b4 b6 b6 f6 f0 f0 38 73 e6 8c c0 6f 06 2b .y.tT*.....#............8s...o.+
10a0 1e 00 30 4b 07 0e 1c 70 72 72 52 28 14 bf fb dd ef be fb ee 3b bd 47 8c 9f 2a 87 26 b9 80 9d bf ..0K...prrR(........;.G..*.&....
10c0 0d 00 00 c3 0a 36 8e 00 00 40 54 58 79 0c a4 07 d3 a6 b1 7f 94 ba bb 8f 2a 28 18 aa c1 00 00 98 .....6...@TXy...........*(......
10e0 26 ac 78 00 00 40 54 83 5b 78 44 0b 98 41 92 0d 00 c0 d3 62 70 0b 8f ee 49 fa 00 83 3e ce 4f 69 &.x..@T.[xD..A.....bp...I...>.Oi
1100 e3 74 f8 f7 09 04 b5 09 34 f1 87 da 6b e0 1b 00 80 d9 13 98 c6 39 3d 05 32 30 19 22 6d b5 31 4f .t......4...k........9=.20."m.1O
1120 d1 71 7e 64 52 da d8 ad 03 42 20 a8 4d 38 c3 8d 33 54 e1 ce 00 00 c3 84 de 69 9c d3 47 20 03 93 .q~dR....B..M8..3T.......i..G...
1140 6d e0 0b 0f 45 51 1b 36 6c 18 39 72 24 61 ed 80 d9 d9 d9 8d 1d 3b 76 f9 f2 e5 37 6f de 64 77 de m...EQ.6l.9r$a.......;v...7o.dw.
1160 b1 63 c7 ba 75 eb 8c bc ac 44 22 71 73 73 2b 29 29 21 84 54 56 56 fa f9 f9 59 5a 5a 1a 2a ad c7 .c..u....D"qss+))!.TVV...YZZ.*..
1180 8f 1f f7 f2 f2 b2 b2 b2 f2 f7 f7 97 c9 64 46 36 f1 87 2a dc 19 00 60 98 30 34 8d 33 3a 3a 3a 22 .............dF6..*...`.04.3:::"
11a0 22 22 72 72 72 7a bd d4 a0 ac 78 38 c9 69 3a 9d ee fe fd fb 57 af 5e 75 71 71 09 0b 0b 63 8e 0b ""rrrz....x8.i:.....W.^uqq...c..
11c0 a4 b4 f1 e9 58 b9 6d 84 90 88 88 88 15 2b 56 b4 b4 b4 08 af 93 f4 06 b5 09 34 19 1a aa c0 75 00 ....X.m......+V..........4....u.
11e0 00 cc 9e a1 b9 91 4d 20 03 53 cf e5 06 16 f9 75 72 1a bb a9 b9 b9 59 a1 50 30 3f b2 53 da f8 fd ......M..S.....ur.....Y.P0?.S...
1200 d9 23 e4 e7 b6 c9 64 b2 b6 b6 36 ce 89 9c 37 65 28 a8 4d b8 89 3f d4 5e 3b 33 ee 7b 78 b0 ff b5 .#....d...6...7e(.M..?.^;3.{x...
1220 2c 5b d6 eb 29 00 00 4f 11 ce 34 ce 9e b4 05 32 30 39 06 65 c5 c3 24 a7 b1 3d 78 f0 20 25 25 85 ,[..)..O..4....209.e..$..=x..%%.
1240 89 65 e3 67 bb 71 b0 df 18 3f b7 cd db db 5b a3 d1 d0 01 41 7a 4f 11 08 6a 13 68 e2 0f b5 d7 ce .e.g.q...?....[....AzO..j.h.....
1260 00 00 c3 04 67 1a e7 10 c8 c0 e4 1a a8 32 c8 9e f4 39 af e9 1b d9 da da 2e 5a b4 a8 ba ba 9a 6e ....g........2...9.......Z.....n
1280 e2 67 bb 09 8c 8a 9f db f6 c3 0f 3f cc 9a 35 8b ae 70 3a 03 49 6b 6c ec a0 b6 5e 9b d8 43 e5 77 .g.........?..5..p:.Ikl...^..C.w
12a0 16 78 ef 58 f1 00 80 59 ea 75 6e e4 74 16 be 1a 92 0b 00 00 40 54 48 2e 00 00 00 51 e9 f9 30 06 .x.X...Y.un.t.......@TH....Q..0.
12c0 fa ad a1 64 e3 80 5f 53 2a 1b 33 76 f6 d6 01 bf 2c 00 c0 50 c1 8a 07 00 00 44 65 26 59 6d 00 00 ...d.._S*.3v....,..P.....De&Ym..
12e0 f0 b4 f8 b7 0a 0f 3f bd c7 a4 f4 f4 f4 a4 a5 a5 4d 9e 3c 59 2a 95 72 46 58 5f 5f 1f 10 10 60 63 ......?.........M.<Y*.rFX__...`c
1300 63 13 10 10 50 5f 5f 6f 64 13 00 c0 70 c0 cf a8 14 8e dc a4 8f 18 3f 79 fe bb 2b 1e ce c3 76 26 c...P__od...p.........?y..+...v&
1320 65 ef de bd fb f7 ef 3f 7a f4 28 fd 85 56 76 53 52 52 92 b7 b7 77 6d 6d ad 97 97 d7 e6 cd 9b 8d e......?z.(..VvSRR...wmm........
1340 6c 02 00 18 0e f4 66 54 f2 67 7b ce 11 e3 27 cf 3e 14 1e 8a a2 92 92 92 14 0a 85 b7 b7 f7 a5 4b l.....fT.g{...'.>..............K
1360 97 e8 83 9c f4 9e 1d 3b 76 8c 1b 37 8e 5d 03 f9 a7 70 52 d7 d8 ca cb cb bd bc bc 14 0a 45 52 52 .......;v..7.]...pR..........ERR
1380 12 7d 05 8a a2 3e fa e8 23 3b 3b bb f1 e3 c7 e7 e5 e5 6d dd ba 75 cc 98 31 0e 0e 0e f9 f9 f9 86 .}...>..#;;.......m..u..1.......
13a0 86 c4 c8 cc cc dc b5 6b 97 8f 8f 8f 44 c2 7d 9b 25 25 25 09 09 09 b6 b6 b6 89 89 89 9c 61 e8 6d .......k....D.}.%%%..........a.m
13c0 12 18 33 00 80 99 d1 9b 51 c9 cf 6a e3 1c 11 98 57 39 fa b6 e2 71 76 76 6e 68 68 88 8e 8e 8e 89 ..3.....Q..j....W9...qvvnhh.....
13e0 89 21 fa d2 7b 76 ee dc 99 9c 9c ac d5 6a 99 1a c8 39 85 f0 52 d7 d8 d6 ac 59 b3 7e fd fa 86 86 .!..{v.......j...9..R....Y.~....
1400 06 67 67 67 e6 e0 e8 d1 a3 6f dd ba 75 f8 f0 e1 95 2b 57 2a 95 ca ba ba ba ec ec ec f8 f8 78 43 .ggg.....o..u....+W*..........xC
1420 d7 67 d4 d4 d4 94 96 96 2a 14 0a 77 77 f7 d3 a7 4f b3 9b 1a 1b 1b ed ed ed 09 21 f6 f6 f6 77 ef .g......*..ww...O.........!...w.
1440 de ed b5 49 60 cc 00 00 66 89 9d 51 c9 9f ed f9 47 04 e6 55 8e 3e 7c 81 94 a2 28 ad 56 2b 93 c9 ...I`...f..Q....G..U.>|...(.V+..
1460 b4 5a ad 52 a9 d4 6a b5 4c 53 4b 4b 8b 4a a5 6a 6d 6d cd cd cd cd c8 c8 f8 e9 a7 9f 36 6e dc 48 .Z.R..j.LSKK.J.jmm..........6n.H
1480 ff 55 06 ce 29 fb f6 ed 4b 4d 4d ad ad ad ed ea ea 92 4a a5 5d 5d 5d cc da 48 a7 d3 c9 e5 f2 a6 .U..)...KMM.......J.]]]..H......
14a0 a6 26 ba bf b5 b5 b5 4e a7 a3 28 aa bb bb 9b 5e b2 70 5e d3 ad 9c eb b3 af a6 52 a9 d4 6a f5 fc .&.....N..(....^.p^.......R..j..
14c0 f9 f3 4b 4b 4b a3 a3 a3 eb ea ea 98 01 ab 54 aa b2 b2 32 95 4a 55 57 57 e7 eb eb cb 0e 5b e5 37 ..KKK.........T...2.JUWW.....[.7
14e0 f1 c7 6c e8 57 84 c7 a9 01 c0 3c 94 95 95 05 05 05 7d f4 d1 47 9c b4 30 66 b6 e7 1f 11 98 57 39 ..l.W.....<......}..G..0f.....W9
1500 fa b6 e2 c9 ce ce 6e 6f 6f 3f 74 e8 90 a7 a7 27 73 90 9d de 13 12 12 72 e1 c2 85 33 67 ce a4 a6 ......noo?t....'s......r...3g...
1520 a6 ea 3d 85 9f ba c6 de 25 9c 36 6d 1a d3 ff ff 87 c8 da 28 e3 6f 9a 71 ae cf be 5a 60 60 20 79 ..=.....%.6m.......(.o.q...Z``.y
1540 f2 64 1d e7 c4 05 0b 16 a4 a7 a7 37 37 37 a7 a7 a7 2f 58 b0 40 b8 89 3f 66 00 00 33 66 28 a3 92 .d.........777.../X.@..?f..3f(..
1560 9f d5 c6 3e 22 30 af 72 f4 ed 0b a4 35 35 35 4a a5 d2 cd cd 2d 3b 3b 9b 3c 99 d3 6d 6d 6d 5f 7c ...>"0.r....555J....-;;.<..mmm_|
1580 f1 45 f6 11 a5 52 f9 ee bb ef ea 3d e5 ad b7 de 0a 09 09 91 cb e5 f4 df 7f e3 c8 cc cc 0c 0b 0b .E...R.....=....................
15a0 4b 4c 4c 8c 8c 8c 54 28 14 fd 18 12 5b 72 72 f2 aa 55 ab 82 82 82 9c 9d 9d b3 b2 b2 c8 93 75 12 KLL...T(....[rr..U............u.
15c0 21 24 25 25 e5 8d 37 de 98 30 61 82 af af ef 91 23 47 84 9b 84 c7 0c 00 60 66 a2 a3 a3 09 21 01 !$%%..7..0a.....#G......`f....!.
15e0 01 01 f4 8f ad ad ad a3 46 8d 22 fa 66 7b f6 11 fe e4 69 48 df b6 da c4 79 7a ed f1 e3 c7 19 19 ........F.".f{....iH....yz......
1600 19 05 05 05 e7 cf 9f 37 91 21 01 00 c0 40 31 b9 c8 1c 8a a2 a4 52 a9 a7 a7 27 7b b7 0d 00 00 cc .......7.!...@1......R...'{.....
1620 06 56 0c 03 a9 bb e0 a5 a1 1e 02 0c 22 6a 94 ab e4 e5 43 43 3d 0a 80 a7 1e b2 da 00 00 40 54 bd .V.........."j....CC=........@T.
1640 17 1e e3 e3 70 f8 3d d3 d2 d2 e4 72 b9 98 81 3a cc d7 4e 45 bb 23 00 00 f4 89 b1 2b 1e 7e 2c 4f ....p.=....r...:..NE.#.....+.~,O
1660 51 51 91 87 87 87 95 95 95 87 87 47 51 51 91 de b3 76 ef de 5d 55 55 35 d8 bb 79 ec 32 63 e4 bd QQ.........GQQ...v..]UU5..y.2c..
1680 04 06 cf 0f 29 ca cb cb 9b 3a 75 2a 7d e4 ec d9 b3 03 3b 78 00 80 21 64 28 6f 93 fe 22 26 fd 9a ....)....:u*}.....;x..!d(o.."&..
16a0 3f 2b f2 63 d9 f8 7d 04 f4 61 ab 8d 13 cb 13 1e 1e 4e 3f b2 9d 96 96 16 11 11 a1 f7 94 86 86 86 ?+.c..}..a.......N?.............
16c0 89 13 27 1a 7f 0b d1 08 0c 9e 1f 52 74 ea d4 a9 e2 e2 e2 a6 a6 a6 f8 f8 78 26 b6 08 00 c0 0c e8 ..'........Rt...........x&......
16e0 0d db 2c 2f 2f 57 ab d5 cc 8f fc 59 91 1f cb a6 37 de cd 90 3e 14 1e 4e 2c 8f 93 93 13 79 b2 da ..,//W.....Y....7...>..N,....y..
1700 50 a9 54 4c b7 d2 d2 52 07 07 87 03 07 0e 50 14 d5 d3 d3 c3 2f a4 95 95 95 7e 7e 7e 96 96 96 74 P.TL...R......P...../....~~~...t
1720 53 45 45 c5 ac 59 b3 ac ad ad 7d 7d 7d 2b 2b 2b e9 6b 6e d8 b0 61 e4 c8 91 84 90 6b d7 ae f9 fb SEE..Y....}}}+++.kn..a.....k....
1740 fb 2b 14 8a e9 d3 a7 97 95 95 91 5f af 6f 98 42 cd 7e c1 b4 f2 83 e3 18 86 06 4f f4 85 14 1d 3e .+........._.o.B.~........O....>
1760 7c f8 99 67 9e 91 48 24 96 96 96 e3 c6 8d 33 fe 37 06 00 f0 d4 e9 e8 e8 88 88 88 c8 c9 c9 61 8e |..g..H$......3.7.............a.
1780 f0 67 45 7e 2c 9b de 78 37 43 8c 2d 3c fc 58 1e b5 5a 1d 1c 1c 6c 69 69 19 1a 1a 9a 99 99 49 77 .gE~,..x7C.-<.X..Z...lii......Iw
17a0 fb f3 9f ff bc 7e fd fa af be fa 6a f5 ea d5 74 15 e5 d7 d2 88 88 88 15 2b 56 b4 b4 b4 d0 4d 91 .....~.....j...t........+V....M.
17c0 91 91 2b 57 ae 6c 68 68 78 e3 8d 37 56 af 5e 4d f7 f1 f1 f1 69 6f 6f 27 84 ac 5e bd 7a d5 aa 55 ..+W.lhhx..7V.^M....ioo'..^.z..U
17e0 4d 4d 4d 3b 77 ee 8c 8a 8a d2 3b 30 62 a0 68 f3 83 e3 18 7a 07 cf c6 0e 29 22 84 50 14 65 65 65 MMM;w.....;0b.h....z....)".P.eee
1800 15 15 15 b5 7f ff 7e 23 7f 63 00 00 4f a3 a4 a4 a4 f0 f0 70 7f 7f 7f ce 71 f6 ac 68 28 96 8d 33 ......~#.c..O......p....q..h(..3
1820 73 1a d2 fb e3 d4 9c 2f 69 32 b1 3c ee ee ee 7b f6 ec 99 37 6f 5e 69 69 69 42 42 42 55 55 15 45 s....../i2.<...{...7o^iiiBBBUU.E
1840 51 16 16 16 05 05 05 8b 16 2d e2 9c cb 09 64 6b 6c 6c 94 cb e5 f4 11 26 9f ad ad ad cd de de be Q........-....dkll.....&........
1860 ad ad 8d a2 a8 ce ce ce 11 23 46 10 42 14 0a 45 5b 5b 1b dd 53 22 91 74 77 77 33 d7 ec e9 e9 91 .........#F.B..E[[..S".tww3.....
1880 4a a5 74 62 1b 33 42 26 c3 4d a7 d3 f1 83 e3 98 31 f0 07 cf 7e cb 7a 43 8a da db db 4f 9e 3c b9 J.tb.3B&.M......1...~.zC....O.<.
18a0 75 eb d6 6b d7 ae 19 fa 5d e1 71 6a f3 86 c7 a9 c1 5c b1 67 51 89 44 c2 f9 db 07 84 37 2b ea 8d u..k....].qj.....\.gQ.D.....7+..
18c0 65 33 14 ef c6 d7 b7 c7 a9 d9 b1 3c cd cd cd e4 49 45 a1 5f 13 42 0a 0b 0b c3 c3 c3 4f 9c 38 c1 e3.........<....IE._.B......O.8.
18e0 39 91 fd f9 90 b7 b7 b7 46 a3 79 f4 e8 11 dd e4 e9 e9 99 9d 9d ad d5 6a 0f 1e 3c c8 44 c0 d1 55 9.......F.y............j..<.D..U
1900 87 10 32 63 c6 8c 43 87 0e b5 b5 b5 e9 74 3a 3a 27 cd c9 c9 e9 f4 e9 d3 ed ed ed 9f 7e fa 29 dd ..2c..C......t::'...........~.).
1920 47 26 93 dd be 7d 9b 3f 5a 4e 70 1c 7b 0c 7a 07 4f e3 87 14 c5 c5 c5 d1 25 5d 22 91 30 c3 06 00 G&...}.?ZNp.{.z.O.......%]".0...
1940 30 4b 3d 3d 3d cc 54 49 ff cf 9f 15 f9 b1 6c 86 e2 dd f4 ea db 53 6d 2e 2e 2e 15 15 15 74 2c 8f 0K===.TI......l......Sm......t,.
1960 5a ad 8e 8b 8b b3 b1 b1 49 48 48 d0 68 34 74 b7 c0 c0 c0 e2 e2 e2 8d 1b 37 ee d9 b3 c7 d0 a5 3e Z.......IHH.h4t.........7......>
1980 fb ec b3 dc dc 5c 85 42 41 cf fb 6a b5 fa c0 81 03 4a a5 f2 f0 e1 c3 cc 75 18 87 0f 1f 3e 7e fc .....\.BA..j.....J......u....>~.
19a0 b8 a3 a3 23 f3 51 4d 7a 7a 7a 78 78 b8 a3 a3 23 53 30 d6 ae 5d eb ee ee ce ff 20 87 3e 65 e1 c2 ...#.QMzzzxx...#S0..].......>e..
19c0 85 4c 70 1c 83 3f 78 e6 f4 e8 e8 68 fa 81 0d fa f4 87 0f 1f 4e 9f 3e fd f9 e7 9f b7 b7 b7 cf c8 .Lp..?x....h........N.>.........
19e0 c8 c8 cb cb 33 f2 37 06 00 60 fa f8 9f 94 f3 f1 67 c5 94 94 94 8a 8a 8a 09 13 26 54 54 54 24 27 ....3.7..`......g.........&TTT$'
1a00 27 eb ed 23 74 53 24 17 00 00 80 98 90 5c 00 00 00 a2 42 e1 01 00 00 51 a1 f0 00 00 80 a8 50 78 '..#tS$......\....B....Q......Px
1a20 00 00 40 54 28 3c 00 00 20 2a 14 1e 00 00 10 15 0a 0f 00 00 88 0a 85 07 00 00 44 85 c2 03 00 00 ..@T(<...*................D.....
1a40 a2 42 e1 01 00 00 51 a1 f0 00 00 80 a8 fe 17 f4 6d 9f 9f 79 91 94 91 00 00 00 00 49 45 4e 44 ae .B....Q.........m..y.......IEND.
1a60 42 60 82 B`.
) #:autoload (guix openpgp) (openpgp-format-fingerprint) #:use-module (guix modules) #:use-module (guix packages) #:use-module (guix utils) #:use-module (guix deprecation) #:use-module (gnu packages base) #:use-module (gnu packages bash) #:use-module (gnu packages hurd) #:use-module (gnu system setuid) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-9 gnu) #:use-module (srfi srfi-26) #:use-module (srfi srfi-34) #:use-module (srfi srfi-35) #:use-module (srfi srfi-71) #:use-module (ice-9 vlist) #:use-module (ice-9 match) #:autoload (ice-9 pretty-print) (pretty-print) #:export (service-extension service-extension? service-extension-target service-extension-compute service-type service-type? service-type-name service-type-extensions service-type-compose service-type-extend service-type-default-value service-type-description service-type-location %service-type-path fold-service-types lookup-service-types service service? service-kind service-value service-parameters ;deprecated simple-service modify-services service-back-edges instantiate-missing-services fold-services remove-service-extensions for-home for-home? service-error? missing-value-service-error? missing-value-service-error-type missing-value-service-error-location missing-target-service-error? missing-target-service-error-service missing-target-service-error-target-type ambiguous-target-service-error? ambiguous-target-service-error-service ambiguous-target-service-error-target-type system-service-type provenance-service-type sexp->system-provenance system-provenance boot-service-type cleanup-service-type activation-service-type activation-service->script %linux-bare-metal-service %hurd-rc-script %hurd-startup-service special-files-service-type extra-special-file etc-service-type etc-directory setuid-program-service-type profile-service-type firmware-service-type gc-root-service-type linux-builder-service-type linux-builder-configuration linux-builder-configuration? linux-builder-configuration-kernel linux-builder-configuration-modules linux-loadable-module-service-type %boot-service %activation-service etc-service) ; deprecated #:re-export (;; Note: Re-export 'delete' to allow for proper syntax matching ;; in 'modify-services' forms. See ;; <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=26805#16>. delete)) ;;; Comment: ;;; ;;; This module defines a broad notion of "service types" and "services." ;;; ;;; A service type describe how its instances extend instances of other ;;; service types. For instance, some services extend the instance of ;;; ACCOUNT-SERVICE-TYPE by providing it with accounts and groups to create; ;;; others extend SHEPHERD-ROOT-SERVICE-TYPE by passing it instances of ;;; <shepherd-service>. ;;; ;;; When applicable, the service type defines how it can itself be extended, ;;; by providing one procedure to compose extensions, and one procedure to ;;; extend itself. ;;; ;;; A notable service type is SYSTEM-SERVICE-TYPE, which has a single ;;; instance, which is the root of the service DAG. Its value is the ;;; derivation that produces the 'system' directory as returned by ;;; 'operating-system-derivation'. ;;; ;;; The 'fold-services' procedure can be passed a list of procedures, which it ;;; "folds" by propagating extensions down the graph; it returns the root ;;; service after the applying all its extensions. ;;; ;;; Code: (define-record-type <service-extension> (service-extension target compute) service-extension? (target service-extension-target) ;<service-type> (compute service-extension-compute)) ;params -> params (define &no-default-value ;; Value used to denote service types that have no associated default value. '(no default value)) (define-record-type* <service-type> service-type make-service-type service-type? (name service-type-name) ;symbol (for debugging) ;; Things extended by services of this type. (extensions service-type-extensions) ;list of <service-extensions> ;; Given a list of extensions, "compose" them. (compose service-type-compose ;list of Any -> Any (default #f)) ;; Extend the services' own parameters with the extension composition. (extend service-type-extend ;list of Any -> parameters (default #f)) ;; Optional default value for instances of this type. (default-value service-type-default-value ;Any (default &no-default-value)) ;; Meta-data. (description service-type-description) ;string (location service-type-location ;<location> (default (and=> (current-source-location) source-properties->location)) (innate))) (define (write-service-type type port) (format port "#<service-type ~a ~a>" (service-type-name type) (number->string (object-address type) 16))) (set-record-type-printer! <service-type> write-service-type) (define %distro-root-directory ;; Absolute file name of the module hierarchy. (dirname (search-path %load-path "guix.scm"))) (define %service-type-path ;; Search path for service types. (make-parameter `((,%distro-root-directory . "gnu/services") (,%distro-root-directory . "gnu/system")))) (define (all-service-modules) "Return the default set of service modules." (cons (resolve-interface '(gnu services)) (all-modules (%service-type-path) #:warn warn-about-load-error))) (define* (fold-service-types proc seed #:optional (modules (all-service-modules))) "For each service type exported by one of MODULES, call (PROC RESULT). SEED is used as the initial value of RESULT." (fold-module-public-variables (lambda (object result) (if (service-type? object) (proc object result) result)) seed modules)) (define lookup-service-types (let ((table (delay (fold-service-types (lambda (type result) (vhash-consq (service-type-name type) type result)) vlist-null)))) (lambda (name) "Return the list of services with the given NAME (a symbol)." (vhash-foldq* cons '() name (force table))))) ;; Services of a given type. (define-record-type <service> (make-service type value) service? (type service-kind) (value service-value)) (define-syntax service (syntax-rules () "Return a service instance of TYPE. The service value is VALUE or, if omitted, TYPE's default value." ((_ type value) (make-service type value)) ((_ type) (%service-with-default-value (current-source-location) type)))) (define (%service-with-default-value location type) "Return a instance of service type TYPE with its default value, if any. If TYPE does not have a default value, an error is raised." ;; TODO: Currently this is a run-time error but with a little bit macrology ;; we could turn it into an expansion-time error. (let ((default (service-type-default-value type))) (if (eq? default &no-default-value) (let ((location (source-properties->location location))) (raise (make-compound-condition (condition (&missing-value-service-error (type type) (location location))) (formatted-message (G_ "~a: no value specified \ for service of type '~a'") (location->string location) (service-type-name type))))) (service type default)))) (define-condition-type &service-error &error service-error?) (define-condition-type &missing-value-service-error &service-error missing-value-service-error? (type missing-value-service-error-type) (location missing-value-service-error-location)) ;;; ;;; Helpers. ;;; (define service-parameters ;; Deprecated alias. service-value) (define (simple-service name target value) "Return a service that extends TARGET with VALUE. This works by creating a singleton service type NAME, of which the returned service is an instance." (let* ((extension (service-extension target identity)) (type (service-type (name name) (extensions (list extension)) (description "This is a simple service.")))) (service type value))) (define-syntax clause-alist (syntax-rules (=> delete) "Build an alist of clauses. Each element has the form (KIND PROC LOC) where PROC is the service transformation procedure to apply for KIND, and LOC is the source location information." ((_ (delete kind) rest ...) (cons (list kind (lambda (service) #f) (current-source-location)) (clause-alist rest ...))) ((_ (kind param => exp ...) rest ...) (cons (list kind (lambda (svc) (let ((param (service-value svc))) (service (service-kind svc) (begin exp ...)))) (current-source-location)) (clause-alist rest ...))) ((_) '()))) (define (apply-clauses clauses service deleted-services) "Apply CLAUSES, an alist as returned by 'clause-alist', to SERVICE. An exception is raised if a clause attempts to modify a service present in DELETED-SERVICES." (define (raise-if-deleted kind properties) (match (find (match-lambda ((deleted-kind _) (eq? kind deleted-kind))) deleted-services) ((_ deleted-properties) (raise (make-compound-condition (condition (&error-location (location (source-properties->location properties)))) (formatted-message (G_ "modify-services: service '~a' was deleted here: ~a") (service-type-name kind) (source-properties->location deleted-properties))))) (_ #t))) (match clauses (((kind proc properties) . rest) (raise-if-deleted kind properties) (if (eq? (and service (service-kind service)) kind) (let ((new-service (proc service))) (apply-clauses rest new-service (if new-service deleted-services (cons (list kind properties) deleted-services)))) (apply-clauses rest service deleted-services))) (() service))) (define (%modify-services services clauses) "Apply CLAUSES, an alist as returned by 'clause-alist', to SERVICES. An exception is raised if a clause attempts to modify a missing service." (define (raise-if-not-found clause) (match clause ((kind _ properties) (unless (find (lambda (service) (eq? kind (service-kind service))) services) (raise (make-compound-condition (condition (&error-location (location (source-properties->location properties)))) (formatted-message (G_ "modify-services: service '~a' not found in service list") (service-type-name kind)))))))) (for-each raise-if-not-found clauses) (reverse (filter-map identity (fold (lambda (service services) (cons (apply-clauses clauses service '()) services)) '() services)))) (define-syntax modify-services (syntax-rules () "Modify the services listed in SERVICES according to CLAUSES and return the resulting list of services. Each clause must have the form: (TYPE VARIABLE => BODY) where TYPE is a service type, such as 'guix-service-type', and VARIABLE is an identifier that is bound within BODY to the value of the service of that TYPE. Clauses can also remove services of a given type: (delete TYPE) Consider this example: (modify-services %base-services (guix-service-type config => (guix-configuration (inherit config) (use-substitutes? #f) (extra-options '(\"--gc-keep-derivations\")))) (mingetty-service-type config => (mingetty-configuration (inherit config) (motd (plain-file \"motd\" \"Hi there!\")))) (delete udev-service-type)) It changes the configuration of the GUIX-SERVICE-TYPE instance, and that of all the MINGETTY-SERVICE-TYPE instances, and it deletes instances of the UDEV-SERVICE-TYPE." ((_ services clauses ...) (%modify-services services (clause-alist clauses ...))))) ;;; ;;; Core services. ;;; (define (system-derivation entries mextensions) "Return as a monadic value the derivation of the 'system' directory containing the given entries." (mlet %store-monad ((extensions (mapm/accumulate-builds identity mextensions))) (lower-object (file-union "system" (append entries (concatenate extensions)))))) (define system-service-type ;; This is the ultimate service type, the root of the service DAG. The ;; service of this type is extended by monadic name/item pairs. These items ;; end up in the "system directory" as returned by ;; 'operating-system-derivation'. (service-type (name 'system) (extensions '()) (compose identity) (extend system-derivation) (description "Build the operating system top-level directory, which in turn refers to everything the operating system needs: its kernel, initrd, system profile, boot script, and so on."))) (define (compute-boot-script _ gexps) ;; Reverse GEXPS so that extensions appear in the boot script in the right ;; order. That is, user extensions would come first, and extensions added ;; by 'essential-services' (e.g., running shepherd) are guaranteed to come ;; last. (gexp->file "boot" ;; Clean up and activate the system, then spawn shepherd. #~(begin #$@(reverse gexps)))) (define (boot-script-entry mboot) "Return, as a monadic value, an entry for the boot script in the system directory." (mlet %store-monad ((boot mboot)) (return `(("boot" ,boot))))) (define boot-service-type ;; The service of this type is extended by being passed gexps. It ;; aggregates them in a single script, as a monadic value, which becomes its ;; value. (service-type (name 'boot) (extensions (list (service-extension system-service-type boot-script-entry))) (compose identity) (extend compute-boot-script) (default-value #f) (description "Produce the operating system's boot script, which is spawned by the initrd once the root file system is mounted."))) (define %boot-service ;; The service that produces the boot script. (service boot-service-type #t)) ;;; ;;; Provenance tracking. ;;; (define (object->pretty-string obj) "Like 'object->string', but using 'pretty-print'." (call-with-output-string (lambda (port) (pretty-print obj port)))) (define (channel->code channel) "Return code to build CHANNEL, ready to be dropped in a 'channels.scm' file." ;; Since the 'introduction' field is backward-incompatible, and since it's ;; optional when using the "official" 'guix channel, include it if and only ;; if we're referring to a different channel. (let ((intro (and (not (equal? (list channel) %default-channels)) (channel-introduction channel)))) `(channel (name ',(channel-name channel)) (url ,(channel-url channel)) (branch ,(channel-branch channel)) (commit ,(channel-commit channel)) ,@(if intro `((introduction (make-channel-introduction ,(channel-introduction-first-signed-commit intro) (openpgp-fingerprint ,(openpgp-format-fingerprint (channel-introduction-first-commit-signer intro)))))) '())))) (define (channel->sexp channel) "Return an sexp describing CHANNEL. The sexp is _not_ code and is meant to be parsed by tools; it's potentially more future-proof than code." ;; TODO: Add CHANNEL's introduction. Currently we can't do that because ;; older 'guix system describe' expect exactly name/url/branch/commit ;; without any additional fields. `(channel (name ,(channel-name channel)) (url ,(channel-url channel)) (branch ,(channel-branch channel)) (commit ,(channel-commit channel)))) (define (sexp->channel sexp) "Return the channel corresponding to SEXP, an sexp as found in the \"provenance\" file produced by 'provenance-service-type'." (match sexp (('channel ('name name) ('url url) ('branch branch) ('commit commit) rest ...) ;; XXX: In the future REST may include a channel introduction. (channel (name name) (url url) (branch branch) (commit commit))))) (define (provenance-file channels config-file) "Return a 'provenance' file describing CHANNELS, a list of channels, and CONFIG-FILE, which can be either #f or a <local-file> containing the OS configuration being used." (scheme-file "provenance" #~(provenance (version 0) (channels #+@(if channels (map channel->sexp channels) '())) (configuration-file #+config-file)))) (define (provenance-entry config-file) "Return system entries describing the operating system provenance: the channels in use and CONFIG-FILE, if it is true." (define channels (current-channels)) (mbegin %store-monad (let ((config-file (cond ((string? config-file) ;; CONFIG-FILE has been passed typically via ;; 'guix system reconfigure CONFIG-FILE' so we ;; can assume it's valid: tell 'local-file' to ;; not emit a warning. (local-file (assume-valid-file-name config-file) "configuration.scm")) ((not config-file) #f) (else config-file)))) (return `(("provenance" ,(provenance-file channels config-file)) ,@(if channels `(("channels.scm" ,(plain-file "channels.scm" (object->pretty-string `(list ,@(map channel->code channels)))))) '()) ,@(if config-file `(("configuration.scm" ,config-file)) '())))))) (define provenance-service-type (service-type (name 'provenance) (extensions (list (service-extension system-service-type provenance-entry))) (default-value #f) ;the OS config file (description "Store provenance information about the system in the system itself: the channels used when building the system, and its configuration file, when available."))) (define (sexp->system-provenance sexp) "Parse SEXP, an s-expression read from /run/current-system/provenance or similar, and return two values: the list of channels listed therein, and the OS configuration file or #f." (match sexp (('provenance ('version 0) ('channels channels ...) ('configuration-file config-file)) (values (map sexp->channel channels) config-file)) (_ (values '() #f)))) (define (system-provenance system) "Given SYSTEM, the file name of a system generation, return two values: the list of channels SYSTEM is built from, and its configuration file. If that information is missing, return the empty list (for channels) and possibly #false (for the configuration file)." (catch 'system-error (lambda () (sexp->system-provenance (call-with-input-file (string-append system "/provenance") read))) (lambda _ (values '() #f)))) ;;; ;;; Cleanup. ;;; (define (cleanup-gexp _) "Return a gexp to clean up /tmp and similar places upon boot." (with-imported-modules '((guix build utils)) #~(begin (use-modules (guix build utils)) ;; Clean out /tmp and /var/run. ;; ;; XXX This needs to happen before service activations, so it ;; has to be here, but this also implicitly assumes that /tmp ;; and /var/run are on the root partition. (letrec-syntax ((fail-safe (syntax-rules () ((_ exp rest ...) (begin (catch 'system-error (lambda () exp) (const #f)) (fail-safe rest ...))) ((_) #t)))) ;; Ignore I/O errors so the system can boot. (fail-safe ;; Remove stale Shadow lock files as they would lead to ;; failures of 'useradd' & co. (delete-file "/etc/group.lock") (delete-file "/etc/passwd.lock") (delete-file "/etc/.pwd.lock") ;from 'lckpwdf' ;; Force file names to be decoded as UTF-8. See ;; <https://bugs.gnu.org/26353>. (setenv "GUIX_LOCPATH" #+(file-append (libc-utf8-locales-for-target (%current-system)) "/lib/locale")) (setlocale LC_CTYPE "en_US.utf8") (delete-file-recursively "/tmp") (delete-file-recursively "/var/run") (mkdir "/tmp") (chmod "/tmp" #o1777) (mkdir "/var/run") (chmod "/var/run" #o755) (delete-file-recursively "/run/udev/watch.old")))))) (define cleanup-service-type ;; Service that cleans things up in /tmp and similar. (service-type (name 'cleanup) (extensions (list (service-extension boot-service-type cleanup-gexp))) (description "Delete files from @file{/tmp}, @file{/var/run}, and other temporary locations at boot time."))) (define* (activation-service->script service) "Return as a monadic value the activation script for SERVICE, a service of ACTIVATION-SCRIPT-TYPE." (activation-script (service-value service))) (define (activation-script gexps) "Return the system's activation script, which evaluates GEXPS." (define actions (map (cut program-file "activate-service.scm" <>) gexps)) (program-file "activate.scm" (with-imported-modules (source-module-closure '((gnu build activation) (guix build utils))) #~(begin (use-modules (gnu build activation) (guix build utils)) ;; Make sure the user accounting database exists. If it ;; does not exist, 'setutxent' does not create it and ;; thus there is no accounting at all. (close-port (open-file "/var/run/utmpx" "a0")) ;; Same for 'wtmp', which is populated by mingetty et ;; al. (mkdir-p "/var/log") (close-port (open-file "/var/log/wtmp" "a0")) ;; Set up /run/current-system. Among other things this ;; sets up locales, which the activation snippets ;; executed below may expect. (activate-current-system) ;; Run the services' activation snippets. ;; TODO: Use 'load-compiled'. (for-each primitive-load '#$actions))))) (define (gexps->activation-gexp gexps) "Return a gexp that runs the activation script containing GEXPS." #~(primitive-load #$(activation-script gexps))) (define (activation-profile-entry gexps) "Return, as a monadic value, an entry for the activation script in the system directory." (mlet %store-monad ((activate (lower-object (activation-script gexps)))) (return `(("activate" ,activate))))) (define (second-argument a b) b) (define activation-service-type (service-type (name 'activate) (extensions (list (service-extension boot-service-type gexps->activation-gexp) (service-extension system-service-type activation-profile-entry))) (compose identity) (extend second-argument) (default-value #f) (description "Run @dfn{activation} code at boot time and upon @command{guix system reconfigure} completion."))) (define %activation-service ;; The activation service produces the activation script from the gexps it ;; receives. (service activation-service-type #t)) (define %modprobe-wrapper ;; Wrapper for the 'modprobe' command that knows where modules live. ;; ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe', ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY' ;; environment variable is not set---hence the need for this wrapper. (let ((modprobe "/run/current-system/profile/bin/modprobe")) (program-file "modprobe" #~(begin (setenv "LINUX_MODULE_DIRECTORY" "/run/booted-system/kernel/lib/modules") ;; FIXME: Remove this crutch when the patch #40422, ;; updating to kmod 27 is merged. (setenv "MODPROBE_OPTIONS" "-C /etc/modprobe.d") (apply execl #$modprobe (cons #$modprobe (cdr (command-line)))))))) (define %linux-kernel-activation ;; Activation of the Linux kernel running on the bare metal (as opposed to ;; running in a container.) #~(begin ;; Tell the kernel to use our 'modprobe' command. (activate-modprobe #$%modprobe-wrapper) ;; Let users debug their own processes! (activate-ptrace-attach))) (define %linux-bare-metal-service ;; The service that does things that are needed on the "bare metal", but not ;; necessary or impossible in a container. (simple-service 'linux-bare-metal activation-service-type %linux-kernel-activation)) (define %hurd-rc-script ;; The RC script to be started upon boot. (program-file "rc" (with-imported-modules (source-module-closure '((guix build utils) (gnu build hurd-boot) (guix build syscalls))) #~(begin (use-modules (guix build utils) (gnu build hurd-boot) (guix build syscalls) (ice-9 match) (system repl repl) (srfi srfi-1) (srfi srfi-26)) (boot-hurd-system))))) (define (hurd-rc-entry rc) "Return, as a monadic value, an entry for the RC script in the system directory." (mlet %store-monad ((rc (lower-object rc))) (return `(("rc" ,rc))))) (define hurd-startup-service-type ;; The service that creates the initial SYSTEM/rc startup file. (service-type (name 'startup) (extensions (list (service-extension system-service-type hurd-rc-entry))) (default-value %hurd-rc-script) (description "This service creates an @file{rc} script in the system; that script is responsible for booting the Hurd."))) (define %hurd-startup-service ;; The service that produces the RC script. (service hurd-startup-service-type %hurd-rc-script)) (define special-files-service-type ;; Service to install "special files" such as /bin/sh and /usr/bin/env. (service-type (name 'special-files) (extensions (list (service-extension activation-service-type (lambda (files) #~(activate-special-files '#$files))))) (compose concatenate) (extend append) (description "Add special files to the root file system---e.g., @file{/usr/bin/env}."))) (define (extra-special-file file target) "Use TARGET as the \"special file\" FILE. For example, TARGET might be (file-append coreutils \"/bin/env\") and FILE could be \"/usr/bin/env\"." (simple-service (string->symbol (string-append "special-file-" file)) special-files-service-type `((,file ,target)))) (define (etc-directory service) "Return the directory for SERVICE, a service of type ETC-SERVICE-TYPE." (files->etc-directory (service-value service))) (define (files->etc-directory files) (define (assert-no-duplicates files) (let loop ((files files) (seen (set))) (match files (() #t) (((file _) rest ...) (when (set-contains? seen file) (raise (formatted-message (G_ "duplicate '~a' entry for /etc") file))) (loop rest (set-insert file seen)))))) ;; Detect duplicates early instead of letting them through, eventually ;; leading to a build failure of "etc.drv". (assert-no-duplicates files) (file-union "etc" files)) (define (etc-entry files) "Return an entry for the /etc directory consisting of FILES in the system directory." (with-monad %store-monad (return `(("etc" ,(files->etc-directory files)))))) (define etc-service-type (service-type (name 'etc) (extensions (list (service-extension activation-service-type (lambda (files) (let ((etc (files->etc-directory files))) #~(activate-etc #$etc)))) (service-extension system-service-type etc-entry))) (compose concatenate) (extend append) (default-value '()) (description "Populate the @file{/etc} directory."))) (define-deprecated (etc-service files) etc-service-type "Return a new service of ETC-SERVICE-TYPE that populates /etc with FILES. FILES must be a list of name/file-like object pairs." (service etc-service-type files)) (define (setuid-program->activation-gexp programs) "Return an activation gexp for setuid-program from PROGRAMS." (let ((programs (map (lambda (program) ;; FIXME This is really ugly, I didn't managed to use ;; "inherit" (let ((program-name (setuid-program-program program)) (setuid? (setuid-program-setuid? program)) (setgid? (setuid-program-setgid? program)) (user (setuid-program-user program)) (group (setuid-program-group program)) ) #~(setuid-program (setuid? #$setuid?) (setgid? #$setgid?) (user #$user) (group #$group) (program #$program-name)))) programs))) (with-imported-modules (source-module-closure '((gnu system setuid))) #~(begin (use-modules (gnu system setuid)) (activate-setuid-programs (list #$@programs)))))) (define setuid-program-service-type (service-type (name 'setuid-program) (extensions (list (service-extension activation-service-type setuid-program->activation-gexp))) (compose concatenate) (extend (lambda (config extensions) (append config extensions))) (description "Populate @file{/run/setuid-programs} with the specified executables, making them setuid and/or setgid."))) (define (packages->profile-entry packages) "Return a system entry for the profile containing PACKAGES." ;; XXX: 'mlet' is needed here for one reason: to get the proper ;; '%current-target' and '%current-target-system' bindings when ;; 'packages->manifest' is called, and thus when the 'package-inputs' ;; etc. procedures are called on PACKAGES. That way, conditionals in those ;; inputs see the "correct" value of these two parameters. See ;; <https://issues.guix.gnu.org/44952>. (mlet %store-monad ((_ (current-target-system))) (return `(("profile" ,(profile (content (packages->manifest (delete-duplicates packages eq?))))))))) (define profile-service-type ;; The service that populates the system's profile---i.e., ;; /run/current-system/profile. It is extended by package lists. (service-type (name 'profile) (extensions (list (service-extension system-service-type packages->profile-entry))) (compose concatenate) (extend append) (default-value '()) (description "This is the @dfn{system profile}, available as @file{/run/current-system/profile}. It contains packages that the sysadmin wants to be globally available to all the system users."))) (define (firmware->activation-gexp firmware) "Return a gexp to make the packages listed in FIRMWARE loadable by the kernel." (let ((directory (directory-union "firmware" firmware))) ;; Tell the kernel where firmware is. #~(activate-firmware (string-append #$directory "/lib/firmware")))) (define firmware-service-type ;; The service that collects firmware. (service-type (name 'firmware) (extensions (list (service-extension activation-service-type firmware->activation-gexp))) (compose concatenate) (extend append) (description "Make ``firmware'' files loadable by the operating system kernel. Firmware may then be uploaded to some of the machine's devices, such as Wifi cards."))) (define (gc-roots->system-entry roots) "Return an entry in the system's output containing symlinks to ROOTS." (mlet %store-monad ((entry (gexp->derivation "gc-roots" #~(let ((roots '#$roots)) (mkdir #$output) (chdir #$output) (for-each symlink roots (map number->string (iota (length roots)))))))) (return (if (null? roots) '() `(("gc-roots" ,entry)))))) (define gc-root-service-type ;; A service to associate extra garbage-collector roots to the system. This ;; is a simple hack that guarantees that the system retains references to ;; the given list of roots. Roots must be "lowerable" objects like ;; packages, or derivations. (service-type (name 'gc-roots) (extensions (list (service-extension system-service-type gc-roots->system-entry))) (compose concatenate) (extend append) (description "Register garbage-collector roots---i.e., store items that will not be reclaimed by the garbage collector.") (default-value '()))) ;; Configuration for the Linux kernel builder. (define-record-type* <linux-builder-configuration> linux-builder-configuration make-linux-builder-configuration linux-builder-configuration? this-linux-builder-configuration (kernel linux-builder-configuration-kernel) ; package (modules linux-builder-configuration-modules (default '()))) ; list of packages (define (package-for-kernel target-kernel module-package) "Return a package like MODULE-PACKAGE, adapted for TARGET-KERNEL, if possible (that is if there's a LINUX keyword argument in the build system)." (package (inherit module-package) (arguments (substitute-keyword-arguments (package-arguments module-package) ((#:linux kernel #f) target-kernel))))) (define (linux-builder-configuration->system-entry config) "Return the kernel entry of the 'system' directory." (let* ((kernel (linux-builder-configuration-kernel config)) (modules (linux-builder-configuration-modules config)) (kernel (profile (content (packages->manifest (cons kernel (map (lambda (module) (cond ((package? module) (package-for-kernel kernel module)) ;; support (,package "kernel-module-output") ((and (list? module) (package? (car module))) (cons (package-for-kernel kernel (car module)) (cdr module))) (else module))) modules)))) (hooks (list linux-module-database))))) (with-monad %store-monad (return `(("kernel" ,kernel)))))) (define linux-builder-service-type (service-type (name 'linux-builder) (extensions (list (service-extension system-service-type linux-builder-configuration->system-entry))) (default-value '()) (compose identity) (extend (lambda (config modifiers) (if (null? modifiers) config ((apply compose modifiers) config)))) (description "Builds the linux-libre kernel profile, containing the kernel itself and any linux-loadable kernel modules. This can be extended with a function that accepts the current configuration and returns a new configuration."))) (define (linux-loadable-module-builder-modifier modules) "Extends linux-builder-service-type by appending the given MODULES to the configuration of linux-builder-service-type." (lambda (config) (linux-builder-configuration (inherit config) (modules (append (linux-builder-configuration-modules config) modules))))) (define linux-loadable-module-service-type (service-type (name 'linux-loadable-modules) (extensions (list (service-extension linux-builder-service-type linux-loadable-module-builder-modifier))) (default-value '()) (compose concatenate) (extend append) (description "Adds packages and package outputs as modules included in the booted linux-libre profile. Other services can extend this service type to add particular modules to the set of linux-loadable modules."))) ;;; ;;; Service folding. ;;; (define-condition-type &missing-target-service-error &service-error missing-target-service-error? (service missing-target-service-error-service) (target-type missing-target-service-error-target-type)) (define-condition-type &ambiguous-target-service-error &service-error ambiguous-target-service-error? (service ambiguous-target-service-error-service) (target-type ambiguous-target-service-error-target-type)) (define (missing-target-error service target-type) (raise (condition (&missing-target-service-error (service service) (target-type target-type)) (&message (message (format #f (G_ "no target of type '~a' for service '~a'") (service-type-name target-type) (service-type-name (service-kind service)))))))) (define (service-back-edges services) "Return a procedure that, when passed a <service>, returns the list of <service> objects that depend on it." (define (add-edges service edges) (define (add-edge extension edges) (let ((target-type (service-extension-target extension))) (match (filter (lambda (service) (eq? (service-kind service) target-type)) services) ((target) (vhash-consq target service edges)) (() (missing-target-error service target-type)) (x (raise (condition (&ambiguous-target-service-error (service service) (target-type target-type)) (&message (message (format #f (G_ "more than one target service of type '~a'") (service-type-name target-type)))))))))) (fold add-edge edges (service-type-extensions (service-kind service)))) (let ((edges (fold add-edges vlist-null services))) (lambda (node) (reverse (vhash-foldq* cons '() node edges))))) (define (instantiate-missing-services services) "Return SERVICES, a list, augmented with any services targeted by extensions and missing from SERVICES. Only service types with a default value can be instantiated; other missing services lead to a '&missing-target-service-error'." (define (adjust-service-list svc result instances) (fold2 (lambda (extension result instances) (define target-type (service-extension-target extension)) (match (vhash-assq target-type instances) (#f (let ((default (service-type-default-value target-type))) (if (eq? &no-default-value default) (missing-target-error svc target-type) (let ((new (service target-type))) (values (cons new result) (vhash-consq target-type new instances)))))) (_ (values result instances)))) result instances (service-type-extensions (service-kind svc)))) (let loop ((services services)) (define instances (fold (lambda (service result) (vhash-consq (service-kind service) service result)) vlist-null services)) (define adjusted (fold2 adjust-service-list services instances services)) ;; If we instantiated services, they might in turn depend on missing ;; services. Loop until we've reached fixed point. (if (= (length adjusted) (vlist-length instances)) adjusted (loop adjusted)))) (define* (fold-services services #:key (target-type system-service-type)) "Fold SERVICES by propagating their extensions down to the root of type TARGET-TYPE; return the root service adjusted accordingly." (define dependents (service-back-edges services)) (define (matching-extension target) (let ((target (service-kind target))) (match-lambda (($ <service-extension> type) (eq? type target))))) (define (apply-extension target) (lambda (service) (match (find (matching-extension target) (service-type-extensions (service-kind service))) (($ <service-extension> _ compute) (compute (service-value service)))))) (match (filter (lambda (service) (eq? (service-kind service) target-type)) services) ((sink) ;; Use the state monad to keep track of already-visited services in the ;; graph and to memoize their value once folded. (run-with-state (let loop ((sink sink)) (mlet %state-monad ((visited (current-state))) (match (vhash-assq sink visited) (#f (mlet* %state-monad ((dependents (mapm %state-monad loop (dependents sink))) (visited (current-state)) (extensions -> (map (apply-extension sink) dependents)) (extend -> (service-type-extend (service-kind sink))) (compose -> (service-type-compose (service-kind sink))) (params -> (service-value sink)) (service -> ;; Distinguish COMPOSE and EXTEND because PARAMS typically ;; has a different type than the elements of EXTENSIONS. (if extend (service (service-kind sink) (extend params (compose extensions))) sink))) (mbegin %state-monad (set-current-state (vhash-consq sink service visited)) (return service)))) ((_ . service) ;SINK was already visited (return service))))) vlist-null)) (() (raise (make-compound-condition (condition (&missing-target-service-error (service #f) (target-type target-type))) (formatted-message (G_ "service of type '~a' not found") (service-type-name target-type))))) (x (raise (condition (&ambiguous-target-service-error (service #f) (target-type target-type)) (&message (message (format #f (G_ "more than one target service of type '~a'") (service-type-name target-type))))))))) (define (remove-service-extensions type lst) "Return TYPE, a service type, without any of the service extensions targeting one of the types in LST." (service-type (inherit type) (extensions (remove (lambda (extension) (memq (service-extension-target extension) lst)) (service-type-extensions type))))) (define-syntax-parameter for-home? ;; Whether the configuration being defined is for a Home service. (identifier-syntax #f)) (define-syntax-rule (for-home exp ...) "Mark EXP, which typically defines a service configuration, as targeting a Home service rather than a System service." (syntax-parameterize ((for-home? (identifier-syntax #t))) exp ...)) ;;; services.scm ends here.