a0a2a1a4a3a6a5a8a7a10a9a11a1a13a12a14a1a16a15a18a17a20a19a2a19a22a21a23a1a4a24a4a7a26a25a27a24a29a28a30a17a11a7a32a31a33a15a35a34
a36a38a37a40a39a42a41a44a43a42a45a22a46a47a41a48a45a22a43a48a49a47a50a2a50a22a51a52a46a53a45a22a54a55a49a53a56a57a41a58a41a48a59a11a60a61a41a62a39a48a49a63a41a44a39a64a51a65a45a66a41a58a41a44a59a20a49a67a39a48a49a47a43a42a68a52a69a70a46a47a49a53a39a58a41a48a59a22a49a71a39a10a72a66a39a10a41a44a49a47a54 a69a73a39a58a49a63a74a66a75a76a49a53a46a63a41a44a49a53a50a77a41a48a51
a75a22a43a42a51a78a68a66a69a73a50a22a49a80a79
a36a77a81a66a59a20a51a65a45a22a82a70a50a84a83a76a49a8a75a22a43a48a49a47a46a53a69a73a39a48a49a27a39a48a51a85a41a44a59a11a60a86a41a87a69a73a41a88a46a53a60a80a56a67a60a61a46a47a41a6a60a80a39a87a60a35a46a53a51a80a56a89a41a48a43a44a60a80a46a63a41a6a83a90a49a63a41a26a91a18a49a47a49a53a56a67a41a48a59a22a49a8a39a42a72a52a39a42a41a48a49a53a54a92a75a22a43a42a51a66a46a47a45a22a43a48a49a47a43
a60a80a56a20a50a67a39a48a51a61a93a94a41a26a91a95a60a80a43a42a49a23a50a22a49a63a68a65a49a47a82a70a51a65a75a76a49a53a43a96a60a80a56a22a50a67a41a48a59a52a45a20a39a96a56a22a49a47a49a53a50a22a39a6a41a44a51a58a83a76a49a23a45a20a56a22a50a22a49a53a43a42a39a42a41a44a60a80a56a22a50a11a60a80a83a20a82a70a49a23a83a57a72a97a75a22a43a42a51a66a46a47a45a22a43a48a49a47a43a48a39a98a60a61a56a22a50
a50a22a49a63a68a65a49a47a82a70a51a65a75a76a49a53a43a42a39a53a79
a36a100a99a98a49a47a39a48a46a53a43a42a69a70a83a76a49a53a39a27a101a30a102a20a103a80a104a105a41a44a59a20a49a106a39a10a72a52a39a42a41a44a49a47a54a107a91a87a69a70a82a70a82a108a50a22a51a85a83a22a45a20a41a109a56a22a51a80a41a98a102a11a110a86a101a111a69a73a41a88a91a87a69a70a82a73a82a105a50a22a51a55a69a73a41a113a112a114a51a65a83a52a115a42a49a53a46a63a41a44a69a116a68a65a49a53a39a6a83a22a45a20a41a6a56a22a51a61a41
a59a22a51a78a91a117a51a65a83a52a115a42a49a53a46a63a41a44a69a116a68a65a49a53a39a87a91a87a69a70a82a73a82a108a83a76a49a106a60a80a46a118a59a22a69a70a49a63a68a65a49a47a50a120a119a63a79
a121a117a1a4a19a22a7a32a122a33a15a123a19a20a21a23a1a4a24a4a7a32a25a27a24a29a28a30a17a22a7a32a31a18a15a35a34
a36a38a37a109a56a124a60a61a83a22a39a42a41a48a43a44a60a80a46a63a41a109a50a20a49a53a39a48a46a47a43a48a69a73a75a20a41a44a69a73a51a65a56a125a51a80a93a13a41a44a59a22a49a8a39a42a51a80a93a94a41a26a91a95a60a61a43a48a49a8a41a44a59a11a60a86a41a87a39a48a49a53a43a10a68a65a49a47a39a98a60a80a39a87a60a35a83a11a60a80a39a42a69a70a39a95a93a114a51a65a43a8a112a126a51a65a43a88a50a22a49a47a39a48a46a47a43a48a69a70a83a76a49a53a39a44a119
a69a116a41a44a39a88a50a22a49a63a41a118a60a80a69a73a82a70a49a53a50a125a50a20a49a53a39a48a69a73a127a65a56a124a60a80a56a22a50a97a69a70a54a55a75a22a82a70a49a47a54a62a49a47a56a89a41a44a60a61a41a44a69a73a51a65a56a105a79
a36a100a99a98a49a47a39a48a46a53a43a42a69a70a83a76a49a53a39a98a102a11a110a86a101a128a41a44a59a22a49a27a43a48a49a47a129a89a45a22a69a70a43a42a49a53a54a55a49a53a56a57a41a44a39a88a91a87a69a70a82a73a82a108a83a76a49a106a60a80a46a118a59a22a69a70a49a63a68a65a49a47a50a105a79
a36a100a130a131a43a48a69a73a54a58a60a61a43a42a72a62a43a48a49a132a60a61a50a22a49a53a43a42a39a87a91a87a69a73a82a70a82a90a83a90a49a8a39a42a51a80a93a94a41a26a91a95a60a61a43a48a49a106a50a22a49a53a39a42a69a70a127a65a56a22a49a47a43a48a39a6a60a80a56a22a50a84a69a73a54a62a75a22a82a73a49a53a54a55a49a53a56a57a41a44a49a47a43a48a39a95a43a48a60a61a41a44a59a20a49a53a43a95a41a44a59a22a60a80a56a124a45a20a39a48a49a53a43a42a39
a51a65a43a88a54a62a60a80a56a11a60a61a127a65a49a53a54a55a49a53a56a57a41a132a79
a36a38a133a88a59a22a49a27a127a65a51a65a60a80a82a70a39a87a60a80a56a20a50a124a46a47a51a65a56a22a39a42a41a48a43a44a60a80a69a73a56a57a41a44a39a87a39a48a75a76a49a53a46a47a69a73a134a11a49a47a50a124a69a73a56a97a43a42a49a53a129a89a45a22a69a73a43a48a49a53a54a55a49a53a56a57a41a48a39a109a50a22a51a52a46a53a45a20a54a62a49a47a56a89a41a6a39a42a59a22a51a65a45a22a82a73a50a97a83a76a49a8a41a44a43a48a60a80a46a53a49a136a135
a60a80a83a20a82a70a49a98a41a44a51a35a41a48a59a22a49a27a50a22a49a53a39a42a69a70a127a65a56a97a39a48a75a76a49a53a46a47a69a73a134a11a46a53a60a61a41a44a69a73a51a65a56a137a112a138a60a80a56a22a50a125a93a114a43a42a51a65a54a139a41a44a59a20a49a53a43a48a49a8a41a48a51a85a41a48a59a22a49a27a46a53a51a52a50a22a49a78a119a136a79
a140
a141 a31a18a15a18a17a20a1a16a15a18a17a20a19a77a31a143a142a97a9a11a1a4a3a6a5a8a7a32a9a11a1a16a12a14a1a13a15a18a17a22a19a2a144a8a31a87a24a4a5a8a12a14a1a16a15a18a17a105a34
a36a38a145a47a146a90a147a78a148a150a149a29a151a13a152a16a153a80a147a78a154a126a149a76a146a156a155a157a99a98a49a53a39a48a46a47a43a48a69a73a83a90a49a47a39a64a41a44a59a22a49a71a56a20a49a53a49a53a50a2a93a114a51a65a43a62a41a44a59a22a49a158a39a10a72a66a39a10a41a44a49a47a54 a60a80a56a22a50a2a75a22a82a70a60a80a46a53a49a47a39a64a69a73a41a58a69a70a56a2a46a47a51a65a56a57a41a44a49a63a74a52a41a53a159
a83a22a43a42a69a70a49a63a160a22a72a125a50a22a49a47a39a48a46a53a43a42a69a70a83a22a69a73a56a22a127a85a69a73a41a48a39a87a93a114a45a20a56a22a46a47a41a48a69a70a51a65a56a22a39a87a60a61a56a22a50a124a75a20a43a48a49a53a39a42a49a53a56a57a41a44a69a73a56a22a127a64a60a35a43a48a60a61a41a44a69a73a51a65a56a11a60a80a82a73a49a96a93a114a51a65a43a95a41a44a59a20a49a106a39a42a51a80a93a94a41a26a91a18a60a80a43a48a49a61a79a95a99a98a49a63a135
a39a42a46a53a43a48a69a73a83a90a49a47a39a113a59a20a51a150a91a161a41a48a59a22a49a55a39a42a72a52a39a42a41a48a49a53a54a123a134a22a41a44a39a106a69a70a56a57a41a44a51a84a41a44a59a20a49a62a51a78a68a65a49a47a43a44a60a80a82a73a82a156a83a22a45a22a39a48a69a73a56a22a49a53a39a42a39a23a51a65a43a106a39a42a41a48a43a44a60a61a41a48a49a53a127a65a69a73a46a85a51a65a83a52a115a42a49a53a46a63a41a44a69a116a68a65a49a53a39a113a51a80a93
a41a48a59a22a49a27a51a65a43a48a127a57a60a61a56a22a69a70a162a53a60a61a41a44a69a73a51a65a56a64a46a53a51a80a54a62a54a55a69a70a39a42a39a48a69a70a51a80a56a22a69a70a56a22a127a106a41a44a59a22a49a27a39a42a51a80a93a94a41a26a91a95a60a61a43a48a49a80a79
a36a164a163a90a165a4a166a47a147a78a167a52a168 a169a170a149a29a151a13a167a52a171a32a155a109a81a66a49a47a41a48a39a109a51a65a45a66a41a6a41a48a59a22a49a106a39a42a72a52a39a42a41a48a49a53a54a92a54a62a51a52a50a22a49a47a82a29a39a48a59a22a51a78a91a87a69a70a56a20a127a62a41a44a59a20a49a106a43a42a49a53a82a70a60a61a41a44a69a73a51a65a56a22a39a48a59a20a69a70a75a22a39a88a83a76a49a47a41a26a91a33a49a53a56
a41a48a59a22a49a8a39a42a72a52a39a42a41a48a49a53a54a107a46a47a51a65a54a62a75a76a51a65a56a22a49a47a56a57a41a44a39a87a60a80a56a22a50a125a41a48a59a22a49a8a39a42a72a52a39a42a41a48a49a53a54a92a60a80a56a20a50a97a69a116a41a44a39a95a49a47a56a57a68a66a69a73a43a48a51a65a56a20a54a62a49a47a56a89a41a53a79a156a37a96a56a97a60a80a83a22a39a10a41a44a43a44a60a61a46a47a41a87a50a11a60a61a41a44a60
a54a55a51a66a50a20a49a53a82a105a39a42a59a22a51a65a45a22a82a73a50a124a60a61a82a70a39a48a51a85a83a76a49a27a50a22a49a53a39a42a46a53a43a48a69a73a83a90a49a47a50a124a69a116a93a16a60a80a75a22a75a22a43a42a51a65a75a22a43a48a69a70a60a61a41a44a49a98a41a48a51a35a41a44a59a22a49a8a41a26a72a52a75a90a49a106a51a80a93a16a39a42a72a52a39a42a41a48a49a53a54a97a79
a36a164a163a90a165a4a166a47a147a78a167a52a168 a172a96a173a76a149a76a171a138a152a29a147a150a154a114a149a76a146a143a155a111a133a88a59a22a49a67a93a114a45a22a56a20a50a11a60a80a54a55a49a53a56a57a41a118a60a80a82a96a60a80a39a48a39a42a45a22a54a55a75a20a41a44a69a73a51a65a56a22a39a58a51a80a56a100a91a87a59a22a69a70a46a118a59a77a41a48a59a22a49a67a39a10a72a52a39a42a41a44a49a47a54 a69a73a39
a83a11a60a61a39a48a49a53a50a111a60a80a56a20a50a137a60a61a56a89a41a48a69a70a46a47a69a70a75a11a60a61a41a48a49a53a50a71a46a118a59a22a60a80a56a22a127a65a49a47a39a106a50a20a45a22a49a174a41a44a51a84a59a11a60a80a43a42a50a11a60a80a43a42a49a174a49a47a68a80a51a65a82a70a45a20a41a48a69a70a51a65a56a108a159a105a46a118a59a11a60a80a56a22a127a80a69a70a56a22a127a125a45a22a39a42a49a53a43a8a56a22a49a47a49a53a50a22a39a47a159
a49a63a41a44a46a80a79
a36a164a175a64a149a76a176a22a171a138a166a62a112a126a39a42a51a65a54a62a49a63a41a44a69a73a54a62a49a47a39a95a46a132a60a80a82a73a82a70a49a47a50a124a177a4a152a13a146a16a153a80a147a78a154a126a149a76a146a4a176a11a171a18a178a64a167a52a179a105a152a13a154a126a148a150a167a52a168a180a167a52a146a90a147a150a166a132a119a63a181a182a133a88a59a22a49a106a39a48a49a47a43a42a68a52a69a70a46a47a49a53a39a6a75a22a43a48a51a78a68a52a69a70a50a20a49a53a50
a93a114a51a65a43a95a41a48a59a22a49a27a45a22a39a48a49a47a43a53a79a156a133a88a59a22a69a73a39a6a69a73a56a22a46a53a82a73a45a22a50a22a49a47a39a87a41a48a69a70a54a55a69a70a56a22a127a23a60a80a56a22a50a124a60a80a46a53a46a47a45a22a43a44a60a61a46a47a72a84a43a48a49a47a129a89a45a22a69a70a43a42a49a53a54a55a49a53a56a57a41a44a39a47a79
a36a164a183a113a149a76a146a16a166a63a147a78a148a150a176a11a154a138a146a76a147a150a166a80a155a97a184a18a51a65a56a22a39a10a41a44a43a48a60a80a69a70a56a57a41a44a39a35a51a80a56a185a59a22a51a78a91a186a41a48a59a22a49a64a127a65a51a65a60a80a82a70a39a113a46a132a60a80a56a187a83a76a49a125a60a80a46a118a59a22a69a73a49a47a68a80a49a53a50a188a112a126a43a42a49a53a39a42a41a48a43a48a69a73a46a47a41a44a69a73a51a65a56a22a39a113a51a65a56
a41a48a59a22a49a27a83a90a49a47a59a11a60a132a68a66a69a73a51a65a43a88a51a80a93a13a41a44a59a22a49a27a39a42a51a80a93a94a41a26a91a95a60a61a43a48a49a113a60a80a56a22a50a84a41a44a59a22a49a8a93a114a43a48a49a47a49a53a50a22a51a80a54a189a51a80a93a13a41a44a59a22a49a27a50a22a49a47a39a48a69a70a127a80a56a22a49a53a43a44a119a63a79
a133a88a59a22a49a47a39a48a49a18a60a80a43a48a49a156a43a48a49a47a39a42a41a48a43a48a69a70a46a63a41a44a69a73a51a65a56a22a39a29a51a65a56a113a60a80a82a70a82a73a51a78a91a95a60a80a83a20a82a70a49a182a50a22a49a47a39a48a69a73a127a65a56a22a39a13a51a65a43a29a41a44a59a22a49a131a91a18a60a78a72a52a39a13a41a44a59a22a49a156a127a65a51a57a60a61a82a70a39a29a46a132a60a61a56a113a83a76a49a18a60a61a46a118a59a22a69a70a49a63a68a65a49a53a50a108a159
a49a61a79a190a127a22a79a116a159a120a39a44a60a61a93a114a49a63a41a26a72a84a46a53a51a65a56a20a39a42a41a44a43a48a60a80a69a70a56a57a41a48a39a53a159a120a59a11a60a80a43a42a50a20a91a95a60a61a43a48a49a80a159a120a75a22a43a42a51a65a127a65a43a48a60a80a54a62a54a55a69a70a56a20a127a35a82a191a60a80a56a22a127a80a45a11a60a80a127a65a49a47a39a53a159a120a60a80a56a22a50a97a39a42a41a44a60a80a56a22a50a11a60a61a43a48a50a22a39a87a41a44a59a11a60a86a41
a54a174a45a20a39a42a41a35a83a76a49a58a93a114a51a65a82a73a82a70a51a78a91a18a49a47a50a105a79a67a133a88a59a20a49a47a72a187a60a61a82a70a39a48a51a67a69a70a56a22a46a47a82a70a45a22a50a22a49a62a129a89a45a11a60a80a82a70a69a116a41a26a72a111a43a48a49a53a129a89a45a22a69a73a43a48a49a47a54a62a49a47a56a89a41a48a39a53a159a156a39a48a45a20a46a118a59a38a60a61a39a174a54a58a60a61a69a70a56a57a41a118a60a80a69a73a56a66a135
a60a80a83a20a69a70a82a70a69a116a41a26a72a65a159a66a60a132a68a80a60a61a69a70a82a191a60a61a83a22a69a70a82a73a69a73a41a26a72a65a159a89a49a63a41a44a46a80a79
a36a38a192a106a148a86a154a126a149a120a148a86a154a114a147a78a154a126a167a52a166a80a155a95a133a88a59a20a69a70a39a6a39a48a49a53a46a63a41a44a69a73a51a65a56a67a83a11a60a61a39a48a69a70a46a53a60a80a82a70a82a116a72a64a39a42a75a90a49a47a46a53a69a73a134a22a49a53a39a96a59a20a51a150a91a117a41a44a43a44a60a61a50a22a49a53a51a80a193a90a39a109a91a87a69a73a82a70a82a105a83a76a49a106a54a58a60a80a50a20a49a113a69a116a93a131a60a80a82a73a82a105a51a80a93
a41a48a59a22a49a62a127a80a51a57a60a80a82a70a39a106a60a80a56a20a50a180a46a53a51a80a56a22a39a42a41a48a43a44a60a80a69a73a56a89a41a48a39a113a46a53a60a80a56a22a56a22a51a61a41a174a83a76a49a62a46a47a51a65a54a62a75a20a82a70a49a47a41a48a49a53a82a116a72a128a60a80a46a118a59a22a69a73a49a47a68a65a49a47a50a185a69a70a56a128a41a44a59a20a49a62a50a22a49a47a39a48a69a73a127a65a56a52a194a164a39a42a51a65a54a55a49
a54a62a60a132a72a64a83a76a49a106a54a55a51a65a43a42a49a8a69a70a54a55a75a90a51a65a43a10a41a118a60a80a56a57a41a95a41a48a59a11a60a80a56a84a51a80a41a48a59a22a49a53a43a42a39a53a79a33a195a27a45a20a69a70a50a22a49a47a39a87a41a48a43a44a60a80a50a20a49a53a51a80a193a90a39a6a60a80a54a62a51a80a56a22a127a35a50a22a49a53a39a42a69a70a127a65a56a84a50a22a49a47a46a53a69a73a39a48a69a70a51a80a56a22a39a53a79
a36a38a145a47a146a90a147a78a167a89a148a150a196a197a176a11a153a65a167a52a166a38a147a78a149a198a147a78a199a13a167a200a167a52a146a90a173a4a154a114a148a150a149a90a146a13a168a180a167a52a146a90a147a57a155a100a201a26a56a22a75a22a45a20a41a97a51a65a43a84a51a65a45a20a41a48a75a22a45a20a41a97a69a70a56a57a41a48a49a53a43a42a93a126a60a61a46a53a49a53a39a97a60a80a56a20a50a188a43a42a49a53a82a70a49a63a68a61a60a80a56a57a41
a60a80a39a42a39a48a45a22a54a55a75a20a41a48a69a70a51a65a56a22a39a109a60a80a83a76a51a65a45a20a41a6a49a53a56a57a68a52a69a70a43a42a51a65a56a22a54a55a49a53a56a57a41a118a60a61a82a13a46a47a51a65a54a55a75a90a51a65a56a20a49a53a56a57a41a44a39a6a91a87a69a73a41a44a59a84a91a87a59a22a69a73a46a118a59a67a41a44a59a22a49a106a39a48a51a61a93a94a41a26a91a95a60a80a43a42a49a113a91a87a69a73a82a70a82a29a83a76a49
a69a73a56a89a41a48a49a53a43a48a60a80a46a47a41a48a69a70a56a22a127a22a79
a36a164a175a125a171a126a149a76a166a132a166a53a176a20a148a150a165a182a155a88a99a98a49a47a134a11a56a20a69a73a41a44a69a73a51a65a56a22a39a88a51a80a93a13a41a44a49a47a46a118a59a22a56a22a69a73a46a132a60a80a82a105a41a48a49a53a43a48a54a55a39a87a45a22a39a48a49a47a50a124a69a73a56a125a41a44a59a22a49a27a50a22a51a52a46a53a45a22a54a55a49a53a56a57a41a53a79
a36a38a145a47a146a16a151a4a167a57a202a29a167a52a166a80a155a95a203a143a60a80a43a42a69a70a51a65a45a22a39a95a41a26a72a52a75a76a49a53a39a6a51a80a93a16a69a70a56a22a50a22a49a136a74a66a49a53a39a6a54a58a60a132a72a64a83a76a49a27a75a22a43a48a51a78a68a52a69a70a50a20a49a53a50a105a79
a204
a205 a17a52a17a22a9a120a7a10a206a8a5a109a17a20a1a13a19a100a31a33a142a84a28a161a122a143a31a6a31a87a144a207a9a11a1a4a3a6a5a8a7a10a9a11a1a13a12a14a1a13a15a95a17a20a19a77a144a8a31a87a24a4a5a8a12a14a1a16a15a18a17a105a34
a36a100a208a87a49a132a60a80a50a22a60a80a83a22a82a70a49a27a60a61a56a22a50a124a45a20a56a22a50a22a49a53a43a42a39a42a41a44a60a80a56a22a50a11a60a80a83a20a82a70a49a27a83a57a72a125a46a53a45a22a39a10a41a44a51a65a54a55a49a53a43a42a39a53a159a120a45a22a39a42a49a53a43a48a39a47a159a76a60a80a56a22a50a97a50a22a49a53a39a42a69a70a127a65a56a22a49a47a43a48a39a47a79
a36a77a81a66a75a76a49a53a46a47a69a73a134a11a49a47a39a87a51a65a56a22a82a73a72a58a49a63a74a52a41a44a49a47a43a48a56a11a60a61a82a13a39a10a72a52a39a42a41a44a49a47a54a92a83a90a49a47a59a11a60a132a68a66a69a73a51a65a43a106a112a126a83a20a82a191a60a80a46a118a209a64a83a76a51a132a74a22a119a63a79
a36a77a81a52a41a48a43a48a45a22a46a63a41a44a45a22a43a42a49a53a50a97a41a44a51a85a83a90a49a27a49a53a60a80a39a42a72a64a41a48a51a85a46a118a59a11a60a80a56a22a127a65a49a61a79
a36a77a81a66a75a76a49a53a46a47a69a73a134a11a49a47a39a87a83a90a51a80a41a48a59a124a127a80a51a57a60a80a82a70a39a95a60a80a56a22a50a97a46a53a51a65a56a22a39a10a41a44a43a48a60a80a69a70a56a57a41a44a39a47a79
a36a38a37a109a83a22a82a70a49a98a41a48a51a55a39a42a49a53a43a10a68a65a49a174a60a61a39a109a60a35a43a42a49a47a93a114a49a53a43a42a49a53a56a22a46a47a49a106a41a48a51a66a51a80a82a108a93a114a51a65a43a88a39a42a72a52a39a10a41a44a49a53a54a107a54a62a60a80a69a73a56a89a41a44a60a80a69a70a56a20a49a53a43a48a39a47a79
a36a77a184a18a51a65a56a57a41a44a60a80a69a70a56a22a39a87a51a65a56a20a82a73a72a58a41a48a49a53a39a10a41a118a60a80a83a22a82a73a49a8a43a48a49a47a129a52a45a20a69a70a43a48a49a47a54a62a49a47a56a57a41a44a39a53a79
a210a96a211a187a212a52a211 a212a52a219 a211
a104a26a213a118a214a63a104a197a103a57a215a53a216a70a213a85a217a44a213a48a218 a217a44a213a63a220a58a213 a104a197a221a27a133a88a59a22a49a62a39a10a72a52a39a42a41a44a49a47a54a123a39a48a59a22a51a65a45a20a82a70a50a128a83a90a49a85a49a53a60a80a39a42a72a158a41a48a51a97a45a20a39a48a49a55a83a89a72a71a49a63a74a66a75a90a49a47a43a48a69a222a135
a49a47a56a22a46a53a49a47a50a180a46a47a51a65a56a57a41a44a43a48a51a80a82a70a82a70a49a47a43a48a39a96a60a80a56a22a50a128a39a48a59a22a51a80a45a22a82a70a50a128a83a76a49a35a51a65a43a48a127a57a60a61a56a22a69a70a162a47a49a53a50a158a69a70a56a158a39a42a45a22a46a118a59a137a60a125a91a18a60a132a72a67a41a48a59a11a60a61a41a27a45a22a39a42a49a53a43a27a49a53a43a42a43a48a51a65a43a42a39
a60a61a43a48a49a27a54a62a69a73a56a22a69a70a54a55a69a70a162a47a49a53a50a105a79
a210 a212a52a219 a211
a104a26a213a118a214a63a104a197a103a57a215a53a216a70a213a87a217a44a213a48a218 a217a44a213a63a220a58a213 a104a197a221a182a223a30a74a66a75a90a49a47a43a48a69a73a49a53a56a22a46a47a49a53a50a55a46a53a51a65a56a57a41a44a43a42a51a65a82a70a82a73a49a53a43a42a39a182a39a48a59a22a51a80a45a22a82a70a50a85a83a76a49a88a60a80a83a22a82a73a49a18a41a44a51a8a45a22a39a42a49a6a60a80a82a70a82a52a51a80a93
a41a48a59a22a49a18a39a10a72a52a39a42a41a44a49a47a54a224a93a114a45a22a56a20a46a47a41a44a69a73a51a65a56a22a39a16a60a61a93a94a41a44a49a47a43a182a60a87a41a44a51a80a41a44a60a80a82a89a51a80a93a22a41a26a91a33a51a98a59a22a51a65a45a22a43a42a39a16a41a48a43a44a60a80a69a73a56a22a69a70a56a22a127a20a79a13a37a6a93a94a41a44a49a47a43a16a41a44a59a20a69a70a39a4a41a44a43a44a60a61a69a70a56a22a69a73a56a22a127a22a159
a41a48a59a22a49a109a60a78a68a80a49a53a43a48a60a80a127a65a49a87a56a89a45a22a54a174a83a76a49a53a43a143a51a80a93a108a49a47a43a48a43a42a51a65a43a48a39a156a54a62a60a80a50a22a49a88a83a57a72a85a49a63a74a66a75a76a49a53a43a48a69a73a49a53a56a22a46a47a49a53a50a62a45a22a39a48a49a47a43a48a39a18a39a42a59a22a51a65a45a22a82a73a50a85a56a22a51a80a41a143a49a63a74a66a46a53a49a47a49a53a50
a41a26a91a33a51a58a75a76a49a53a43a88a50a22a60a78a72a80a79
a36a77a184a18a51a65a56a20a39a48a69a70a39a10a41a44a49a47a56a89a41a53a159a120a46a53a51a65a54a55a75a22a82a70a49a63a41a44a49a61a159a22a45a22a56a11a60a80a54a23a83a22a69a70a127a65a45a20a51a65a45a22a39a53a159a22a60a80a56a22a50a84a43a48a49a53a60a80a82a70a69a73a39a42a41a44a69a73a46a80a79
a36a77a81a66a75a76a49a53a46a47a69a73a134a11a49a47a39a6a60a80a46a53a46a47a49a53a75a20a41a44a60a80a83a22a82a70a49a27a43a42a49a53a39a48a75a76a51a65a56a22a39a42a49a53a39a6a41a44a51a85a45a22a56a22a50a22a49a47a39a48a69a73a43a48a49a53a50a97a49a47a68a80a49a53a56a57a41a44a39a47a79
a36a77a81a66a75a76a49a53a46a47a69a73a134a11a49a47a39a16a69a73a56a22a46a53a43a42a49a53a54a55a49a53a56a57a41a118a60a61a82a57a39a48a45a22a83a22a39a42a49a47a41a48a39a182a69a73a93a66a50a22a49a53a39a42a69a70a43a42a49a53a50a23a51a80a43a13a54a55a69a70a56a20a69a70a54a174a45a22a54a188a60a80a56a22a50a113a54a58a60a150a74a20a69a73a54a174a45a22a54a225a93a114a45a22a56a22a46a47a41a48a69a70a51a65a56a22a60a80a82a70a69a116a41a26a72a65a79
a36a77a81a66a75a76a49a53a46a47a69a73a134a11a49a47a39a174a41a44a59a22a49a125a46a118a59a22a60a80a56a22a127a65a49a47a39a62a60a61a56a89a41a48a69a70a46a47a69a70a75a11a60a61a41a48a49a53a50a185a69a73a56a185a41a44a59a22a49a64a93a114a45a66a41a44a45a22a43a42a49a111a112a126a69a70a56a137a41a44a59a22a49a125a49a47a56a89a68a52a69a73a43a48a51a65a56a22a54a55a49a53a56a57a41a85a51a65a43a23a69a70a56a185a41a44a59a20a49
a39a42a51a80a93a94a41a26a91a95a60a61a43a48a49a78a119a136a79
a226
Producibility
Constraints
Production
Requirements
In-service
Experience
Resolution
Issue
Lessons
Learned
Accidents
Incidents
and
Technology
Changes
Market Driven
Requirements
Airline
Industry
Trends
Requirements
Customer
Public
Perceptions
Regulatory
Requirements
Political
World
Airports and
Groundside
Requirements
Airspace
and ATC
Requirements
Infrastructure
Requirements
Boeing
Ensuring a Successful Product
Right Product
Appropriate and
Validated Requirements
a227
Allocated
Requirements
FHA
Trees
Fault
FMEA
Preliminary
Validate
Analyze and
Compliance
Requirements
Testing
Verification
Certification
Product
Successful
Design
Detailed
Safety Reliability
Availability
Maintainability
Supportability
Analyses
Physical and
Preliminary
Functional Def.
Product Right
Types of Specifications
Informal
Free form, natural language
Ambiguity and lack of organization can lead to
incompleteness, inconsistency, and misunderstandings
Formatted
Standardized syntax (e.g., UML)
Basic consistency and completeness checks
Imprecise semantics implies other sources of error
may still be present.
c
Copyright Nancy Leveson, Sept. 1999
a228
Intent Specifications
Part-Whole
Blackbox
Behavior
Physical
Representation
Principles
System Design
Purpose
System
Design
Representation
SystemOperatorEnvironment
Verification
Validation
Refinement
Operations
Intent
Each level supports a different type of reasoning about system.
Mappings between levels provide relational info necessary to
reason across hierarchical levels.
a229
Types of Specifications (2)
Formal
Syntax and semantics rigorously defined.
Precise form, perhaps mathematical.
Eliminate imprecision and ambiguity.
Provide basis for mathematically verifying equivalence
between specification and implementation.
May be hard to read without training.
Semantic distance too great?
c
Copyright Nancy Leveson, Sept. 1999
a230
INPUT SPACE
OUTPUT SPACE
I
OF
F(I) = O
A program is a mathematical object
A programming language is a mathematical language.
Therefore, we can prove properties about the program.
e.g. does it do what it is supposed to do
does it not do anything harmful
Building a model like engineers do, but need discrete rather than
continuous mathematics.
Copyright Nancy Leveson, Sept. 1999
c
a231
Formal Specifications
Goal: Describe external behavior without describing or
constraining internal design (implementation).
Formal method has 2 parts:
1. Logical theory: means by which reason about specs,
properties, and programs.
First-order predicate calculus (quantification over variables)
Second-order predicate calculus (quantification over relations)
Temporal logic
2. Structuring theory: defines elements being reasoned about
c
Copyright Nancy Leveson, Sept. 1999
a232
Structuring Theory
1. Descriptive Specifications: State desired properties in a
purely declarative way.
Input-output assertions
Algebraic specifications (set of axioms)
2. Operational Specification: Describe desired behavior by
providing a model of system.
Abstract Model (in terms of previously defined mathematical
objects, e.g., sets and sequences
operations, e.g., functions and mappings)
State machine (states and transitions between states)
Copyright Nancy Leveson, Sept. 1999
c
a140a78a233
Input-Output Assertions
S {P} Q
If S holds before execution of S, then Q holds afterward.
Examples:
n
sum =
a
j
j=1
1. sum = 0 { for i=1 to n do sum:=sum+a(i) }
2. proc search(A,n,x) int;
pre n 0
(result = 0
(result = i
i {1,...,i-1} : A[i] = x)
{1,...,n} : A[i] = x)i post
1 i n A[i] = x
c
Copyright Nancy Leveson, Sept. 1999
a140a65a140
Algebraic Specifications
Uses: (1) set of objects
(2) set of operations
(3) axioms specifying behavior of operations
Two parts to a specification:
syntax
axioms
Example: STACK
Intuitive definitions of stack operations:
NEW creates an empty stack
PUSH adds a new item to top of stack
TOP returns a copy of top item
POP removes top item
Empty tests for an empty stack
c
Copyright Nancy Leveson, Sept. 1999
a140a150a204
Algebraic Specifications (2)
SYNTAX:
OPERATION DOMAIN RANGE
New ( ) Stack
Push
Pop
Top
Empty
(Stack, Item) Stack
(Stack) Stack
(Stack) Item
(Stack) Boolean
AXIOMS: (stk is of type Stack, itm is of type Item)
1. Empty (new) = true
2. Empty (push (stk,itm)) = false
3. Pop (new) = error
4. Top (new) = error
5. Pop (Push (stk,itm)) = stk
6. Top (Push (stk,itm)) = itm
c
Copyright Nancy Leveson, Sept. 1999
a140a78a226
Algebraic Specifications (3)
Axioms stated in English:
1. A new stack is empty.
2. A stack is not empty immediately after pushing
an item onto it.
3. Attempting to pop a new stack results in an error.
4. There is no top item on a new stack.
5. Pushing an item onto a stack and immediately popping
it off leaves the stack unchanged.
6. Pushing an item onto a stack and immediately
requesting the top item returns the item just pushed
onto the stack.
c
Copyright Nancy Leveson, Sept. 1999
a227 a140
Algebraic Specifications (4)
If want to add an operator Replace (stk,itm):
Replace (stk,itm) = if Empty (stk) then error
else Push (Pop (stk),itm)
What does this do (in English)?
Canonical Form: A particular stack written in terms of
the operations used to form it.
A = = (Push (Push (Push (New,a)), b), c), d)
Top (Pop (Pop A)) = b
d
c
b
a
c
Copyright Nancy Leveson, Sept. 1999
a140a150a228