Antony Reynolds

Subscribe to Antony Reynolds feed
Musings on Fusion Middleware and SOA
Updated: 18 min ago

Building an FMW Cluster using Docker (Part III Running Docker Containers)

Mon, 2017-03-13 01:02

Click here for a Google Docs version of this document that doesn't suffer from the Oracle blog formatting problems

@import url('') ; .lst-kix_sholqrhc62dh-7>li:before { content: "\0025cb " } .lst-kix_sholqrhc62dh-8>li:before { content: "\0025a0 " } .lst-kix_sholqrhc62dh-6>li:before { content: "\0025cf " } ol.lst-kix_vf0l197cqv6l-2.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-2 0 } ol.lst-kix_xv318blpjdo-3.start { counter-reset: lst-ctn-kix_xv318blpjdo-3 0 } .lst-kix_sholqrhc62dh-1>li:before { content: "\0025cb " } .lst-kix_vf0l197cqv6l-2>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-2, lower-roman) ". " } .lst-kix_sholqrhc62dh-0>li:before { content: "\0025cf " } .lst-kix_emhp84jkv42c-3>li { counter-increment: lst-ctn-kix_emhp84jkv42c-3 } .lst-kix_ekmayt81kvbz-0>li:before { content: "\0025cf " } .lst-kix_vf0l197cqv6l-1>li:before { content: "\0025cb " } .lst-kix_jj5w63toozfm-4>li { counter-increment: lst-ctn-kix_jj5w63toozfm-4 } .lst-kix_ekmayt81kvbz-2>li:before { content: "\0025a0 " } ul.lst-kix_qeqyxe7gm97l-6 { list-style-type: none } ul.lst-kix_qeqyxe7gm97l-5 { list-style-type: none } .lst-kix_ekmayt81kvbz-1>li:before { content: "\0025cb " } ul.lst-kix_qeqyxe7gm97l-4 { list-style-type: none } .lst-kix_ekmayt81kvbz-3>li:before { content: "\0025cf " } ul.lst-kix_qeqyxe7gm97l-3 { list-style-type: none } .lst-kix_vf0l197cqv6l-0>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-0, decimal) ". " } ul.lst-kix_qeqyxe7gm97l-2 { list-style-type: none } ul.lst-kix_qeqyxe7gm97l-1 { list-style-type: none } ul.lst-kix_qeqyxe7gm97l-0 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-8.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-8 0 } .lst-kix_ekmayt81kvbz-5>li:before { content: "\0025a0 " } .lst-kix_ekmayt81kvbz-7>li:before { content: "\0025cb " } ul.lst-kix_4m04az9jmmj8-3 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-2 { list-style-type: none } ul.lst-kix_qeqyxe7gm97l-8 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-1 { list-style-type: none } .lst-kix_ekmayt81kvbz-4>li:before { content: "\0025cb " } .lst-kix_ekmayt81kvbz-8>li:before { content: "\0025a0 " } ul.lst-kix_qeqyxe7gm97l-7 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-0 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-7 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-6 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-5 { list-style-type: none } ul.lst-kix_4m04az9jmmj8-4 { list-style-type: none } .lst-kix_ekmayt81kvbz-6>li:before { content: "\0025cf " } ul.lst-kix_4m04az9jmmj8-8 { list-style-type: none } .lst-kix_s3mi7ukxwiwf-2>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-2 } .lst-kix_11a9ub9xa97v-0>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-0 } ol.lst-kix_emhp84jkv42c-4.start { counter-reset: lst-ctn-kix_emhp84jkv42c-4 0 } ol.lst-kix_xv318blpjdo-8.start { counter-reset: lst-ctn-kix_xv318blpjdo-8 0 } ul.lst-kix_6ril5iwt0fcl-5 { list-style-type: none } .lst-kix_q8ok0mh9yyto-8>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-8 } ul.lst-kix_6ril5iwt0fcl-4 { list-style-type: none } ul.lst-kix_6ril5iwt0fcl-3 { list-style-type: none } ul.lst-kix_6ril5iwt0fcl-2 { list-style-type: none } ul.lst-kix_6ril5iwt0fcl-8 { list-style-type: none } ul.lst-kix_6ril5iwt0fcl-7 { list-style-type: none } ul.lst-kix_6ril5iwt0fcl-6 { list-style-type: none } .lst-kix_vf0l197cqv6l-6>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-6 } .lst-kix_vf0l197cqv6l-4>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-4, lower-latin) ". " } ol.lst-kix_s3mi7ukxwiwf-8.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-8 0 } .lst-kix_vf0l197cqv6l-3>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-3, decimal) ". " } .lst-kix_vf0l197cqv6l-5>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-5, lower-roman) ". " } .lst-kix_vf0l197cqv6l-6>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-6, decimal) ". " } ul.lst-kix_6ril5iwt0fcl-1 { list-style-type: none } .lst-kix_vf0l197cqv6l-8>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-8, lower-roman) ". " } ul.lst-kix_6ril5iwt0fcl-0 { list-style-type: none } .lst-kix_xv318blpjdo-1>li { counter-increment: lst-ctn-kix_xv318blpjdo-1 } .lst-kix_vf0l197cqv6l-7>li:before { content: "" counter(lst-ctn-kix_vf0l197cqv6l-7, lower-latin) ". " } .lst-kix_bfzyeb917dp8-6>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-6 } ol.lst-kix_yly1729bcywk-0 { list-style-type: none } ol.lst-kix_yly1729bcywk-1 { list-style-type: none } ol.lst-kix_yly1729bcywk-6.start { counter-reset: lst-ctn-kix_yly1729bcywk-6 0 } ol.lst-kix_yly1729bcywk-4 { list-style-type: none } ol.lst-kix_yly1729bcywk-5 { list-style-type: none } ol.lst-kix_yly1729bcywk-2 { list-style-type: none } ol.lst-kix_yly1729bcywk-3 { list-style-type: none } .lst-kix_s3mi7ukxwiwf-1>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-1, lower-latin) ". " } ol.lst-kix_yly1729bcywk-8 { list-style-type: none } ul.lst-kix_hchtl271h88l-3 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-0.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-0 0 } ul.lst-kix_hchtl271h88l-2 { list-style-type: none } ol.lst-kix_yly1729bcywk-6 { list-style-type: none } ul.lst-kix_hchtl271h88l-5 { list-style-type: none } ol.lst-kix_yly1729bcywk-7 { list-style-type: none } ul.lst-kix_hchtl271h88l-4 { list-style-type: none } .lst-kix_gfromclascha-0>li:before { content: "\0025cf " } ul.lst-kix_hchtl271h88l-1 { list-style-type: none } ul.lst-kix_hchtl271h88l-0 { list-style-type: none } .lst-kix_gfromclascha-2>li:before { content: "\0025a0 " } .lst-kix_gfromclascha-4>li:before { content: "\0025cb " } ul.lst-kix_hchtl271h88l-7 { list-style-type: none } ul.lst-kix_hchtl271h88l-6 { list-style-type: none } ul.lst-kix_hchtl271h88l-8 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-7.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-7 0 } .lst-kix_6ril5iwt0fcl-0>li:before { content: "\0025cf " } .lst-kix_gfromclascha-6>li:before { content: "\0025cf " } .lst-kix_q97rvvc7c69e-5>li:before { content: "\0025a0 " } .lst-kix_q97rvvc7c69e-7>li:before { content: "\0025cb " } ol.lst-kix_q8ok0mh9yyto-8.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-8 0 } .lst-kix_6ril5iwt0fcl-2>li:before { content: "\0025a0 " } .lst-kix_q97rvvc7c69e-3>li:before { content: "\0025cf " } .lst-kix_s3mi7ukxwiwf-7>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-7, lower-latin) ". " } .lst-kix_6ril5iwt0fcl-4>li:before { content: "\0025cb " } .lst-kix_6ril5iwt0fcl-6>li:before { content: "\0025cf " } .lst-kix_xv318blpjdo-8>li { counter-increment: lst-ctn-kix_xv318blpjdo-8 } .lst-kix_s3mi7ukxwiwf-5>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-5, lower-roman) ". " } .lst-kix_6ril5iwt0fcl-8>li:before { content: "\0025a0 " } .lst-kix_s3mi7ukxwiwf-3>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-3, decimal) ". " } .lst-kix_ne7nl4nhpzqr-0>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-0 } .lst-kix_ne7nl4nhpzqr-7>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-7 } .lst-kix_vf0l197cqv6l-5>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-5 } ol.lst-kix_jj5w63toozfm-7.start { counter-reset: lst-ctn-kix_jj5w63toozfm-7 0 } .lst-kix_1wulu3ra2vwv-4>li:before { content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-4, decimal) ") " } .lst-kix_yly1729bcywk-3>li { counter-increment: lst-ctn-kix_yly1729bcywk-3 } .lst-kix_hchtl271h88l-5>li:before { content: "\0025a0 " } .lst-kix_1wulu3ra2vwv-6>li:before { content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-6, lower-roman) ") " } .lst-kix_yly1729bcywk-4>li { counter-increment: lst-ctn-kix_yly1729bcywk-4 } .lst-kix_hchtl271h88l-7>li:before { content: "\0025cb " } .lst-kix_1wulu3ra2vwv-8>li:before { content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-8, lower-roman) ") " } .lst-kix_gfromclascha-8>li:before { content: "\0025a0 " } .lst-kix_hchtl271h88l-3>li:before { content: "\0025cf " } .lst-kix_sholqrhc62dh-2>li:before { content: "\0025a0 " } ul.lst-kix_9jxnjym0nges-0 { list-style-type: none } .lst-kix_hchtl271h88l-1>li:before { content: "\0025cb " } .lst-kix_sholqrhc62dh-4>li:before { content: "\0025cb " } .lst-kix_1wulu3ra2vwv-2>li:before { content: "" counter(lst-ctn-kix_1wulu3ra2vwv-2, decimal) ". " } .lst-kix_1wulu3ra2vwv-0>li:before { content: "" counter(lst-ctn-kix_1wulu3ra2vwv-0, upper-roman) ". " } ol.lst-kix_11a9ub9xa97v-3.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-3 0 } .lst-kix_emhp84jkv42c-2>li { counter-increment: lst-ctn-kix_emhp84jkv42c-2 } ol.lst-kix_s3mi7ukxwiwf-4.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-4 0 } ul.lst-kix_h0kibz3smj6t-8 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-7.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-7 0 } .lst-kix_jkgkf1u9sy0c-2>li:before { content: "\0025a0 " } .lst-kix_f5kb4hocu5hh-2>li:before { content: "\0025a0 " } .lst-kix_jkgkf1u9sy0c-1>li:before { content: "\0025cb " } .lst-kix_f5kb4hocu5hh-6>li:before { content: "\0025cf " } ul.lst-kix_iv2x96orjh4l-2 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-1.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-1 0 } ul.lst-kix_iv2x96orjh4l-3 { list-style-type: none } .lst-kix_f5kb4hocu5hh-5>li:before { content: "\0025a0 " } ul.lst-kix_iv2x96orjh4l-0 { list-style-type: none } .lst-kix_jj5w63toozfm-3>li { counter-increment: lst-ctn-kix_jj5w63toozfm-3 } ul.lst-kix_iv2x96orjh4l-1 { list-style-type: none } ul.lst-kix_iv2x96orjh4l-6 { list-style-type: none } ul.lst-kix_iv2x96orjh4l-7 { list-style-type: none } .lst-kix_ne7nl4nhpzqr-6>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-6 } ul.lst-kix_iv2x96orjh4l-4 { list-style-type: none } ul.lst-kix_iv2x96orjh4l-5 { list-style-type: none } ul.lst-kix_h0kibz3smj6t-3 { list-style-type: none } ul.lst-kix_h0kibz3smj6t-2 { list-style-type: none } ul.lst-kix_h0kibz3smj6t-1 { list-style-type: none } .lst-kix_jkgkf1u9sy0c-5>li:before { content: "\0025a0 " } ul.lst-kix_h0kibz3smj6t-0 { list-style-type: none } ol.lst-kix_jj5w63toozfm-2.start { counter-reset: lst-ctn-kix_jj5w63toozfm-2 0 } ul.lst-kix_h0kibz3smj6t-7 { list-style-type: none } ul.lst-kix_h0kibz3smj6t-6 { list-style-type: none } ul.lst-kix_h0kibz3smj6t-5 { list-style-type: none } .lst-kix_jkgkf1u9sy0c-6>li:before { content: "\0025cf " } ul.lst-kix_h0kibz3smj6t-4 { list-style-type: none } .lst-kix_emhp84jkv42c-4>li { counter-increment: lst-ctn-kix_emhp84jkv42c-4 } ul.lst-kix_iv2x96orjh4l-8 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-3.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-3 0 } .lst-kix_b7256qmdgo85-3>li:before { content: "\0025cf " } .lst-kix_b7256qmdgo85-4>li:before { content: "\0025cb " } .lst-kix_b7256qmdgo85-7>li:before { content: "\0025cb " } ol.lst-kix_jj5w63toozfm-3.start { counter-reset: lst-ctn-kix_jj5w63toozfm-3 0 } .lst-kix_q97rvvc7c69e-2>li:before { content: "\0025a0 " } .lst-kix_b7256qmdgo85-8>li:before { content: "\0025a0 " } ol.lst-kix_bfzyeb917dp8-2.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-2 0 } ol.lst-kix_1wulu3ra2vwv-6.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-6 0 } ol.lst-kix_yly1729bcywk-7.start { counter-reset: lst-ctn-kix_yly1729bcywk-7 0 } .lst-kix_jj5w63toozfm-5>li { counter-increment: lst-ctn-kix_jj5w63toozfm-5 } .lst-kix_s3mi7ukxwiwf-0>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-0, decimal) ". " } ul.lst-kix_q97rvvc7c69e-4 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-3 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-6 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-6.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-6 0 } .lst-kix_s3mi7ukxwiwf-8>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-8, lower-roman) ". " } ul.lst-kix_q97rvvc7c69e-5 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-8 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-7 { list-style-type: none } .lst-kix_gfromclascha-3>li:before { content: "\0025cf " } ul.lst-kix_q97rvvc7c69e-0 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-2 { list-style-type: none } ul.lst-kix_q97rvvc7c69e-1 { list-style-type: none } .lst-kix_yly1729bcywk-3>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-3, decimal) ". " } .lst-kix_q97rvvc7c69e-6>li:before { content: "\0025cf " } .lst-kix_6ril5iwt0fcl-1>li:before { content: "\0025cb " } .lst-kix_iv2x96orjh4l-6>li:before { content: "\0025cf " } .lst-kix_yly1729bcywk-7>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-7, lower-latin) ". " } ol.lst-kix_s3mi7ukxwiwf-3.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-3 0 } .lst-kix_6ril5iwt0fcl-5>li:before { content: "\0025a0 " } .lst-kix_iv2x96orjh4l-2>li:before { content: "\0025a0 " } .lst-kix_q8ok0mh9yyto-1>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-1 } .lst-kix_s3mi7ukxwiwf-4>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-4, lower-latin) ". " } .lst-kix_5anu1k9tsyak-2>li:before { content: "\0025a0 " } .lst-kix_b7256qmdgo85-0>li:before { content: "\0025cf " } ul.lst-kix_vf0l197cqv6l-1 { list-style-type: none } .lst-kix_1wulu3ra2vwv-3>li:before { content: "" counter(lst-ctn-kix_1wulu3ra2vwv-3, lower-latin) ") " } .lst-kix_xoos54gyybzj-5>li:before { content: "\0025a0 " } ol.lst-kix_ne7nl4nhpzqr-5.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-5 0 } ol.lst-kix_vf0l197cqv6l-7.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-7 0 } .lst-kix_11a9ub9xa97v-7>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-7 } .lst-kix_1wulu3ra2vwv-7>li:before { content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-7, lower-latin) ") " } .lst-kix_xoos54gyybzj-1>li:before { content: "\0025cb " } ol.lst-kix_ne7nl4nhpzqr-2 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-3 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-0 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-1 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-6 { list-style-type: none } .lst-kix_hchtl271h88l-8>li:before { content: "\0025a0 " } ol.lst-kix_ne7nl4nhpzqr-7 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-4 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-5 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-8 { list-style-type: none } .lst-kix_1wulu3ra2vwv-6>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-6 } .lst-kix_gfromclascha-7>li:before { content: "\0025cb " } ol.lst-kix_ne7nl4nhpzqr-6.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-6 0 } ul.lst-kix_pcjo479wrta-0 { list-style-type: none } .lst-kix_86hsx13ssqid-5>li:before { content: "\0025a0 " } ul.lst-kix_pcjo479wrta-2 { list-style-type: none } ul.lst-kix_pcjo479wrta-1 { list-style-type: none } ul.lst-kix_pcjo479wrta-4 { list-style-type: none } .lst-kix_hchtl271h88l-4>li:before { content: "\0025cb " } ul.lst-kix_pcjo479wrta-3 { list-style-type: none } ul.lst-kix_pcjo479wrta-6 { list-style-type: none } ul.lst-kix_pcjo479wrta-5 { list-style-type: none } ul.lst-kix_pcjo479wrta-8 { list-style-type: none } ul.lst-kix_pcjo479wrta-7 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-8.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-8 0 } .lst-kix_hchtl271h88l-0>li:before { content: "\0025cf " } .lst-kix_86hsx13ssqid-1>li:before { content: "\0025cb " } .lst-kix_sholqrhc62dh-5>li:before { content: "\0025a0 " } .lst-kix_7tib3jrzu2u9-0>li:before { content: "\0025cf " } .lst-kix_7tib3jrzu2u9-5>li:before { content: "\0025a0 " } .lst-kix_7tib3jrzu2u9-2>li:before { content: "\0025a0 " } .lst-kix_7tib3jrzu2u9-3>li:before { content: "\0025cf " } ul.lst-kix_ndaonzmgp8vn-4 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-3 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-6 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-5 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-0 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-2 { list-style-type: none } .lst-kix_bfzyeb917dp8-4>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-4 } ul.lst-kix_ndaonzmgp8vn-1 { list-style-type: none } .lst-kix_7tib3jrzu2u9-8>li:before { content: "\0025a0 " } ul.lst-kix_sholqrhc62dh-6 { list-style-type: none } ul.lst-kix_sholqrhc62dh-5 { list-style-type: none } ul.lst-kix_sholqrhc62dh-4 { list-style-type: none } ul.lst-kix_sholqrhc62dh-3 { list-style-type: none } ul.lst-kix_sholqrhc62dh-8 { list-style-type: none } ul.lst-kix_sholqrhc62dh-7 { list-style-type: none } ul.lst-kix_sholqrhc62dh-2 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-6.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-6 0 } ul.lst-kix_sholqrhc62dh-1 { list-style-type: none } ul.lst-kix_sholqrhc62dh-0 { list-style-type: none } .lst-kix_emhp84jkv42c-1>li { counter-increment: lst-ctn-kix_emhp84jkv42c-1 } ul.lst-kix_ndaonzmgp8vn-8 { list-style-type: none } ul.lst-kix_ndaonzmgp8vn-7 { list-style-type: none } .lst-kix_j42a5dwgnqyq-8>li:before { content: "\0025a0 " } .lst-kix_5anu1k9tsyak-6>li:before { content: "\0025cf " } ol.lst-kix_bfzyeb917dp8-1.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-1 0 } .lst-kix_j42a5dwgnqyq-7>li:before { content: "\0025cb " } .lst-kix_qeqyxe7gm97l-7>li:before { content: "\0025cb " } .lst-kix_qeqyxe7gm97l-8>li:before { content: "\0025a0 " } .lst-kix_5anu1k9tsyak-8>li:before { content: "\0025a0 " } ol.lst-kix_s3mi7ukxwiwf-2.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-2 0 } .lst-kix_yly1729bcywk-5>li { counter-increment: lst-ctn-kix_yly1729bcywk-5 } ul.lst-kix_686a8e4qhxwx-4 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-3 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-2 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-1 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-8 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-7 { list-style-type: none } ul.lst-kix_686a8e4qhxwx-6 { list-style-type: none } .lst-kix_6qnkx7t1adn9-0>li:before { content: "\0025cf " } .lst-kix_qeqyxe7gm97l-0>li:before { content: "\0025cf " } ul.lst-kix_686a8e4qhxwx-5 { list-style-type: none } .lst-kix_6qnkx7t1adn9-1>li:before { content: "\0025cb " } .lst-kix_6qnkx7t1adn9-3>li:before { content: "\0025cf " } ul.lst-kix_686a8e4qhxwx-0 { list-style-type: none } .lst-kix_bfzyeb917dp8-0>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-0 } .lst-kix_qeqyxe7gm97l-5>li:before { content: "\0025a0 " } .lst-kix_j42a5dwgnqyq-0>li:before { content: "\0025cf " } .lst-kix_j42a5dwgnqyq-2>li:before { content: "\0025a0 " } .lst-kix_j42a5dwgnqyq-5>li:before { content: "\0025a0 " } ol.lst-kix_emhp84jkv42c-3.start { counter-reset: lst-ctn-kix_emhp84jkv42c-3 0 } .lst-kix_qeqyxe7gm97l-2>li:before { content: "\0025a0 " } .lst-kix_emhp84jkv42c-8>li { counter-increment: lst-ctn-kix_emhp84jkv42c-8 } ol.lst-kix_s3mi7ukxwiwf-0.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-0 0 } .lst-kix_86hsx13ssqid-8>li:before { content: "\0025a0 " } ol.lst-kix_vf0l197cqv6l-6 { list-style-type: none } ul.lst-kix_xoos54gyybzj-4 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-7 { list-style-type: none } ul.lst-kix_xoos54gyybzj-5 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-3.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-3 0 } ol.lst-kix_vf0l197cqv6l-4 { list-style-type: none } ul.lst-kix_xoos54gyybzj-6 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-5 { list-style-type: none } ul.lst-kix_xoos54gyybzj-7 { list-style-type: none } ul.lst-kix_xoos54gyybzj-8 { list-style-type: none } .lst-kix_s3mi7ukxwiwf-0>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-0 } ol.lst-kix_vf0l197cqv6l-8 { list-style-type: none } .lst-kix_yly1729bcywk-2>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-2, lower-roman) ". " } .lst-kix_fd1rucpc9vz2-5>li:before { content: "\0025a0 " } .lst-kix_fd1rucpc9vz2-7>li:before { content: "\0025cb " } ol.lst-kix_vf0l197cqv6l-2 { list-style-type: none } .lst-kix_pcjo479wrta-5>li:before { content: "\0025a0 " } .lst-kix_iv2x96orjh4l-5>li:before { content: "\0025a0 " } ul.lst-kix_xoos54gyybzj-0 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-3 { list-style-type: none } ul.lst-kix_xoos54gyybzj-1 { list-style-type: none } ol.lst-kix_vf0l197cqv6l-0 { list-style-type: none } ul.lst-kix_xoos54gyybzj-2 { list-style-type: none } .lst-kix_yly1729bcywk-0>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-0, decimal) ". " } .lst-kix_yly1729bcywk-8>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-8, lower-roman) ". " } ul.lst-kix_xoos54gyybzj-3 { list-style-type: none } .lst-kix_iv2x96orjh4l-3>li:before { content: "\0025cf " } .lst-kix_5anu1k9tsyak-3>li:before { content: "\0025cf " } .lst-kix_5anu1k9tsyak-5>li:before { content: "\0025a0 " } .lst-kix_1wulu3ra2vwv-8>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-8 } ol.lst-kix_q8ok0mh9yyto-6 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-5 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-4 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-3 { list-style-type: none } .lst-kix_9jxnjym0nges-0>li:before { content: "\0025cf " } ol.lst-kix_q8ok0mh9yyto-8 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-7 { list-style-type: none } .lst-kix_xoos54gyybzj-8>li:before { content: "\0025a0 " } ol.lst-kix_emhp84jkv42c-0.start { counter-reset: lst-ctn-kix_emhp84jkv42c-0 0 } .lst-kix_opi66v2qdsjs-8>li:before { content: "\0025a0 " } .lst-kix_ndaonzmgp8vn-4>li:before { content: "\0025cb " } ol.lst-kix_q8ok0mh9yyto-2 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-1 { list-style-type: none } .lst-kix_9jxnjym0nges-2>li:before { content: "\0025a0 " } ol.lst-kix_q8ok0mh9yyto-0 { list-style-type: none } .lst-kix_xoos54gyybzj-6>li:before { content: "\0025cf " } .lst-kix_ndaonzmgp8vn-2>li:before { content: "\0025a0 " } .lst-kix_opi66v2qdsjs-2>li:before { content: "\0025a0 " } .lst-kix_11a9ub9xa97v-0>li:before { content: "" counter(lst-ctn-kix_11a9ub9xa97v-0, upper-roman) ". " } ol.lst-kix_bfzyeb917dp8-4.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-4 0 } .lst-kix_q8ok0mh9yyto-3>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-3 } .lst-kix_xoos54gyybzj-0>li:before { content: "\0025cf " } .lst-kix_11a9ub9xa97v-8>li:before { content: "(" counter(lst-ctn-kix_11a9ub9xa97v-8, lower-roman) ") " } .lst-kix_86hsx13ssqid-0>li:before { content: "\0025cf " } .lst-kix_86hsx13ssqid-6>li:before { content: "\0025cf " } .lst-kix_9jxnjym0nges-8>li:before { content: "\0025a0 " } .lst-kix_11a9ub9xa97v-6>li:before { content: "(" counter(lst-ctn-kix_11a9ub9xa97v-6, lower-roman) ") " } ul.lst-kix_9jxnjym0nges-2 { list-style-type: none } .lst-kix_xv318blpjdo-2>li:before { content: "" counter(lst-ctn-kix_xv318blpjdo-2, decimal) ". " } ul.lst-kix_9jxnjym0nges-1 { list-style-type: none } ul.lst-kix_9jxnjym0nges-4 { list-style-type: none } ul.lst-kix_9jxnjym0nges-3 { list-style-type: none } .lst-kix_h0kibz3smj6t-5>li:before { content: "\0025a0 " } ul.lst-kix_9jxnjym0nges-6 { list-style-type: none } ul.lst-kix_9jxnjym0nges-5 { list-style-type: none } ul.lst-kix_9jxnjym0nges-8 { list-style-type: none } ul.lst-kix_9jxnjym0nges-7 { list-style-type: none } .lst-kix_xv318blpjdo-2>li { counter-increment: lst-ctn-kix_xv318blpjdo-2 } .lst-kix_f5kb4hocu5hh-3>li:before { content: "\0025cf " } .lst-kix_s3mi7ukxwiwf-3>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-3 } .lst-kix_bfzyeb917dp8-7>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-7 } .lst-kix_f5kb4hocu5hh-8>li:before { content: "\0025a0 " } ol.lst-kix_emhp84jkv42c-1.start { counter-reset: lst-ctn-kix_emhp84jkv42c-1 0 } .lst-kix_jkgkf1u9sy0c-4>li:before { content: "\0025cb " } ol.lst-kix_jj5w63toozfm-3 { list-style-type: none } ol.lst-kix_jj5w63toozfm-4 { list-style-type: none } ol.lst-kix_jj5w63toozfm-5 { list-style-type: none } .lst-kix_jkgkf1u9sy0c-7>li:before { content: "\0025cb " } .lst-kix_xv318blpjdo-7>li:before { content: "(" counter(lst-ctn-kix_xv318blpjdo-7, lower-latin) ") " } .lst-kix_686a8e4qhxwx-5>li:before { content: "\0025a0 " } ol.lst-kix_jj5w63toozfm-6 { list-style-type: none } ol.lst-kix_jj5w63toozfm-7 { list-style-type: none } ol.lst-kix_jj5w63toozfm-8 { list-style-type: none } .lst-kix_h0kibz3smj6t-2>li:before { content: "\0025a0 " } .lst-kix_q8ok0mh9yyto-7>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-7 } ol.lst-kix_jj5w63toozfm-0 { list-style-type: none } ol.lst-kix_jj5w63toozfm-1 { list-style-type: none } .lst-kix_686a8e4qhxwx-2>li:before { content: "\0025a0 " } ol.lst-kix_jj5w63toozfm-2 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-3 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-8.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-8 0 } ol.lst-kix_11a9ub9xa97v-2 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-1 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-0 { list-style-type: none } .lst-kix_b7256qmdgo85-2>li:before { content: "\0025a0 " } ol.lst-kix_11a9ub9xa97v-8 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-7 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-6 { list-style-type: none } ol.lst-kix_11a9ub9xa97v-5 { list-style-type: none } .lst-kix_4m04az9jmmj8-7>li:before { content: "\0025cb " } ol.lst-kix_11a9ub9xa97v-4 { list-style-type: none } .lst-kix_b7256qmdgo85-5>li:before { content: "\0025a0 " } .lst-kix_q97rvvc7c69e-1>li:before { content: "\0025cb " } .lst-kix_yly1729bcywk-2>li { counter-increment: lst-ctn-kix_yly1729bcywk-2 } .lst-kix_q8ok0mh9yyto-5>li:before { content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-5, lower-latin) ") " } .lst-kix_4m04az9jmmj8-4>li:before { content: "\0025cb " } .lst-kix_bfzyeb917dp8-3>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-3 } .lst-kix_ne7nl4nhpzqr-7>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-7, lower-latin) ". " } .lst-kix_q8ok0mh9yyto-8>li:before { content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-8, lower-roman) ") " } ol.lst-kix_bfzyeb917dp8-5 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-4 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-3 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-2 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-8 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-7 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-6 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-1 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-0 { list-style-type: none } ol.lst-kix_emhp84jkv42c-5.start { counter-reset: lst-ctn-kix_emhp84jkv42c-5 0 } .lst-kix_q8ok0mh9yyto-0>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-0 } .lst-kix_l7z426mwssm0-3>li:before { content: "\0025cf " } .lst-kix_iv2x96orjh4l-8>li:before { content: "\0025a0 " } .lst-kix_6qnkx7t1adn9-6>li:before { content: "\0025cf " } .lst-kix_gfromclascha-5>li:before { content: "\0025a0 " } .lst-kix_pcjo479wrta-2>li:before { content: "\0025a0 " } ol.lst-kix_emhp84jkv42c-8.start { counter-reset: lst-ctn-kix_emhp84jkv42c-8 0 } .lst-kix_11a9ub9xa97v-8>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-8 } .lst-kix_x1epm4iu41dp-5>li:before { content: "\0025a0 " } .lst-kix_q97rvvc7c69e-4>li:before { content: "\0025cb " } .lst-kix_xv318blpjdo-5>li { counter-increment: lst-ctn-kix_xv318blpjdo-5 } .lst-kix_1wulu3ra2vwv-5>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-5 } .lst-kix_5anu1k9tsyak-0>li:before { content: "\0025cf " } .lst-kix_fy6y7gyjejoh-4>li:before { content: "\0025cb " } .lst-kix_ndaonzmgp8vn-7>li:before { content: "\0025cb " } .lst-kix_iv2x96orjh4l-0>li:before { content: "\0025cf " } .lst-kix_yly1729bcywk-5>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-5, lower-roman) ". " } .lst-kix_s3mi7ukxwiwf-2>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-2, lower-roman) ". " } .lst-kix_6ril5iwt0fcl-7>li:before { content: "\0025cb " } .lst-kix_emhp84jkv42c-4>li:before { content: "(" counter(lst-ctn-kix_emhp84jkv42c-4, decimal) ") " } .lst-kix_emhp84jkv42c-5>li { counter-increment: lst-ctn-kix_emhp84jkv42c-5 } .lst-kix_jj5w63toozfm-4>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-4, lower-latin) ". " } .lst-kix_1wulu3ra2vwv-5>li:before { content: "(" counter(lst-ctn-kix_1wulu3ra2vwv-5, lower-latin) ") " } ul.lst-kix_u0uqs69v9qbh-8 { list-style-type: none } .lst-kix_xoos54gyybzj-3>li:before { content: "\0025cf " } .lst-kix_11a9ub9xa97v-1>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-1 } ul.lst-kix_u0uqs69v9qbh-4 { list-style-type: none } .lst-kix_hchtl271h88l-6>li:before { content: "\0025cf " } ul.lst-kix_u0uqs69v9qbh-5 { list-style-type: none } .lst-kix_opi66v2qdsjs-5>li:before { content: "\0025a0 " } .lst-kix_lemcawe54w5c-5>li:before { content: "\0025a0 " } ul.lst-kix_u0uqs69v9qbh-6 { list-style-type: none } ul.lst-kix_u0uqs69v9qbh-7 { list-style-type: none } ul.lst-kix_u0uqs69v9qbh-0 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-6 { list-style-type: none } ul.lst-kix_u0uqs69v9qbh-1 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-5 { list-style-type: none } ul.lst-kix_u0uqs69v9qbh-2 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-8 { list-style-type: none } ul.lst-kix_u0uqs69v9qbh-3 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-7 { list-style-type: none } ol.lst-kix_emhp84jkv42c-7.start { counter-reset: lst-ctn-kix_emhp84jkv42c-7 0 } .lst-kix_fd1rucpc9vz2-2>li:before { content: "\0025a0 " } ul.lst-kix_jkgkf1u9sy0c-4 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-5 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-6 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-0 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-7 { list-style-type: none } .lst-kix_bfzyeb917dp8-2>li:before { content: "" counter(lst-ctn-kix_bfzyeb917dp8-2, decimal) ". " } .lst-kix_gyhqddkw9i05-1>li:before { content: "\0025cb " } ul.lst-kix_jkgkf1u9sy0c-8 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-2 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-1 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-4 { list-style-type: none } ul.lst-kix_gyhqddkw9i05-3 { list-style-type: none } .lst-kix_11a9ub9xa97v-3>li:before { content: "" counter(lst-ctn-kix_11a9ub9xa97v-3, lower-latin) ") " } ol.lst-kix_emhp84jkv42c-6.start { counter-reset: lst-ctn-kix_emhp84jkv42c-6 0 } .lst-kix_8p26nc4xx5n8-1>li:before { content: "\0025cb " } .lst-kix_u0uqs69v9qbh-5>li:before { content: "\0025a0 " } .lst-kix_f5kb4hocu5hh-0>li:before { content: "\0025cf " } .lst-kix_9jxnjym0nges-5>li:before { content: "\0025a0 " } .lst-kix_86hsx13ssqid-3>li:before { content: "\0025cf " } ul.lst-kix_jkgkf1u9sy0c-0 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-1 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-2 { list-style-type: none } ul.lst-kix_jkgkf1u9sy0c-3 { list-style-type: none } .lst-kix_vf0l197cqv6l-2>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-2 } ol.lst-kix_jj5w63toozfm-5.start { counter-reset: lst-ctn-kix_jj5w63toozfm-5 0 } ul.lst-kix_bijol4nzhwf0-8 { list-style-type: none } ol.lst-kix_emhp84jkv42c-0 { list-style-type: none } ol.lst-kix_emhp84jkv42c-2 { list-style-type: none } ol.lst-kix_emhp84jkv42c-1 { list-style-type: none } ol.lst-kix_emhp84jkv42c-4 { list-style-type: none } ol.lst-kix_emhp84jkv42c-3 { list-style-type: none } ol.lst-kix_emhp84jkv42c-6 { list-style-type: none } ol.lst-kix_emhp84jkv42c-5 { list-style-type: none } ol.lst-kix_emhp84jkv42c-8 { list-style-type: none } .lst-kix_yly1729bcywk-7>li { counter-increment: lst-ctn-kix_yly1729bcywk-7 } ol.lst-kix_emhp84jkv42c-7 { list-style-type: none } .lst-kix_11a9ub9xa97v-4>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-4 } .lst-kix_1qz6dmm9b14l-4>li:before { content: "\0025cb " } .lst-kix_1qz6dmm9b14l-3>li:before { content: "\0025cf " } .lst-kix_1qz6dmm9b14l-5>li:before { content: "\0025a0 " } ul.lst-kix_j42a5dwgnqyq-0 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-1 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-2 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-3 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-4 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-5 { list-style-type: none } .lst-kix_1qz6dmm9b14l-0>li:before { content: "\0025cf " } .lst-kix_1qz6dmm9b14l-8>li:before { content: "\0025a0 " } ul.lst-kix_j42a5dwgnqyq-6 { list-style-type: none } ul.lst-kix_j42a5dwgnqyq-7 { list-style-type: none } .lst-kix_1qz6dmm9b14l-1>li:before { content: "\0025cb " } ol.lst-kix_bfzyeb917dp8-0.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-0 0 } ul.lst-kix_j42a5dwgnqyq-8 { list-style-type: none } .lst-kix_1qz6dmm9b14l-2>li:before { content: "\0025a0 " } ul.lst-kix_bijol4nzhwf0-4 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-5 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-6 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-7 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-0 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-1 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-2 { list-style-type: none } ul.lst-kix_bijol4nzhwf0-3 { list-style-type: none } .lst-kix_jj5w63toozfm-3>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-3, decimal) ". " } .lst-kix_1wulu3ra2vwv-2>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-2 } .lst-kix_1qz6dmm9b14l-7>li:before { content: "\0025cb " } .lst-kix_jj5w63toozfm-2>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-2, lower-roman) ". " } .lst-kix_ne7nl4nhpzqr-3>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-3 } .lst-kix_q8ok0mh9yyto-4>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-4 } .lst-kix_1qz6dmm9b14l-6>li:before { content: "\0025cf " } .lst-kix_jj5w63toozfm-1>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-1, lower-latin) ". " } .lst-kix_h9mjmxara98n-7>li:before { content: "\0025cb " } .lst-kix_bijol4nzhwf0-7>li:before { content: "\0025cb " } .lst-kix_jj5w63toozfm-0>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-0, decimal) ". " } .lst-kix_h9mjmxara98n-6>li:before { content: "\0025cf " } .lst-kix_h9mjmxara98n-8>li:before { content: "\0025a0 " } .lst-kix_bijol4nzhwf0-6>li:before { content: "\0025cf " } .lst-kix_bijol4nzhwf0-8>li:before { content: "\0025a0 " } .lst-kix_h9mjmxara98n-5>li:before { content: "\0025a0 " } .lst-kix_bijol4nzhwf0-5>li:before { content: "\0025a0 " } .lst-kix_h9mjmxara98n-3>li:before { content: "\0025cf " } .lst-kix_bijol4nzhwf0-3>li:before { content: "\0025cf " } .lst-kix_h9mjmxara98n-2>li:before { content: "\0025a0 " } .lst-kix_h9mjmxara98n-4>li:before { content: "\0025cb " } .lst-kix_bijol4nzhwf0-2>li:before { content: "\0025a0 " } .lst-kix_bijol4nzhwf0-4>li:before { content: "\0025cb " } ol.lst-kix_q8ok0mh9yyto-1.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-1 0 } ol.lst-kix_s3mi7ukxwiwf-1.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-1 0 } .lst-kix_h9mjmxara98n-0>li:before { content: "\0025cf " } .lst-kix_bijol4nzhwf0-0>li:before { content: "\0025cf " } .lst-kix_h9mjmxara98n-1>li:before { content: "\0025cb " } .lst-kix_bijol4nzhwf0-1>li:before { content: "\0025cb " } .lst-kix_jj5w63toozfm-8>li { counter-increment: lst-ctn-kix_jj5w63toozfm-8 } ol.lst-kix_ne7nl4nhpzqr-3.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-3 0 } ul.lst-kix_gfromclascha-0 { list-style-type: none } ol.lst-kix_emhp84jkv42c-2.start { counter-reset: lst-ctn-kix_emhp84jkv42c-2 0 } .lst-kix_l7z426mwssm0-2>li:before { content: "\0025a0 " } .lst-kix_ne7nl4nhpzqr-4>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-4, lower-latin) ". " } .lst-kix_l7z426mwssm0-0>li:before { content: "\0025cf " } .lst-kix_l7z426mwssm0-4>li:before { content: "\0025cb " } ul.lst-kix_gfromclascha-7 { list-style-type: none } ul.lst-kix_gfromclascha-8 { list-style-type: none } ul.lst-kix_gfromclascha-5 { list-style-type: none } .lst-kix_ne7nl4nhpzqr-0>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-0, decimal) ". " } .lst-kix_ne7nl4nhpzqr-2>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-2, lower-roman) ". " } ul.lst-kix_gfromclascha-6 { list-style-type: none } .lst-kix_x1epm4iu41dp-8>li:before { content: "\0025a0 " } ul.lst-kix_gfromclascha-3 { list-style-type: none } ul.lst-kix_gfromclascha-4 { list-style-type: none } ul.lst-kix_gfromclascha-1 { list-style-type: none } .lst-kix_bfzyeb917dp8-3>li:before { content: "" counter(lst-ctn-kix_bfzyeb917dp8-3, lower-latin) ") " } ul.lst-kix_gfromclascha-2 { list-style-type: none } ul.lst-kix_opi66v2qdsjs-3 { list-style-type: none } .lst-kix_x1epm4iu41dp-2>li:before { content: "\0025a0 " } ol.lst-kix_11a9ub9xa97v-1.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-1 0 } ul.lst-kix_opi66v2qdsjs-2 { list-style-type: none } ul.lst-kix_opi66v2qdsjs-1 { list-style-type: none } ul.lst-kix_opi66v2qdsjs-0 { list-style-type: none } .lst-kix_q8ok0mh9yyto-0>li:before { content: "" counter(lst-ctn-kix_q8ok0mh9yyto-0, upper-roman) ". " } .lst-kix_fy6y7gyjejoh-3>li:before { content: "\0025cf " } .lst-kix_bfzyeb917dp8-5>li:before { content: "(" counter(lst-ctn-kix_bfzyeb917dp8-5, lower-latin) ") " } .lst-kix_jj5w63toozfm-0>li { counter-increment: lst-ctn-kix_jj5w63toozfm-0 } .lst-kix_x1epm4iu41dp-6>li:before { content: "\0025cf " } ul.lst-kix_opi66v2qdsjs-8 { list-style-type: none } ul.lst-kix_opi66v2qdsjs-7 { list-style-type: none } .lst-kix_x1epm4iu41dp-4>li:before { content: "\0025cb " } ul.lst-kix_opi66v2qdsjs-6 { list-style-type: none } ul.lst-kix_opi66v2qdsjs-5 { list-style-type: none } .lst-kix_fy6y7gyjejoh-1>li:before { content: "\0025cb " } ul.lst-kix_opi66v2qdsjs-4 { list-style-type: none } .lst-kix_bfzyeb917dp8-7>li:before { content: "(" counter(lst-ctn-kix_bfzyeb917dp8-7, lower-latin) ") " } .lst-kix_emhp84jkv42c-7>li { counter-increment: lst-ctn-kix_emhp84jkv42c-7 } .lst-kix_fy6y7gyjejoh-7>li:before { content: "\0025cb " } ol.lst-kix_xv318blpjdo-1.start { counter-reset: lst-ctn-kix_xv318blpjdo-1 0 } .lst-kix_x1epm4iu41dp-0>li:before { content: "\0025cf " } ol.lst-kix_vf0l197cqv6l-0.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-0 0 } .lst-kix_fy6y7gyjejoh-5>li:before { content: "\0025a0 " } .lst-kix_emhp84jkv42c-3>li:before { content: "" counter(lst-ctn-kix_emhp84jkv42c-3, lower-latin) ") " } .lst-kix_emhp84jkv42c-5>li:before { content: "(" counter(lst-ctn-kix_emhp84jkv42c-5, lower-latin) ") " } .lst-kix_lemcawe54w5c-8>li:before { content: "\0025a0 " } ol.lst-kix_yly1729bcywk-4.start { counter-reset: lst-ctn-kix_yly1729bcywk-4 0 } .lst-kix_emhp84jkv42c-1>li:before { content: "" counter(lst-ctn-kix_emhp84jkv42c-1, upper-latin) ". " } .lst-kix_emhp84jkv42c-7>li:before { content: "(" counter(lst-ctn-kix_emhp84jkv42c-7, lower-latin) ") " } .lst-kix_lemcawe54w5c-6>li:before { content: "\0025cf " } .lst-kix_jj5w63toozfm-5>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-5, lower-roman) ". " } .lst-kix_bfzyeb917dp8-2>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-2 } ul.lst-kix_1qz6dmm9b14l-6 { list-style-type: none } .lst-kix_lemcawe54w5c-4>li:before { content: "\0025cb " } .lst-kix_gyhqddkw9i05-8>li:before { content: "\0025a0 " } .lst-kix_jj5w63toozfm-7>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-7, lower-latin) ". " } ul.lst-kix_1qz6dmm9b14l-5 { list-style-type: none } ul.lst-kix_1qz6dmm9b14l-8 { list-style-type: none } ul.lst-kix_1qz6dmm9b14l-7 { list-style-type: none } .lst-kix_jj5w63toozfm-1>li { counter-increment: lst-ctn-kix_jj5w63toozfm-1 } ul.lst-kix_1qz6dmm9b14l-2 { list-style-type: none } ul.lst-kix_1qz6dmm9b14l-1 { list-style-type: none } ul.lst-kix_1qz6dmm9b14l-4 { list-style-type: none } ul.lst-kix_1qz6dmm9b14l-3 { list-style-type: none } .lst-kix_u0uqs69v9qbh-0>li:before { content: "\0025cf " } .lst-kix_u0uqs69v9qbh-4>li:before { content: "\0025cb " } ul.lst-kix_1qz6dmm9b14l-0 { list-style-type: none } .lst-kix_s3mi7ukxwiwf-6>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-6 } .lst-kix_jj5w63toozfm-7>li { counter-increment: lst-ctn-kix_jj5w63toozfm-7 } .lst-kix_lemcawe54w5c-2>li:before { content: "\0025a0 " } .lst-kix_u0uqs69v9qbh-2>li:before { content: "\0025a0 " } .lst-kix_8p26nc4xx5n8-6>li:before { content: "\0025cf " } ol.lst-kix_1wulu3ra2vwv-4.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-4 0 } .lst-kix_l7z426mwssm0-8>li:before { content: "\0025a0 " } .lst-kix_u0uqs69v9qbh-8>li:before { content: "\0025a0 " } .lst-kix_bfzyeb917dp8-1>li:before { content: "" counter(lst-ctn-kix_bfzyeb917dp8-1, upper-latin) ". " } ul.lst-kix_ekmayt81kvbz-8 { list-style-type: none } .lst-kix_gyhqddkw9i05-0>li:before { content: "\0025cf " } ul.lst-kix_ekmayt81kvbz-7 { list-style-type: none } .lst-kix_gyhqddkw9i05-4>li:before { content: "\0025cb " } .lst-kix_l7z426mwssm0-6>li:before { content: "\0025cf " } .lst-kix_8p26nc4xx5n8-2>li:before { content: "\0025a0 " } ul.lst-kix_ekmayt81kvbz-6 { list-style-type: none } ul.lst-kix_ekmayt81kvbz-5 { list-style-type: none } .lst-kix_lemcawe54w5c-0>li:before { content: "\0025cf " } ul.lst-kix_ekmayt81kvbz-4 { list-style-type: none } ul.lst-kix_ekmayt81kvbz-3 { list-style-type: none } .lst-kix_gyhqddkw9i05-6>li:before { content: "\0025cf " } .lst-kix_8p26nc4xx5n8-0>li:before { content: "\0025cf " } .lst-kix_8p26nc4xx5n8-8>li:before { content: "\0025a0 " } ul.lst-kix_ekmayt81kvbz-2 { list-style-type: none } ul.lst-kix_ekmayt81kvbz-1 { list-style-type: none } .lst-kix_u0uqs69v9qbh-6>li:before { content: "\0025cf " } ul.lst-kix_ekmayt81kvbz-0 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-1 { list-style-type: none } ol.lst-kix_bfzyeb917dp8-5.start { counter-reset: lst-ctn-kix_bfzyeb917dp8-5 0 } ol.lst-kix_s3mi7ukxwiwf-2 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-0 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-1 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-5 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-2 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-6 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-3 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-0 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-4 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-5 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-6 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-3 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-7 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-4 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-8 { list-style-type: none } .lst-kix_gyhqddkw9i05-2>li:before { content: "\0025a0 " } .lst-kix_8p26nc4xx5n8-4>li:before { content: "\0025cb " } ul.lst-kix_7tib3jrzu2u9-7 { list-style-type: none } ul.lst-kix_7tib3jrzu2u9-8 { list-style-type: none } ol.lst-kix_ne7nl4nhpzqr-7.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-7 0 } .lst-kix_yly1729bcywk-6>li { counter-increment: lst-ctn-kix_yly1729bcywk-6 } .lst-kix_xv318blpjdo-1>li:before { content: "" counter(lst-ctn-kix_xv318blpjdo-1, upper-latin) ". " } .lst-kix_xv318blpjdo-0>li:before { content: "" counter(lst-ctn-kix_xv318blpjdo-0, upper-roman) ". " } .lst-kix_h0kibz3smj6t-4>li:before { content: "\0025cb " } .lst-kix_ne7nl4nhpzqr-4>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-4 } .lst-kix_1wulu3ra2vwv-1>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-1 } .lst-kix_h0kibz3smj6t-7>li:before { content: "\0025cb " } .lst-kix_h0kibz3smj6t-8>li:before { content: "\0025a0 " } .lst-kix_11a9ub9xa97v-5>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-5 } .lst-kix_opi66v2qdsjs-0>li:before { content: "\0025cf " } .lst-kix_686a8e4qhxwx-7>li:before { content: "\0025cb " } .lst-kix_xv318blpjdo-8>li:before { content: "(" counter(lst-ctn-kix_xv318blpjdo-8, lower-roman) ") " } .lst-kix_xv318blpjdo-5>li:before { content: "(" counter(lst-ctn-kix_xv318blpjdo-5, lower-latin) ") " } .lst-kix_h0kibz3smj6t-3>li:before { content: "\0025cf " } .lst-kix_686a8e4qhxwx-3>li:before { content: "\0025cf " } .lst-kix_686a8e4qhxwx-4>li:before { content: "\0025cb " } .lst-kix_xv318blpjdo-4>li:before { content: "(" counter(lst-ctn-kix_xv318blpjdo-4, decimal) ") " } .lst-kix_h0kibz3smj6t-0>li:before { content: "\0025cf " } ol.lst-kix_vf0l197cqv6l-4.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-4 0 } ol.lst-kix_ne7nl4nhpzqr-2.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-2 0 } ol.lst-kix_11a9ub9xa97v-0.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-0 0 } .lst-kix_s3mi7ukxwiwf-7>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-7 } ul.lst-kix_l7z426mwssm0-1 { list-style-type: none } ul.lst-kix_l7z426mwssm0-2 { list-style-type: none } ul.lst-kix_l7z426mwssm0-0 { list-style-type: none } ol.lst-kix_yly1729bcywk-8.start { counter-reset: lst-ctn-kix_yly1729bcywk-8 0 } .lst-kix_ne7nl4nhpzqr-2>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-2 } .lst-kix_q8ok0mh9yyto-3>li:before { content: "" counter(lst-ctn-kix_q8ok0mh9yyto-3, lower-latin) ") " } .lst-kix_pcjo479wrta-7>li:before { content: "\0025cb " } .lst-kix_686a8e4qhxwx-8>li:before { content: "\0025a0 " } .lst-kix_emhp84jkv42c-6>li { counter-increment: lst-ctn-kix_emhp84jkv42c-6 } ul.lst-kix_l7z426mwssm0-7 { list-style-type: none } ul.lst-kix_l7z426mwssm0-8 { list-style-type: none } .lst-kix_q8ok0mh9yyto-2>li:before { content: "" counter(lst-ctn-kix_q8ok0mh9yyto-2, decimal) ". " } .lst-kix_pcjo479wrta-8>li:before { content: "\0025a0 " } ul.lst-kix_l7z426mwssm0-5 { list-style-type: none } ul.lst-kix_l7z426mwssm0-6 { list-style-type: none } ul.lst-kix_l7z426mwssm0-3 { list-style-type: none } ul.lst-kix_l7z426mwssm0-4 { list-style-type: none } .lst-kix_yly1729bcywk-8>li { counter-increment: lst-ctn-kix_yly1729bcywk-8 } .lst-kix_vf0l197cqv6l-3>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-3 } .lst-kix_q8ok0mh9yyto-6>li:before { content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-6, lower-roman) ") " } .lst-kix_4m04az9jmmj8-2>li:before { content: "\0025a0 " } .lst-kix_4m04az9jmmj8-6>li:before { content: "\0025cf " } .lst-kix_q8ok0mh9yyto-7>li:before { content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-7, lower-latin) ") " } .lst-kix_4m04az9jmmj8-1>li:before { content: "\0025cb " } .lst-kix_4m04az9jmmj8-5>li:before { content: "\0025a0 " } ol.lst-kix_vf0l197cqv6l-5.start { counter-reset: lst-ctn-kix_vf0l197cqv6l-5 0 } .lst-kix_ne7nl4nhpzqr-8>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-8, lower-roman) ". " } .lst-kix_xv318blpjdo-4>li { counter-increment: lst-ctn-kix_xv318blpjdo-4 } .lst-kix_vf0l197cqv6l-8>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-8 } .lst-kix_ne7nl4nhpzqr-5>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-5, lower-roman) ". " } .lst-kix_l7z426mwssm0-1>li:before { content: "\0025cb " } .lst-kix_x1epm4iu41dp-7>li:before { content: "\0025cb " } .lst-kix_yly1729bcywk-1>li { counter-increment: lst-ctn-kix_yly1729bcywk-1 } .lst-kix_6qnkx7t1adn9-4>li:before { content: "\0025cb " } .lst-kix_6qnkx7t1adn9-8>li:before { content: "\0025a0 " } .lst-kix_xv318blpjdo-6>li { counter-increment: lst-ctn-kix_xv318blpjdo-6 } ol.lst-kix_jj5w63toozfm-1.start { counter-reset: lst-ctn-kix_jj5w63toozfm-1 0 } .lst-kix_ne7nl4nhpzqr-1>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-1, lower-latin) ". " } .lst-kix_pcjo479wrta-4>li:before { content: "\0025cb " } ol.lst-kix_ne7nl4nhpzqr-8.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-8 0 } .lst-kix_bfzyeb917dp8-4>li:before { content: "(" counter(lst-ctn-kix_bfzyeb917dp8-4, decimal) ") " } .lst-kix_x1epm4iu41dp-3>li:before { content: "\0025cf " } .lst-kix_fd1rucpc9vz2-8>li:before { content: "\0025a0 " } .lst-kix_bfzyeb917dp8-8>li:before { content: "(" counter(lst-ctn-kix_bfzyeb917dp8-8, lower-roman) ") " } .lst-kix_fy6y7gyjejoh-2>li:before { content: "\0025a0 " } .lst-kix_fy6y7gyjejoh-6>li:before { content: "\0025cf " } ol.lst-kix_1wulu3ra2vwv-8.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-8 0 } .lst-kix_pcjo479wrta-0>li:before { content: "\0025cf " } ol.lst-kix_s3mi7ukxwiwf-6.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-6 0 } ol.lst-kix_jj5w63toozfm-0.start { counter-reset: lst-ctn-kix_jj5w63toozfm-0 0 } .lst-kix_emhp84jkv42c-2>li:before { content: "" counter(lst-ctn-kix_emhp84jkv42c-2, decimal) ". " } .lst-kix_emhp84jkv42c-6>li:before { content: "(" counter(lst-ctn-kix_emhp84jkv42c-6, lower-roman) ") " } .lst-kix_686a8e4qhxwx-0>li:before { content: "\0025cf " } .lst-kix_ndaonzmgp8vn-5>li:before { content: "\0025a0 " } .lst-kix_9jxnjym0nges-3>li:before { content: "\0025cf " } .lst-kix_opi66v2qdsjs-7>li:before { content: "\0025cb " } .lst-kix_lemcawe54w5c-7>li:before { content: "\0025cb " } .lst-kix_ndaonzmgp8vn-1>li:before { content: "\0025cb " } .lst-kix_gyhqddkw9i05-7>li:before { content: "\0025cb " } .lst-kix_jj5w63toozfm-6>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-6, decimal) ". " } .lst-kix_u0uqs69v9qbh-3>li:before { content: "\0025cf " } .lst-kix_fd1rucpc9vz2-0>li:before { content: "\0025cf " } .lst-kix_fd1rucpc9vz2-4>li:before { content: "\0025cb " } ol.lst-kix_s3mi7ukxwiwf-5.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-5 0 } .lst-kix_opi66v2qdsjs-3>li:before { content: "\0025cf " } .lst-kix_lemcawe54w5c-3>li:before { content: "\0025cf " } .lst-kix_8p26nc4xx5n8-3>li:before { content: "\0025cf " } .lst-kix_8p26nc4xx5n8-7>li:before { content: "\0025cb " } .lst-kix_l7z426mwssm0-5>li:before { content: "\0025a0 " } .lst-kix_u0uqs69v9qbh-7>li:before { content: "\0025cb " } .lst-kix_bfzyeb917dp8-0>li:before { content: "" counter(lst-ctn-kix_bfzyeb917dp8-0, upper-roman) ". " } .lst-kix_11a9ub9xa97v-1>li:before { content: "" counter(lst-ctn-kix_11a9ub9xa97v-1, upper-latin) ". " } .lst-kix_gyhqddkw9i05-3>li:before { content: "\0025cf " } .lst-kix_9jxnjym0nges-7>li:before { content: "\0025cb " } .lst-kix_11a9ub9xa97v-5>li:before { content: "(" counter(lst-ctn-kix_11a9ub9xa97v-5, lower-latin) ") " } ol.lst-kix_11a9ub9xa97v-2.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-2 0 } .lst-kix_s3mi7ukxwiwf-4>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-4 } .lst-kix_7tib3jrzu2u9-4>li:before { content: "\0025cb " } .lst-kix_ne7nl4nhpzqr-5>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-5 } ol.lst-kix_xv318blpjdo-4 { list-style-type: none } ol.lst-kix_s3mi7ukxwiwf-7.start { counter-reset: lst-ctn-kix_s3mi7ukxwiwf-7 0 } ol.lst-kix_xv318blpjdo-5 { list-style-type: none } ol.lst-kix_xv318blpjdo-6 { list-style-type: none } ol.lst-kix_xv318blpjdo-7 { list-style-type: none } ol.lst-kix_xv318blpjdo-0 { list-style-type: none } ol.lst-kix_xv318blpjdo-1 { list-style-type: none } .lst-kix_7tib3jrzu2u9-1>li:before { content: "\0025cb " } ol.lst-kix_ne7nl4nhpzqr-4.start { counter-reset: lst-ctn-kix_ne7nl4nhpzqr-4 0 } ol.lst-kix_xv318blpjdo-2 { list-style-type: none } ol.lst-kix_xv318blpjdo-3 { list-style-type: none } .lst-kix_q8ok0mh9yyto-6>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-6 } ul.lst-kix_5anu1k9tsyak-7 { list-style-type: none } .lst-kix_jj5w63toozfm-6>li { counter-increment: lst-ctn-kix_jj5w63toozfm-6 } ul.lst-kix_5anu1k9tsyak-8 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-5 { list-style-type: none } ol.lst-kix_yly1729bcywk-5.start { counter-reset: lst-ctn-kix_yly1729bcywk-5 0 } .lst-kix_11a9ub9xa97v-2>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-2 } ol.lst-kix_1wulu3ra2vwv-0 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-6 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-1 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-3 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-4 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-1 { list-style-type: none } .lst-kix_xv318blpjdo-3>li { counter-increment: lst-ctn-kix_xv318blpjdo-3 } ul.lst-kix_5anu1k9tsyak-2 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-6 { list-style-type: none } ul.lst-kix_5anu1k9tsyak-0 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-7 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-8 { list-style-type: none } .lst-kix_7tib3jrzu2u9-6>li:before { content: "\0025cf " } ol.lst-kix_xv318blpjdo-8 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-2 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-3 { list-style-type: none } .lst-kix_7tib3jrzu2u9-7>li:before { content: "\0025cb " } ol.lst-kix_1wulu3ra2vwv-4 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-5 { list-style-type: none } .lst-kix_vf0l197cqv6l-4>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-4 } ol.lst-kix_1wulu3ra2vwv-5.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-5 0 } ol.lst-kix_11a9ub9xa97v-7.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-7 0 } ol.lst-kix_q8ok0mh9yyto-2.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-2 0 } .lst-kix_11a9ub9xa97v-6>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-6 } .lst-kix_5anu1k9tsyak-7>li:before { content: "\0025cb " } .lst-kix_j42a5dwgnqyq-6>li:before { content: "\0025cf " } ol.lst-kix_xv318blpjdo-2.start { counter-reset: lst-ctn-kix_xv318blpjdo-2 0 } .lst-kix_1wulu3ra2vwv-4>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-4 } .lst-kix_q8ok0mh9yyto-2>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-2 } ol.lst-kix_jj5w63toozfm-4.start { counter-reset: lst-ctn-kix_jj5w63toozfm-4 0 } .lst-kix_vf0l197cqv6l-0>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-0 } ol.lst-kix_yly1729bcywk-0.start { counter-reset: lst-ctn-kix_yly1729bcywk-0 0 } .lst-kix_6qnkx7t1adn9-2>li:before { content: "\0025a0 " } .lst-kix_qeqyxe7gm97l-6>li:before { content: "\0025cf " } .lst-kix_qeqyxe7gm97l-4>li:before { content: "\0025cb " } .lst-kix_j42a5dwgnqyq-1>li:before { content: "\0025cb " } .lst-kix_qeqyxe7gm97l-1>li:before { content: "\0025cb " } .lst-kix_qeqyxe7gm97l-3>li:before { content: "\0025cf " } .lst-kix_j42a5dwgnqyq-4>li:before { content: "\0025cb " } ol.lst-kix_1wulu3ra2vwv-0.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-0 0 } ol.lst-kix_q8ok0mh9yyto-7.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-7 0 } .lst-kix_j42a5dwgnqyq-3>li:before { content: "\0025cf " } .lst-kix_jj5w63toozfm-2>li { counter-increment: lst-ctn-kix_jj5w63toozfm-2 } ol.lst-kix_1wulu3ra2vwv-3.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-3 0 } ol.lst-kix_q8ok0mh9yyto-0.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-0 0 } .lst-kix_6qnkx7t1adn9-5>li:before { content: "\0025a0 " } .lst-kix_6qnkx7t1adn9-7>li:before { content: "\0025cb " } ol.lst-kix_yly1729bcywk-3.start { counter-reset: lst-ctn-kix_yly1729bcywk-3 0 } .lst-kix_iv2x96orjh4l-7>li:before { content: "\0025cb " } .lst-kix_pcjo479wrta-3>li:before { content: "\0025cf " } .lst-kix_yly1729bcywk-6>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-6, decimal) ". " } .lst-kix_ndaonzmgp8vn-6>li:before { content: "\0025cf " } .lst-kix_5anu1k9tsyak-1>li:before { content: "\0025cb " } .lst-kix_ndaonzmgp8vn-8>li:before { content: "\0025a0 " } .lst-kix_pcjo479wrta-1>li:before { content: "\0025cb " } .lst-kix_iv2x96orjh4l-1>li:before { content: "\0025cb " } .lst-kix_yly1729bcywk-4>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-4, lower-latin) ". " } .lst-kix_bfzyeb917dp8-8>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-8 } .lst-kix_ne7nl4nhpzqr-1>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-1 } .lst-kix_opi66v2qdsjs-4>li:before { content: "\0025cb " } .lst-kix_fd1rucpc9vz2-1>li:before { content: "\0025cb " } .lst-kix_fd1rucpc9vz2-3>li:before { content: "\0025cf " } .lst-kix_opi66v2qdsjs-6>li:before { content: "\0025cf " } ol.lst-kix_11a9ub9xa97v-4.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-4 0 } .lst-kix_xoos54gyybzj-4>li:before { content: "\0025cb " } .lst-kix_bfzyeb917dp8-1>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-1 } .lst-kix_ndaonzmgp8vn-0>li:before { content: "\0025cf " } ol.lst-kix_jj5w63toozfm-6.start { counter-reset: lst-ctn-kix_jj5w63toozfm-6 0 } .lst-kix_xoos54gyybzj-2>li:before { content: "\0025a0 " } ul.lst-kix_b7256qmdgo85-6 { list-style-type: none } ul.lst-kix_b7256qmdgo85-7 { list-style-type: none } .lst-kix_1wulu3ra2vwv-3>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-3 } ul.lst-kix_b7256qmdgo85-8 { list-style-type: none } ul.lst-kix_b7256qmdgo85-2 { list-style-type: none } ul.lst-kix_b7256qmdgo85-3 { list-style-type: none } .lst-kix_11a9ub9xa97v-4>li:before { content: "(" counter(lst-ctn-kix_11a9ub9xa97v-4, decimal) ") " } ul.lst-kix_b7256qmdgo85-4 { list-style-type: none } ul.lst-kix_b7256qmdgo85-5 { list-style-type: none } .lst-kix_f5kb4hocu5hh-1>li:before { content: "\0025cb " } .lst-kix_11a9ub9xa97v-2>li:before { content: "" counter(lst-ctn-kix_11a9ub9xa97v-2, decimal) ". " } .lst-kix_9jxnjym0nges-4>li:before { content: "\0025cb " } .lst-kix_86hsx13ssqid-4>li:before { content: "\0025cb " } ul.lst-kix_b7256qmdgo85-0 { list-style-type: none } ul.lst-kix_b7256qmdgo85-1 { list-style-type: none } .lst-kix_9jxnjym0nges-6>li:before { content: "\0025cf " } .lst-kix_86hsx13ssqid-2>li:before { content: "\0025a0 " } .lst-kix_bfzyeb917dp8-5>li { counter-increment: lst-ctn-kix_bfzyeb917dp8-5 } .lst-kix_h0kibz3smj6t-6>li:before { content: "\0025cf " } .lst-kix_11a9ub9xa97v-3>li { counter-increment: lst-ctn-kix_11a9ub9xa97v-3 } ol.lst-kix_11a9ub9xa97v-5.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-5 0 } ul.lst-kix_x1epm4iu41dp-0 { list-style-type: none } .lst-kix_f5kb4hocu5hh-4>li:before { content: "\0025cb " } ol.lst-kix_xv318blpjdo-0.start { counter-reset: lst-ctn-kix_xv318blpjdo-0 0 } .lst-kix_jkgkf1u9sy0c-0>li:before { content: "\0025cf " } .lst-kix_f5kb4hocu5hh-7>li:before { content: "\0025cb " } ul.lst-kix_x1epm4iu41dp-6 { list-style-type: none } ul.lst-kix_x1epm4iu41dp-5 { list-style-type: none } ul.lst-kix_x1epm4iu41dp-8 { list-style-type: none } .lst-kix_jkgkf1u9sy0c-3>li:before { content: "\0025cf " } ul.lst-kix_x1epm4iu41dp-7 { list-style-type: none } ul.lst-kix_x1epm4iu41dp-2 { list-style-type: none } .lst-kix_xv318blpjdo-0>li { counter-increment: lst-ctn-kix_xv318blpjdo-0 } ol.lst-kix_jj5w63toozfm-8.start { counter-reset: lst-ctn-kix_jj5w63toozfm-8 0 } ul.lst-kix_x1epm4iu41dp-1 { list-style-type: none } ul.lst-kix_x1epm4iu41dp-4 { list-style-type: none } ul.lst-kix_x1epm4iu41dp-3 { list-style-type: none } ol.lst-kix_1wulu3ra2vwv-2.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-2 0 } .lst-kix_686a8e4qhxwx-6>li:before { content: "\0025cf " } .lst-kix_s3mi7ukxwiwf-5>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-5 } .lst-kix_h0kibz3smj6t-1>li:before { content: "\0025cb " } .lst-kix_xv318blpjdo-6>li:before { content: "(" counter(lst-ctn-kix_xv318blpjdo-6, lower-roman) ") " } ul.lst-kix_86hsx13ssqid-3 { list-style-type: none } ul.lst-kix_86hsx13ssqid-2 { list-style-type: none } .lst-kix_xv318blpjdo-3>li:before { content: "" counter(lst-ctn-kix_xv318blpjdo-3, lower-latin) ") " } ul.lst-kix_86hsx13ssqid-5 { list-style-type: none } ul.lst-kix_86hsx13ssqid-4 { list-style-type: none } .lst-kix_686a8e4qhxwx-1>li:before { content: "\0025cb " } ol.lst-kix_yly1729bcywk-2.start { counter-reset: lst-ctn-kix_yly1729bcywk-2 0 } ul.lst-kix_86hsx13ssqid-1 { list-style-type: none } .lst-kix_jkgkf1u9sy0c-8>li:before { content: "\0025a0 " } ul.lst-kix_86hsx13ssqid-0 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-0 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-1 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-2 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-3 { list-style-type: none } .lst-kix_b7256qmdgo85-1>li:before { content: "\0025cb " } ul.lst-kix_86hsx13ssqid-7 { list-style-type: none } ul.lst-kix_h9mjmxara98n-0 { list-style-type: none } ul.lst-kix_86hsx13ssqid-6 { list-style-type: none } ul.lst-kix_86hsx13ssqid-8 { list-style-type: none } ul.lst-kix_h9mjmxara98n-3 { list-style-type: none } .lst-kix_4m04az9jmmj8-8>li:before { content: "\0025a0 " } ul.lst-kix_fy6y7gyjejoh-8 { list-style-type: none } ul.lst-kix_h9mjmxara98n-4 { list-style-type: none } ul.lst-kix_h9mjmxara98n-1 { list-style-type: none } ul.lst-kix_h9mjmxara98n-2 { list-style-type: none } ul.lst-kix_h9mjmxara98n-7 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-4 { list-style-type: none } ul.lst-kix_h9mjmxara98n-8 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-5 { list-style-type: none } ul.lst-kix_h9mjmxara98n-5 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-6 { list-style-type: none } ul.lst-kix_h9mjmxara98n-6 { list-style-type: none } ul.lst-kix_fy6y7gyjejoh-7 { list-style-type: none } .lst-kix_b7256qmdgo85-6>li:before { content: "\0025cf " } ol.lst-kix_yly1729bcywk-1.start { counter-reset: lst-ctn-kix_yly1729bcywk-1 0 } ol.lst-kix_1wulu3ra2vwv-1.start { counter-reset: lst-ctn-kix_1wulu3ra2vwv-1 0 } .lst-kix_ne7nl4nhpzqr-8>li { counter-increment: lst-ctn-kix_ne7nl4nhpzqr-8 } .lst-kix_q97rvvc7c69e-0>li:before { content: "\0025cf " } .lst-kix_q8ok0mh9yyto-1>li:before { content: "" counter(lst-ctn-kix_q8ok0mh9yyto-1, upper-latin) ". " } .lst-kix_4m04az9jmmj8-0>li:before { content: "\0025cf " } ol.lst-kix_11a9ub9xa97v-6.start { counter-reset: lst-ctn-kix_11a9ub9xa97v-6 0 } .lst-kix_q8ok0mh9yyto-4>li:before { content: "(" counter(lst-ctn-kix_q8ok0mh9yyto-4, decimal) ") " } .lst-kix_emhp84jkv42c-0>li { counter-increment: lst-ctn-kix_emhp84jkv42c-0 } .lst-kix_q8ok0mh9yyto-5>li { counter-increment: lst-ctn-kix_q8ok0mh9yyto-5 } ul.lst-kix_lemcawe54w5c-7 { list-style-type: none } ul.lst-kix_lemcawe54w5c-8 { list-style-type: none } .lst-kix_ne7nl4nhpzqr-6>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-6, decimal) ". " } ul.lst-kix_lemcawe54w5c-5 { list-style-type: none } ul.lst-kix_lemcawe54w5c-6 { list-style-type: none } ul.lst-kix_lemcawe54w5c-3 { list-style-type: none } ul.lst-kix_lemcawe54w5c-4 { list-style-type: none } ul.lst-kix_lemcawe54w5c-1 { list-style-type: none } ul.lst-kix_lemcawe54w5c-2 { list-style-type: none } .lst-kix_s3mi7ukxwiwf-1>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-1 } ul.lst-kix_lemcawe54w5c-0 { list-style-type: none } .lst-kix_4m04az9jmmj8-3>li:before { content: "\0025cf " } ul.lst-kix_f5kb4hocu5hh-4 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-3 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-6 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-5 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-8 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-7 { list-style-type: none } .lst-kix_xv318blpjdo-7>li { counter-increment: lst-ctn-kix_xv318blpjdo-7 } ol.lst-kix_xv318blpjdo-7.start { counter-reset: lst-ctn-kix_xv318blpjdo-7 0 } .lst-kix_gfromclascha-1>li:before { content: "\0025cb " } .lst-kix_86hsx13ssqid-7>li:before { content: "\0025cb " } .lst-kix_yly1729bcywk-0>li { counter-increment: lst-ctn-kix_yly1729bcywk-0 } .lst-kix_ne7nl4nhpzqr-3>li:before { content: "" counter(lst-ctn-kix_ne7nl4nhpzqr-3, decimal) ". " } ol.lst-kix_q8ok0mh9yyto-3.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-3 0 } .lst-kix_1wulu3ra2vwv-7>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-7 } ul.lst-kix_f5kb4hocu5hh-0 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-2 { list-style-type: none } ul.lst-kix_f5kb4hocu5hh-1 { list-style-type: none } ul.lst-kix_fd1rucpc9vz2-0 { list-style-type: none } .lst-kix_fy6y7gyjejoh-0>li:before { content: "\0025cf " } ul.lst-kix_fd1rucpc9vz2-1 { list-style-type: none } ul.lst-kix_fd1rucpc9vz2-2 { list-style-type: none } .lst-kix_yly1729bcywk-1>li:before { content: "" counter(lst-ctn-kix_yly1729bcywk-1, lower-latin) ". " } ul.lst-kix_fd1rucpc9vz2-3 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-6.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-6 0 } ul.lst-kix_fd1rucpc9vz2-8 { list-style-type: none } .lst-kix_pcjo479wrta-6>li:before { content: "\0025cf " } .lst-kix_bfzyeb917dp8-6>li:before { content: "(" counter(lst-ctn-kix_bfzyeb917dp8-6, lower-roman) ") " } .lst-kix_6ril5iwt0fcl-3>li:before { content: "\0025cf " } ul.lst-kix_fd1rucpc9vz2-4 { list-style-type: none } ul.lst-kix_fd1rucpc9vz2-5 { list-style-type: none } ul.lst-kix_fd1rucpc9vz2-6 { list-style-type: none } .lst-kix_fd1rucpc9vz2-6>li:before { content: "\0025cf " } ul.lst-kix_fd1rucpc9vz2-7 { list-style-type: none } .lst-kix_5anu1k9tsyak-4>li:before { content: "\0025cb " } .lst-kix_vf0l197cqv6l-7>li { counter-increment: lst-ctn-kix_vf0l197cqv6l-7 } .lst-kix_s3mi7ukxwiwf-8>li { counter-increment: lst-ctn-kix_s3mi7ukxwiwf-8 } .lst-kix_iv2x96orjh4l-4>li:before { content: "\0025cb " } .lst-kix_s3mi7ukxwiwf-6>li:before { content: "" counter(lst-ctn-kix_s3mi7ukxwiwf-6, decimal) ". " } .lst-kix_fy6y7gyjejoh-8>li:before { content: "\0025a0 " } ol.lst-kix_xv318blpjdo-4.start { counter-reset: lst-ctn-kix_xv318blpjdo-4 0 } .lst-kix_x1epm4iu41dp-1>li:before { content: "\0025cb " } .lst-kix_q97rvvc7c69e-8>li:before { content: "\0025a0 " } ol.lst-kix_xv318blpjdo-5.start { counter-reset: lst-ctn-kix_xv318blpjdo-5 0 } ul.lst-kix_8p26nc4xx5n8-0 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-1 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-2 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-3 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-4 { list-style-type: none } .lst-kix_emhp84jkv42c-0>li:before { content: "" counter(lst-ctn-kix_emhp84jkv42c-0, upper-roman) ". " } .lst-kix_emhp84jkv42c-8>li:before { content: "(" counter(lst-ctn-kix_emhp84jkv42c-8, lower-roman) ") " } .lst-kix_9jxnjym0nges-1>li:before { content: "\0025cb " } .lst-kix_xoos54gyybzj-7>li:before { content: "\0025cb " } ol.lst-kix_q8ok0mh9yyto-5.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-5 0 } .lst-kix_ndaonzmgp8vn-3>li:before { content: "\0025cf " } .lst-kix_jj5w63toozfm-8>li:before { content: "" counter(lst-ctn-kix_jj5w63toozfm-8, lower-roman) ". " } .lst-kix_u0uqs69v9qbh-1>li:before { content: "\0025cb " } .lst-kix_opi66v2qdsjs-1>li:before { content: "\0025cb " } .lst-kix_lemcawe54w5c-1>li:before { content: "\0025cb " } .lst-kix_11a9ub9xa97v-7>li:before { content: "(" counter(lst-ctn-kix_11a9ub9xa97v-7, lower-latin) ") " } .lst-kix_8p26nc4xx5n8-5>li:before { content: "\0025a0 " } ol.lst-kix_xv318blpjdo-6.start { counter-reset: lst-ctn-kix_xv318blpjdo-6 0 } .lst-kix_l7z426mwssm0-7>li:before { content: "\0025cb " } .lst-kix_1wulu3ra2vwv-0>li { counter-increment: lst-ctn-kix_1wulu3ra2vwv-0 } .lst-kix_gyhqddkw9i05-5>li:before { content: "\0025a0 " } .lst-kix_hchtl271h88l-2>li:before { content: "\0025a0 " } ul.lst-kix_6qnkx7t1adn9-8 { list-style-type: none } ol.lst-kix_q8ok0mh9yyto-4.start { counter-reset: lst-ctn-kix_q8ok0mh9yyto-4 0 } ul.lst-kix_6qnkx7t1adn9-7 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-5 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-6 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-6 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-5 { list-style-type: none } .lst-kix_sholqrhc62dh-3>li:before { content: "\0025cf " } ul.lst-kix_8p26nc4xx5n8-7 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-4 { list-style-type: none } ul.lst-kix_8p26nc4xx5n8-8 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-3 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-2 { list-style-type: none } ul.lst-kix_6qnkx7t1adn9-1 { list-style-type: none } .lst-kix_1wulu3ra2vwv-1>li:before { content: "" counter(lst-ctn-kix_1wulu3ra2vwv-1, upper-latin) ". " } ul.lst-kix_6qnkx7t1adn9-0 { list-style-type: none } ol { margin: 0; padding: 0 } table td, table th { padding: 0 } .c4 { color: #ff5e0e; font-weight: 700; text-decoration: none; vertical-align: baseline; font-size: 18pt; font-family: "PT Sans Narrow"; font-style: normal } .c7 { color: #38761d; font-weight: 400; text-decoration: none; vertical-align: baseline; font-size: 16pt; font-family: "PT Sans Narrow"; font-style: normal } .c14 { color: #695d46; font-weight: 700; text-decoration: none; vertical-align: baseline; font-size: 42pt; font-family: "PT Sans Narrow"; font-style: normal } .c0 { color: #695d46; font-weight: 400; text-decoration: none; vertical-align: baseline; font-size: 11pt; font-family: "Open Sans"; font-style: normal } .c1 { padding-top: 6pt; padding-bottom: 0pt; line-height: 1.2; orphans: 2; widows: 2; text-align: left } .c8 { padding-top: 18pt; padding-bottom: 6pt; line-height: 1.2; page-break-after: avoid; text-align: left } .c11 { padding-top: 24pt; padding-bottom: 0pt; line-height: 1.3; page-break-after: avoid; text-align: left } .c17 { padding-top: 6pt; padding-bottom: 0pt; line-height: 1.2; page-break-after: avoid; text-align: left } .c19 { text-decoration: none; vertical-align: baseline; font-size: 12pt; font-style: normal } .c9 { padding-top: 16pt; padding-bottom: 0pt; line-height: 1.0; text-align: left } .c18 { padding-top: 0pt; padding-bottom: 0pt; line-height: 1.2; text-align: left } .c10 { font-size: 18pt; font-family: "PT Sans Narrow"; color: #ff5e0e; font-weight: 700 } .c13 { font-family: "Open Sans"; color: #695d46; font-weight: 400 } .c12 { background-color: #ffffff; max-width: 468pt; padding: 72pt 72pt 72pt 72pt } .c5 { padding: 0; margin: 0 } .c15 { color: inherit; text-decoration: inherit } .c16 { color: #1155cc; text-decoration: underline } .c3 { padding-left: 0pt } .c6 { margin-left: 72pt } .c2 { margin-left: 36pt } .title { padding-top: 0pt; color: #695d46; font-size: 26pt; padding-bottom: 3pt; font-family: "Open Sans"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } .subtitle { padding-top: 0pt; color: #666666; font-size: 15pt; padding-bottom: 16pt; font-family: "Arial"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } li { color: #695d46; font-size: 11pt; font-family: "Open Sans" } p { margin: 0; color: #695d46; font-size: 11pt; font-family: "Open Sans" } h1 { padding-top: 24pt; color: #ff5e0e; font-weight: 700; font-size: 18pt; padding-bottom: 0pt; font-family: "PT Sans Narrow"; line-height: 1.3; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } h2 { padding-top: 18pt; color: #38761d; font-size: 16pt; padding-bottom: 6pt; font-family: "PT Sans Narrow"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } h3 { padding-top: 16pt; color: #434343; font-size: 14pt; padding-bottom: 4pt; font-family: "Open Sans"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } h4 { padding-top: 14pt; color: #666666; font-size: 12pt; padding-bottom: 4pt; font-family: "Open Sans"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } h5 { padding-top: 12pt; color: #666666; font-size: 11pt; padding-bottom: 4pt; font-family: "Open Sans"; line-height: 1.2; page-break-after: avoid; orphans: 2; widows: 2; text-align: left } h6 { padding-top: 12pt; color: #666666; font-size: 11pt; padding-bottom: 4pt; font-family: "Open Sans"; line-height: 1.2; page-break-after: avoid; font-style: italic; orphans: 2; widows: 2; text-align: left }  

Oracle Fusion Middleware Deployments Using Docker Swarm Part III


This is the third in a series of blogs that describe how to build a Fusion Middleware (FMW) Cluster that runs as a number of Docker images that run in docker containers.  These containers are coordinated using Docker Swarm and can be deployed to a single host machine or multiple hosts.  This simplifies the task of building FMW clusters and also makes it easier to scale them in and out (adding or subtracting host machines) as well as up and down (using bigger or smaller host machines).  Using docker also helps us to avoid port conflicts when running multiple servers on the same physical machine.  When we use swarm we will see that we also get benefits from a built in load balancer.

This blog uses Oracle Service Bus as an FMW product but the principles are applicable to other FMW products.

In our previous blog we talked about how to build the required docker images for running FMW on Docker Swarm and created a database container.

In this entry we will explain how to create an FMW domain image and how to run that in a docker container.  The next blog will cover how to run this in Docker Swarm.

Key Steps in Creating a Service Bus Cluster

When creating a service bus cluster we need to do the following:

  1. Create the required schemas in a database.
  • Service Bus 12.1 adds a number of new features such as re-sequencing that require the use of SOA Suite schemas.  These are in addition to the database requirements for Web Services Security Manager that existed in Service Bus 11g.
  • The Repository Creation Utility is used to create the schemas in a database.
  1. Create service bus domain.
  • The service bus domain contains all the required service bus binaries and associated configuration.  Within the domain we will create a service bus cluster.
  • The domain can be created using the WebLogic scripting tool by applying the service bus domain template.
  1. Create a Service Bus cluster within the domain.
  • The service bus cluster allows us to have multiple service bus servers running the same proxy services and sharing the load.
  • The cluster can be created and servers assigned using the WebLogic scripting tool.

These steps need to be factored into the way we build our docker images and containers and ultimately into how we create Docker Swarm services.

Mapping the Service Bus Cluster onto Docker

There are a number of ways in which we could map a Service Bus cluster onto Docker.  We have chosen the following approach:

  • Create a Docker image that contains the Service Bus domain configuration.
  • This is layered on top of the OSB installation image.  This allows us to modify and rebuild the scripts without having to reinstall the FMW software.  This speeds up the development cycle of the image.  Once the scripts are working they could be placed in the FMW binary image, reducing the number of layers.
  • When creating a container from the image we run the RCU to create the schemas in the database.  We also run scripts to create the domain and add servers to the domain as needed.
  • The same Docker image is used for both Admin and Managed Servers.
  • Depending on parameters the container decides if it is an admin server or a member of a cluster.
  • All servers need access to the database.
  • All servers need access to the Admin server.
  • The admin server requires access to all servers.
Container Summary

We effectively have two images, which are both built from multiple layers as explained previously.

  1. Database image holds the binaries for database and scripts to create a database instance.
  2. Fusion Middleware image holds the FMW binaries and scripts to create a domain, or extend an existing domain.

We have a single Docker Container to run the database from the database image.

We have multiple Docker Containers, one per managed server, to run Fusion Middleware from the single domain image.

To simplify starting the containers the git project includes run scripts ( for database and for FMW) that can be used to create containers.

Database Container

The database container runs from the database image and has the following characteristics:

  • When the container is created it creates and starts a database instance.
  • After starting the database we change the database password.
  • When the container is stopped it shuts down the database instance.
  • When the container is started it starts the database instance.
  • The database container exposes the database port (1521 in this case)
  • Only a single container runs a given database.

The database container is started using the following command:

docker run -d -it --name Oracle12cDB --hostname osbdb -p 1521:1521 -p 5500:5500 -e ORACLE_SID=ORCL -e ORACLE_PDB=OSB -v /opt/oracle/oradata/OracleDB oracle/database:

We expose ports 1521 (database) and 5500 (em).

Admin Server Container

The admin server container runs from the FMW domain image, or just the FMW image if the layers have been collapsed.  It has the following characteristics:

  • When the container is created it runs the RCU to configure the database.
  • When the container is created it creates an FMW domain and cluster.
  • When the container is created it starts the Admin Server.
  • When the container is stopped its stops the Admin Server.
  • When the container is started it starts the Admin Server.
  • The Admin Server exposes the admin console port (7001 in this case)
  • Only a single Admin Server container runs in a given domain.
  • The same image is used for both Admin and Managed Servers.

We start the admin server using the following command admin

This translates to

docker run -d -it \

        -e "MS_NAME=AdminServer" \

        -e "MACHINE_NAME=AdminServerMachine" \

        --name wlsadmin \

        --add-host osbdb: \

        --add-host wlsadmin: \

        --add-host wls1: \

        --add-host wls2: \

        --add-host wls3: \

        --add-host wls4: \

        --hostname wlsadmin \

        -p 7001:7001 \

        oracle/osb_domain: \


We need to add the hostnames of the managed servers and the database to the /etc/hosts file so that the admin server can access them.  We will show how to avoid doing this in the final blog post.

Managed Server Containers

The managed server containers runs from the same FMW domain image as the Admin Server.  It has the following characteristics:

  • When the container is created it creates a new server in the domain and adds it to the FMW cluster
  • When the container is created it creates a local copy of the domain files.
  • When the container is created it starts the Managed Server.
  • When the container is stopped its stops the Managed Server.
  • When the container is started it starts the Managed Server.
  • The Managed Server exposes the admin console port (8011 in this case)
  • Multiple Managed Server containers may run in a given domain.
  • The same image is used for both Admin and Managed Servers.

We start the managed servers using the following command N

Where N is the number of the managed server.

When N=2 this  translates to

docker run -d -it \

        -e "MS_NAME=osb_server2" \

        -e "MACHINE_NAME=OsbServer2Machine" \

        --name wls2 \

        --add-host osbdb: \

        --add-host wlsadmin: \

        --add-host wls1: \

        --add-host wls2: \

        --add-host wls3: \

        --add-host wls4: \

        --hostname wlsadmin \

        -p 8013:8011 \

        oracle/osb_domain: \


Note that all the managed servers listen on port 8011.  Because they each run in their own container their is no conflict in their port numbers but we need to map them so that they can be accessed externally without conflicts. Special Notes for Service Bus

The first managed server in a Service Bus cluster is special because it runs singleton tasks related to reporting, collecting performance information from other nodes in the cluster and aggregating it and making it available to the console.  Because of this we decided to always create a Service Bus domain with a pre-existing single Managed Server in the cluster with the correct singleton targeting.

Because this server already exists if a container detects it is supposed to run Managed Server 1 then it does not create the server or associate it with a cluster, it justs assigns it to a machine (see next section for details) and creates the local managed server domain.

Containers and FMW Mapping

Each container maps to a single WebLogic server, either Admin Server or a Managed Server in a cluster.

The Admin Server container is responsible for running the repository configuration utility, creating the domain and configuring it for that particular FMW product (in our case Service Bus).

The Managed Server containers are responsible for adding a new Managed Server to the cluster and creating a local managed server domain.

Both Admin and Managed Server containers need to figure out key facts about themselves:

  • Hostname - used to set the listen address for the server and also the address of the machine
  • Type - admin or managed server to decide what to do on creation
  • Server identifier - managed servers need to make sure they have unique server names.
  • Associated Admin Server - managed servers must contact the admin server to obtain and update domain configuration.
  • Database Server - admin servers must know about the database to be able to run the RCU and create data sources required by the FMW product.
Starting the FMW Cluster

The FMW cluster is started as follows:

  1. A database container is created/started
  2. An admin server is created/started
  3. One or more managed servers are created/started

Containers are created using the “docker run” command.  We use the “-d” flag to run them as daemon processes.  By default the CMD directive in the dockerfile is used choose the command or script to run on container startup.  We use this for the database container.  For the admin and managed containers we identify which type of container they are and pass in an appropriate script to the “docker run” command.

Containers are started using the “docker start” command and the container uses the same command or script as when it was created.  That means we must detect if this is a new container or a container being started after previously being shutdown.  With the FMW containers we do this by looking for the existence of the domain directory, if it exists we have previously been started, if not this must be our first run.

Tools such as docker compose and docker compose simplify the task of deploying our multiple container FMW cluster and we will look at these in the next blog entry.  One of the benefits we will find with swarm is that it includes a load balancer.  The current multi-container approach would require either another container to run a load balancer or an external load balancer, we will see that swarm removes this need.

Retrieving Docker Files for OSB Cluster

We are posting all the required files to go along with this blog on github.  You are welcome to fork from this and improve it.  We cloned many of these files from the official Oracle docker github.  We removed unused versions and added a simplified file to each product directory to make it easy to see how we actually built our environment.  We are still updating the files online and will shortly add details on building the swarm services.


In this entry we have explained how to create a Fusion Middleware Domain and run it on docker containers.  In our next entry we will simplify the deploymentof of our cluster by taking advatage of swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

Building an FMW Cluster using Docker (Part II Building Docker Images)

Fri, 2017-01-20 20:02
@import url('');.lst-kix_sholqrhc62dh-7>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-8>li:before{content:"\0025a0 "}.lst-kix_sholqrhc62dh-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-3.start{counter-reset:lst-ctn-kix_xv318blpjdo-3 0}.lst-kix_sholqrhc62dh-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-0>li:before{content:"\0025cf "}.lst-kix_emhp84jkv42c-3>li{counter-increment:lst-ctn-kix_emhp84jkv42c-3}.lst-kix_ekmayt81kvbz-0>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-4>li{counter-increment:lst-ctn-kix_jj5w63toozfm-4}.lst-kix_ekmayt81kvbz-2>li:before{content:"\0025a0 "}ul.lst-kix_qeqyxe7gm97l-6{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-5{list-style-type:none}.lst-kix_ekmayt81kvbz-1>li:before{content:"\0025cb "}ul.lst-kix_qeqyxe7gm97l-4{list-style-type:none}.lst-kix_ekmayt81kvbz-3>li:before{content:"\0025cf "}ul.lst-kix_qeqyxe7gm97l-3{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-2{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-1{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-0{list-style-type:none}ol.lst-kix_11a9ub9xa97v-8.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-8 0}.lst-kix_ekmayt81kvbz-5>li:before{content:"\0025a0 "}.lst-kix_ekmayt81kvbz-7>li:before{content:"\0025cb "}ul.lst-kix_4m04az9jmmj8-3{list-style-type:none}ul.lst-kix_4m04az9jmmj8-2{list-style-type:none}ul.lst-kix_qeqyxe7gm97l-8{list-style-type:none}ul.lst-kix_4m04az9jmmj8-1{list-style-type:none}.lst-kix_ekmayt81kvbz-4>li:before{content:"\0025cb "}.lst-kix_ekmayt81kvbz-8>li:before{content:"\0025a0 "}ul.lst-kix_qeqyxe7gm97l-7{list-style-type:none}ul.lst-kix_4m04az9jmmj8-0{list-style-type:none}ul.lst-kix_4m04az9jmmj8-7{list-style-type:none}ul.lst-kix_4m04az9jmmj8-6{list-style-type:none}ul.lst-kix_4m04az9jmmj8-5{list-style-type:none}ul.lst-kix_4m04az9jmmj8-4{list-style-type:none}.lst-kix_ekmayt81kvbz-6>li:before{content:"\0025cf "}ul.lst-kix_4m04az9jmmj8-8{list-style-type:none}.lst-kix_s3mi7ukxwiwf-2>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-2}.lst-kix_11a9ub9xa97v-0>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-0}ol.lst-kix_emhp84jkv42c-4.start{counter-reset:lst-ctn-kix_emhp84jkv42c-4 0}ol.lst-kix_xv318blpjdo-8.start{counter-reset:lst-ctn-kix_xv318blpjdo-8 0}ul.lst-kix_6ril5iwt0fcl-5{list-style-type:none}.lst-kix_q8ok0mh9yyto-8>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-8}ul.lst-kix_6ril5iwt0fcl-4{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-3{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-2{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-8{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-7{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-6{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-8.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-8 0}ul.lst-kix_6ril5iwt0fcl-1{list-style-type:none}ul.lst-kix_6ril5iwt0fcl-0{list-style-type:none}.lst-kix_xv318blpjdo-1>li{counter-increment:lst-ctn-kix_xv318blpjdo-1}.lst-kix_bfzyeb917dp8-6>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-6}.lst-kix_s3mi7ukxwiwf-1>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-1,lower-latin) ". "}.lst-kix_gfromclascha-0>li:before{content:"\0025cf "}.lst-kix_gfromclascha-2>li:before{content:"\0025a0 "}.lst-kix_gfromclascha-4>li:before{content:"\0025cb "}ol.lst-kix_bfzyeb917dp8-7.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-7 0}.lst-kix_6ril5iwt0fcl-0>li:before{content:"\0025cf "}.lst-kix_gfromclascha-6>li:before{content:"\0025cf "}.lst-kix_q97rvvc7c69e-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-7>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-8.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-8 0}.lst-kix_6ril5iwt0fcl-2>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-3>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-7>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-7,lower-latin) ". "}.lst-kix_6ril5iwt0fcl-4>li:before{content:"\0025cb "}.lst-kix_6ril5iwt0fcl-6>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-8>li{counter-increment:lst-ctn-kix_xv318blpjdo-8}.lst-kix_s3mi7ukxwiwf-5>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-5,lower-roman) ". "}.lst-kix_6ril5iwt0fcl-8>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-3>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-3,decimal) ". "}ol.lst-kix_jj5w63toozfm-7.start{counter-reset:lst-ctn-kix_jj5w63toozfm-7 0}.lst-kix_1wulu3ra2vwv-4>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-4,decimal) ") "}.lst-kix_1wulu3ra2vwv-6>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-6,lower-roman) ") "}.lst-kix_1wulu3ra2vwv-8>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-8,lower-roman) ") "}.lst-kix_gfromclascha-8>li:before{content:"\0025a0 "}.lst-kix_sholqrhc62dh-2>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-0{list-style-type:none}.lst-kix_sholqrhc62dh-4>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-2>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-2,decimal) ". "}.lst-kix_1wulu3ra2vwv-0>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-0,upper-roman) ". "}ol.lst-kix_11a9ub9xa97v-3.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-3 0}.lst-kix_emhp84jkv42c-2>li{counter-increment:lst-ctn-kix_emhp84jkv42c-2}ol.lst-kix_s3mi7ukxwiwf-4.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-4 0}ul.lst-kix_h0kibz3smj6t-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-7.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-7 0}.lst-kix_jkgkf1u9sy0c-2>li:before{content:"\0025a0 "}.lst-kix_jkgkf1u9sy0c-1>li:before{content:"\0025cb "}ul.lst-kix_iv2x96orjh4l-2{list-style-type:none}ul.lst-kix_iv2x96orjh4l-3{list-style-type:none}ul.lst-kix_iv2x96orjh4l-0{list-style-type:none}.lst-kix_jj5w63toozfm-3>li{counter-increment:lst-ctn-kix_jj5w63toozfm-3}ul.lst-kix_iv2x96orjh4l-1{list-style-type:none}ul.lst-kix_iv2x96orjh4l-6{list-style-type:none}ul.lst-kix_iv2x96orjh4l-7{list-style-type:none}ul.lst-kix_iv2x96orjh4l-4{list-style-type:none}ul.lst-kix_iv2x96orjh4l-5{list-style-type:none}ul.lst-kix_h0kibz3smj6t-3{list-style-type:none}ul.lst-kix_h0kibz3smj6t-2{list-style-type:none}ul.lst-kix_h0kibz3smj6t-1{list-style-type:none}.lst-kix_jkgkf1u9sy0c-5>li:before{content:"\0025a0 "}ul.lst-kix_h0kibz3smj6t-0{list-style-type:none}ol.lst-kix_jj5w63toozfm-2.start{counter-reset:lst-ctn-kix_jj5w63toozfm-2 0}ul.lst-kix_h0kibz3smj6t-7{list-style-type:none}ul.lst-kix_h0kibz3smj6t-6{list-style-type:none}ul.lst-kix_h0kibz3smj6t-5{list-style-type:none}.lst-kix_jkgkf1u9sy0c-6>li:before{content:"\0025cf "}ul.lst-kix_h0kibz3smj6t-4{list-style-type:none}.lst-kix_emhp84jkv42c-4>li{counter-increment:lst-ctn-kix_emhp84jkv42c-4}ul.lst-kix_iv2x96orjh4l-8{list-style-type:none}ol.lst-kix_bfzyeb917dp8-3.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-3 0}.lst-kix_b7256qmdgo85-3>li:before{content:"\0025cf "}.lst-kix_b7256qmdgo85-4>li:before{content:"\0025cb "}.lst-kix_b7256qmdgo85-7>li:before{content:"\0025cb "}ol.lst-kix_jj5w63toozfm-3.start{counter-reset:lst-ctn-kix_jj5w63toozfm-3 0}.lst-kix_q97rvvc7c69e-2>li:before{content:"\0025a0 "}.lst-kix_b7256qmdgo85-8>li:before{content:"\0025a0 "}ol.lst-kix_bfzyeb917dp8-2.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-2 0}ol.lst-kix_1wulu3ra2vwv-6.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-6 0}.lst-kix_jj5w63toozfm-5>li{counter-increment:lst-ctn-kix_jj5w63toozfm-5}.lst-kix_s3mi7ukxwiwf-0>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-0,decimal) ". "}ul.lst-kix_q97rvvc7c69e-4{list-style-type:none}ul.lst-kix_q97rvvc7c69e-3{list-style-type:none}ul.lst-kix_q97rvvc7c69e-6{list-style-type:none}.lst-kix_s3mi7ukxwiwf-8>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-8,lower-roman) ". "}ul.lst-kix_q97rvvc7c69e-5{list-style-type:none}ul.lst-kix_q97rvvc7c69e-8{list-style-type:none}ul.lst-kix_q97rvvc7c69e-7{list-style-type:none}.lst-kix_gfromclascha-3>li:before{content:"\0025cf "}ul.lst-kix_q97rvvc7c69e-0{list-style-type:none}ul.lst-kix_q97rvvc7c69e-2{list-style-type:none}ul.lst-kix_q97rvvc7c69e-1{list-style-type:none}.lst-kix_q97rvvc7c69e-6>li:before{content:"\0025cf "}.lst-kix_6ril5iwt0fcl-1>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-6>li:before{content:"\0025cf "}ol.lst-kix_s3mi7ukxwiwf-3.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-3 0}.lst-kix_6ril5iwt0fcl-5>li:before{content:"\0025a0 "}.lst-kix_iv2x96orjh4l-2>li:before{content:"\0025a0 "}.lst-kix_q8ok0mh9yyto-1>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-1}.lst-kix_s3mi7ukxwiwf-4>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-4,lower-latin) ". "}.lst-kix_5anu1k9tsyak-2>li:before{content:"\0025a0 "}.lst-kix_b7256qmdgo85-0>li:before{content:"\0025cf "}.lst-kix_1wulu3ra2vwv-3>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-3,lower-latin) ") "}.lst-kix_11a9ub9xa97v-7>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-7}.lst-kix_1wulu3ra2vwv-7>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-7,lower-latin) ") "}.lst-kix_1wulu3ra2vwv-6>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-6}.lst-kix_gfromclascha-7>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-5>li:before{content:"\0025a0 "}.lst-kix_86hsx13ssqid-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-5>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-0>li:before{content:"\0025cf "}.lst-kix_7tib3jrzu2u9-5>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-2>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-3>li:before{content:"\0025cf "}ul.lst-kix_ndaonzmgp8vn-4{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-3{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-6{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-5{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-0{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-2{list-style-type:none}.lst-kix_bfzyeb917dp8-4>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-4}ul.lst-kix_ndaonzmgp8vn-1{list-style-type:none}.lst-kix_7tib3jrzu2u9-8>li:before{content:"\0025a0 "}ul.lst-kix_sholqrhc62dh-6{list-style-type:none}ul.lst-kix_sholqrhc62dh-5{list-style-type:none}ul.lst-kix_sholqrhc62dh-4{list-style-type:none}ul.lst-kix_sholqrhc62dh-3{list-style-type:none}ul.lst-kix_sholqrhc62dh-8{list-style-type:none}ul.lst-kix_sholqrhc62dh-7{list-style-type:none}ul.lst-kix_sholqrhc62dh-2{list-style-type:none}ol.lst-kix_bfzyeb917dp8-6.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-6 0}ul.lst-kix_sholqrhc62dh-1{list-style-type:none}ul.lst-kix_sholqrhc62dh-0{list-style-type:none}.lst-kix_emhp84jkv42c-1>li{counter-increment:lst-ctn-kix_emhp84jkv42c-1}ul.lst-kix_ndaonzmgp8vn-8{list-style-type:none}ul.lst-kix_ndaonzmgp8vn-7{list-style-type:none}.lst-kix_j42a5dwgnqyq-8>li:before{content:"\0025a0 "}.lst-kix_5anu1k9tsyak-6>li:before{content:"\0025cf "}ol.lst-kix_bfzyeb917dp8-1.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-1 0}.lst-kix_j42a5dwgnqyq-7>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-7>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-8>li:before{content:"\0025a0 "}.lst-kix_5anu1k9tsyak-8>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-2.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-2 0}ul.lst-kix_686a8e4qhxwx-4{list-style-type:none}ul.lst-kix_686a8e4qhxwx-3{list-style-type:none}ul.lst-kix_686a8e4qhxwx-2{list-style-type:none}ul.lst-kix_686a8e4qhxwx-1{list-style-type:none}ul.lst-kix_686a8e4qhxwx-8{list-style-type:none}ul.lst-kix_686a8e4qhxwx-7{list-style-type:none}ul.lst-kix_686a8e4qhxwx-6{list-style-type:none}.lst-kix_6qnkx7t1adn9-0>li:before{content:"\0025cf "}.lst-kix_qeqyxe7gm97l-0>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-5{list-style-type:none}.lst-kix_6qnkx7t1adn9-1>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-3>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-0{list-style-type:none}.lst-kix_bfzyeb917dp8-0>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-0}.lst-kix_qeqyxe7gm97l-5>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-0>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-2>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-5>li:before{content:"\0025a0 "}ol.lst-kix_emhp84jkv42c-3.start{counter-reset:lst-ctn-kix_emhp84jkv42c-3 0}.lst-kix_qeqyxe7gm97l-2>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-8>li{counter-increment:lst-ctn-kix_emhp84jkv42c-8}ol.lst-kix_s3mi7ukxwiwf-0.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-0 0}.lst-kix_86hsx13ssqid-8>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-0>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-0}.lst-kix_fd1rucpc9vz2-5>li:before{content:"\0025a0 "}.lst-kix_fd1rucpc9vz2-7>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-5>li:before{content:"\0025a0 "}.lst-kix_iv2x96orjh4l-3>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-3>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-5>li:before{content:"\0025a0 "}.lst-kix_1wulu3ra2vwv-8>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-8}ol.lst-kix_q8ok0mh9yyto-6{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-5{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-3{list-style-type:none}.lst-kix_9jxnjym0nges-0>li:before{content:"\0025cf "}ol.lst-kix_q8ok0mh9yyto-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-7{list-style-type:none}ol.lst-kix_emhp84jkv42c-0.start{counter-reset:lst-ctn-kix_emhp84jkv42c-0 0}.lst-kix_opi66v2qdsjs-8>li:before{content:"\0025a0 "}.lst-kix_ndaonzmgp8vn-4>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-2{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-1{list-style-type:none}.lst-kix_9jxnjym0nges-2>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-0{list-style-type:none}.lst-kix_ndaonzmgp8vn-2>li:before{content:"\0025a0 "}.lst-kix_opi66v2qdsjs-2>li:before{content:"\0025a0 "}.lst-kix_11a9ub9xa97v-0>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-0,upper-roman) ". "}ol.lst-kix_bfzyeb917dp8-4.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-4 0}.lst-kix_q8ok0mh9yyto-3>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-3}.lst-kix_11a9ub9xa97v-8>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-8,lower-roman) ") "}.lst-kix_86hsx13ssqid-0>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-6>li:before{content:"\0025cf "}.lst-kix_9jxnjym0nges-8>li:before{content:"\0025a0 "}.lst-kix_11a9ub9xa97v-6>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-6,lower-roman) ") "}ul.lst-kix_9jxnjym0nges-2{list-style-type:none}.lst-kix_xv318blpjdo-2>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-2,decimal) ". "}ul.lst-kix_9jxnjym0nges-1{list-style-type:none}ul.lst-kix_9jxnjym0nges-4{list-style-type:none}ul.lst-kix_9jxnjym0nges-3{list-style-type:none}.lst-kix_h0kibz3smj6t-5>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-6{list-style-type:none}ul.lst-kix_9jxnjym0nges-5{list-style-type:none}ul.lst-kix_9jxnjym0nges-8{list-style-type:none}ul.lst-kix_9jxnjym0nges-7{list-style-type:none}.lst-kix_xv318blpjdo-2>li{counter-increment:lst-ctn-kix_xv318blpjdo-2}.lst-kix_s3mi7ukxwiwf-3>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-3}.lst-kix_bfzyeb917dp8-7>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-7}ol.lst-kix_emhp84jkv42c-1.start{counter-reset:lst-ctn-kix_emhp84jkv42c-1 0}.lst-kix_jkgkf1u9sy0c-4>li:before{content:"\0025cb "}ol.lst-kix_jj5w63toozfm-3{list-style-type:none}ol.lst-kix_jj5w63toozfm-4{list-style-type:none}ol.lst-kix_jj5w63toozfm-5{list-style-type:none}.lst-kix_jkgkf1u9sy0c-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-7>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-7,lower-latin) ") "}.lst-kix_686a8e4qhxwx-5>li:before{content:"\0025a0 "}ol.lst-kix_jj5w63toozfm-6{list-style-type:none}ol.lst-kix_jj5w63toozfm-7{list-style-type:none}ol.lst-kix_jj5w63toozfm-8{list-style-type:none}.lst-kix_h0kibz3smj6t-2>li:before{content:"\0025a0 "}.lst-kix_q8ok0mh9yyto-7>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-7}ol.lst-kix_jj5w63toozfm-0{list-style-type:none}ol.lst-kix_jj5w63toozfm-1{list-style-type:none}.lst-kix_686a8e4qhxwx-2>li:before{content:"\0025a0 "}ol.lst-kix_jj5w63toozfm-2{list-style-type:none}ol.lst-kix_11a9ub9xa97v-3{list-style-type:none}ol.lst-kix_bfzyeb917dp8-8.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-8 0}ol.lst-kix_11a9ub9xa97v-2{list-style-type:none}ol.lst-kix_11a9ub9xa97v-1{list-style-type:none}ol.lst-kix_11a9ub9xa97v-0{list-style-type:none}.lst-kix_b7256qmdgo85-2>li:before{content:"\0025a0 "}ol.lst-kix_11a9ub9xa97v-8{list-style-type:none}ol.lst-kix_11a9ub9xa97v-7{list-style-type:none}ol.lst-kix_11a9ub9xa97v-6{list-style-type:none}ol.lst-kix_11a9ub9xa97v-5{list-style-type:none}.lst-kix_4m04az9jmmj8-7>li:before{content:"\0025cb "}ol.lst-kix_11a9ub9xa97v-4{list-style-type:none}.lst-kix_b7256qmdgo85-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-1>li:before{content:"\0025cb "}.lst-kix_q8ok0mh9yyto-5>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-5,lower-latin) ") "}.lst-kix_4m04az9jmmj8-4>li:before{content:"\0025cb "}.lst-kix_bfzyeb917dp8-3>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-3}.lst-kix_q8ok0mh9yyto-8>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-8,lower-roman) ") "}ol.lst-kix_bfzyeb917dp8-5{list-style-type:none}ol.lst-kix_bfzyeb917dp8-4{list-style-type:none}ol.lst-kix_bfzyeb917dp8-3{list-style-type:none}ol.lst-kix_bfzyeb917dp8-2{list-style-type:none}ol.lst-kix_bfzyeb917dp8-8{list-style-type:none}ol.lst-kix_bfzyeb917dp8-7{list-style-type:none}ol.lst-kix_bfzyeb917dp8-6{list-style-type:none}ol.lst-kix_bfzyeb917dp8-1{list-style-type:none}ol.lst-kix_bfzyeb917dp8-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-5.start{counter-reset:lst-ctn-kix_emhp84jkv42c-5 0}.lst-kix_q8ok0mh9yyto-0>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-0}.lst-kix_iv2x96orjh4l-8>li:before{content:"\0025a0 "}.lst-kix_6qnkx7t1adn9-6>li:before{content:"\0025cf "}.lst-kix_gfromclascha-5>li:before{content:"\0025a0 "}ol.lst-kix_emhp84jkv42c-8.start{counter-reset:lst-ctn-kix_emhp84jkv42c-8 0}.lst-kix_11a9ub9xa97v-8>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-8}.lst-kix_x1epm4iu41dp-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-4>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-5>li{counter-increment:lst-ctn-kix_xv318blpjdo-5}.lst-kix_1wulu3ra2vwv-5>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-5}.lst-kix_5anu1k9tsyak-0>li:before{content:"\0025cf "}.lst-kix_fy6y7gyjejoh-4>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-7>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-0>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-2>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-2,lower-roman) ". "}.lst-kix_6ril5iwt0fcl-7>li:before{content:"\0025cb "}.lst-kix_emhp84jkv42c-4>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-4,decimal) ") "}.lst-kix_emhp84jkv42c-5>li{counter-increment:lst-ctn-kix_emhp84jkv42c-5}.lst-kix_jj5w63toozfm-4>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-4,lower-latin) ". "}.lst-kix_1wulu3ra2vwv-5>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-5,lower-latin) ") "}ul.lst-kix_u0uqs69v9qbh-8{list-style-type:none}.lst-kix_11a9ub9xa97v-1>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-1}ul.lst-kix_u0uqs69v9qbh-4{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-5{list-style-type:none}.lst-kix_opi66v2qdsjs-5>li:before{content:"\0025a0 "}ul.lst-kix_u0uqs69v9qbh-6{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-7{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-0{list-style-type:none}ul.lst-kix_gyhqddkw9i05-6{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-1{list-style-type:none}ul.lst-kix_gyhqddkw9i05-5{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-2{list-style-type:none}ul.lst-kix_gyhqddkw9i05-8{list-style-type:none}ul.lst-kix_u0uqs69v9qbh-3{list-style-type:none}ul.lst-kix_gyhqddkw9i05-7{list-style-type:none}ol.lst-kix_emhp84jkv42c-7.start{counter-reset:lst-ctn-kix_emhp84jkv42c-7 0}.lst-kix_fd1rucpc9vz2-2>li:before{content:"\0025a0 "}ul.lst-kix_jkgkf1u9sy0c-4{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-5{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-6{list-style-type:none}ul.lst-kix_gyhqddkw9i05-0{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-7{list-style-type:none}.lst-kix_bfzyeb917dp8-2>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-2,decimal) ". "}.lst-kix_gyhqddkw9i05-1>li:before{content:"\0025cb "}ul.lst-kix_jkgkf1u9sy0c-8{list-style-type:none}ul.lst-kix_gyhqddkw9i05-2{list-style-type:none}ul.lst-kix_gyhqddkw9i05-1{list-style-type:none}ul.lst-kix_gyhqddkw9i05-4{list-style-type:none}ul.lst-kix_gyhqddkw9i05-3{list-style-type:none}.lst-kix_11a9ub9xa97v-3>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-3,lower-latin) ") "}ol.lst-kix_emhp84jkv42c-6.start{counter-reset:lst-ctn-kix_emhp84jkv42c-6 0}.lst-kix_8p26nc4xx5n8-1>li:before{content:"\0025cb "}.lst-kix_u0uqs69v9qbh-5>li:before{content:"\0025a0 "}.lst-kix_9jxnjym0nges-5>li:before{content:"\0025a0 "}.lst-kix_86hsx13ssqid-3>li:before{content:"\0025cf "}ul.lst-kix_jkgkf1u9sy0c-0{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-1{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-2{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-3{list-style-type:none}ol.lst-kix_jj5w63toozfm-5.start{counter-reset:lst-ctn-kix_jj5w63toozfm-5 0}ul.lst-kix_bijol4nzhwf0-8{list-style-type:none}ol.lst-kix_emhp84jkv42c-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-2{list-style-type:none}ol.lst-kix_emhp84jkv42c-1{list-style-type:none}ol.lst-kix_emhp84jkv42c-4{list-style-type:none}ol.lst-kix_emhp84jkv42c-3{list-style-type:none}ol.lst-kix_emhp84jkv42c-6{list-style-type:none}ol.lst-kix_emhp84jkv42c-5{list-style-type:none}ol.lst-kix_emhp84jkv42c-8{list-style-type:none}ol.lst-kix_emhp84jkv42c-7{list-style-type:none}.lst-kix_11a9ub9xa97v-4>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-4}.lst-kix_1qz6dmm9b14l-4>li:before{content:"\0025cb "}.lst-kix_1qz6dmm9b14l-3>li:before{content:"\0025cf "}.lst-kix_1qz6dmm9b14l-5>li:before{content:"\0025a0 "}ul.lst-kix_j42a5dwgnqyq-0{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-1{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-2{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-3{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-4{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-5{list-style-type:none}.lst-kix_1qz6dmm9b14l-0>li:before{content:"\0025cf "}.lst-kix_1qz6dmm9b14l-8>li:before{content:"\0025a0 "}ul.lst-kix_j42a5dwgnqyq-6{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-7{list-style-type:none}.lst-kix_1qz6dmm9b14l-1>li:before{content:"\0025cb "}ol.lst-kix_bfzyeb917dp8-0.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-0 0}ul.lst-kix_j42a5dwgnqyq-8{list-style-type:none}.lst-kix_1qz6dmm9b14l-2>li:before{content:"\0025a0 "}ul.lst-kix_bijol4nzhwf0-4{list-style-type:none}ul.lst-kix_bijol4nzhwf0-5{list-style-type:none}ul.lst-kix_bijol4nzhwf0-6{list-style-type:none}ul.lst-kix_bijol4nzhwf0-7{list-style-type:none}ul.lst-kix_bijol4nzhwf0-0{list-style-type:none}ul.lst-kix_bijol4nzhwf0-1{list-style-type:none}ul.lst-kix_bijol4nzhwf0-2{list-style-type:none}ul.lst-kix_bijol4nzhwf0-3{list-style-type:none}.lst-kix_jj5w63toozfm-3>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-3,decimal) ". "}.lst-kix_1wulu3ra2vwv-2>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-2}.lst-kix_1qz6dmm9b14l-7>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-2>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-2,lower-roman) ". "}.lst-kix_q8ok0mh9yyto-4>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-4}.lst-kix_1qz6dmm9b14l-6>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-1>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-1,lower-latin) ". "}.lst-kix_h9mjmxara98n-7>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-7>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-0>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-0,decimal) ". "}.lst-kix_h9mjmxara98n-6>li:before{content:"\0025cf "}.lst-kix_h9mjmxara98n-8>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-6>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-8>li:before{content:"\0025a0 "}.lst-kix_h9mjmxara98n-5>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-5>li:before{content:"\0025a0 "}.lst-kix_h9mjmxara98n-3>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-3>li:before{content:"\0025cf "}.lst-kix_h9mjmxara98n-2>li:before{content:"\0025a0 "}.lst-kix_h9mjmxara98n-4>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-2>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-4>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-1.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-1 0}ol.lst-kix_s3mi7ukxwiwf-1.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-1 0}.lst-kix_h9mjmxara98n-0>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-0>li:before{content:"\0025cf "}.lst-kix_h9mjmxara98n-1>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-1>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-8>li{counter-increment:lst-ctn-kix_jj5w63toozfm-8}ul.lst-kix_gfromclascha-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-2.start{counter-reset:lst-ctn-kix_emhp84jkv42c-2 0}ul.lst-kix_gfromclascha-7{list-style-type:none}ul.lst-kix_gfromclascha-8{list-style-type:none}ul.lst-kix_gfromclascha-5{list-style-type:none}ul.lst-kix_gfromclascha-6{list-style-type:none}.lst-kix_x1epm4iu41dp-8>li:before{content:"\0025a0 "}ul.lst-kix_gfromclascha-3{list-style-type:none}ul.lst-kix_gfromclascha-4{list-style-type:none}ul.lst-kix_gfromclascha-1{list-style-type:none}.lst-kix_bfzyeb917dp8-3>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-3,lower-latin) ") "}ul.lst-kix_gfromclascha-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-3{list-style-type:none}.lst-kix_x1epm4iu41dp-2>li:before{content:"\0025a0 "}ol.lst-kix_11a9ub9xa97v-1.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-1 0}ul.lst-kix_opi66v2qdsjs-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-1{list-style-type:none}ul.lst-kix_opi66v2qdsjs-0{list-style-type:none}.lst-kix_q8ok0mh9yyto-0>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-0,upper-roman) ". "}.lst-kix_fy6y7gyjejoh-3>li:before{content:"\0025cf "}.lst-kix_bfzyeb917dp8-5>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-5,lower-latin) ") "}.lst-kix_jj5w63toozfm-0>li{counter-increment:lst-ctn-kix_jj5w63toozfm-0}.lst-kix_x1epm4iu41dp-6>li:before{content:"\0025cf "}ul.lst-kix_opi66v2qdsjs-8{list-style-type:none}ul.lst-kix_opi66v2qdsjs-7{list-style-type:none}.lst-kix_x1epm4iu41dp-4>li:before{content:"\0025cb "}ul.lst-kix_opi66v2qdsjs-6{list-style-type:none}ul.lst-kix_opi66v2qdsjs-5{list-style-type:none}.lst-kix_fy6y7gyjejoh-1>li:before{content:"\0025cb "}ul.lst-kix_opi66v2qdsjs-4{list-style-type:none}.lst-kix_bfzyeb917dp8-7>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-7,lower-latin) ") "}.lst-kix_emhp84jkv42c-7>li{counter-increment:lst-ctn-kix_emhp84jkv42c-7}.lst-kix_fy6y7gyjejoh-7>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-1.start{counter-reset:lst-ctn-kix_xv318blpjdo-1 0}.lst-kix_x1epm4iu41dp-0>li:before{content:"\0025cf "}.lst-kix_fy6y7gyjejoh-5>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-3>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-3,lower-latin) ") "}.lst-kix_emhp84jkv42c-5>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-5,lower-latin) ") "}.lst-kix_emhp84jkv42c-1>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-1,upper-latin) ". "}.lst-kix_emhp84jkv42c-7>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-7,lower-latin) ") "}.lst-kix_jj5w63toozfm-5>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-5,lower-roman) ". "}.lst-kix_bfzyeb917dp8-2>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-2}ul.lst-kix_1qz6dmm9b14l-6{list-style-type:none}.lst-kix_gyhqddkw9i05-8>li:before{content:"\0025a0 "}.lst-kix_jj5w63toozfm-7>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-7,lower-latin) ". "}ul.lst-kix_1qz6dmm9b14l-5{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-8{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-7{list-style-type:none}.lst-kix_jj5w63toozfm-1>li{counter-increment:lst-ctn-kix_jj5w63toozfm-1}ul.lst-kix_1qz6dmm9b14l-2{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-1{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-4{list-style-type:none}ul.lst-kix_1qz6dmm9b14l-3{list-style-type:none}.lst-kix_u0uqs69v9qbh-0>li:before{content:"\0025cf "}.lst-kix_u0uqs69v9qbh-4>li:before{content:"\0025cb "}ul.lst-kix_1qz6dmm9b14l-0{list-style-type:none}.lst-kix_s3mi7ukxwiwf-6>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-6}.lst-kix_jj5w63toozfm-7>li{counter-increment:lst-ctn-kix_jj5w63toozfm-7}.lst-kix_u0uqs69v9qbh-2>li:before{content:"\0025a0 "}.lst-kix_8p26nc4xx5n8-6>li:before{content:"\0025cf "}ol.lst-kix_1wulu3ra2vwv-4.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-4 0}.lst-kix_u0uqs69v9qbh-8>li:before{content:"\0025a0 "}.lst-kix_bfzyeb917dp8-1>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-1,upper-latin) ". "}ul.lst-kix_ekmayt81kvbz-8{list-style-type:none}.lst-kix_gyhqddkw9i05-0>li:before{content:"\0025cf "}ul.lst-kix_ekmayt81kvbz-7{list-style-type:none}.lst-kix_gyhqddkw9i05-4>li:before{content:"\0025cb "}.lst-kix_8p26nc4xx5n8-2>li:before{content:"\0025a0 "}ul.lst-kix_ekmayt81kvbz-6{list-style-type:none}ul.lst-kix_ekmayt81kvbz-5{list-style-type:none}ul.lst-kix_ekmayt81kvbz-4{list-style-type:none}ul.lst-kix_ekmayt81kvbz-3{list-style-type:none}.lst-kix_gyhqddkw9i05-6>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-0>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-8>li:before{content:"\0025a0 "}ul.lst-kix_ekmayt81kvbz-2{list-style-type:none}ul.lst-kix_ekmayt81kvbz-1{list-style-type:none}.lst-kix_u0uqs69v9qbh-6>li:before{content:"\0025cf "}ul.lst-kix_ekmayt81kvbz-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-1{list-style-type:none}ol.lst-kix_bfzyeb917dp8-5.start{counter-reset:lst-ctn-kix_bfzyeb917dp8-5 0}ol.lst-kix_s3mi7ukxwiwf-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-0{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-1{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-6{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-3{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-4{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-6{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-3{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-8{list-style-type:none}.lst-kix_gyhqddkw9i05-2>li:before{content:"\0025a0 "}.lst-kix_8p26nc4xx5n8-4>li:before{content:"\0025cb "}ul.lst-kix_7tib3jrzu2u9-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-8{list-style-type:none}.lst-kix_xv318blpjdo-1>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-1,upper-latin) ". "}.lst-kix_xv318blpjdo-0>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-0,upper-roman) ". "}.lst-kix_h0kibz3smj6t-4>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-1>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-1}.lst-kix_h0kibz3smj6t-7>li:before{content:"\0025cb "}.lst-kix_h0kibz3smj6t-8>li:before{content:"\0025a0 "}.lst-kix_11a9ub9xa97v-5>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-5}.lst-kix_opi66v2qdsjs-0>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-8>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-8,lower-roman) ") "}.lst-kix_xv318blpjdo-5>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-5,lower-latin) ") "}.lst-kix_h0kibz3smj6t-3>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-3>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-4>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-4>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-4,decimal) ") "}.lst-kix_h0kibz3smj6t-0>li:before{content:"\0025cf "}ol.lst-kix_11a9ub9xa97v-0.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-0 0}.lst-kix_s3mi7ukxwiwf-7>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-7}.lst-kix_q8ok0mh9yyto-3>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-3,lower-latin) ") "}.lst-kix_686a8e4qhxwx-8>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-6>li{counter-increment:lst-ctn-kix_emhp84jkv42c-6}.lst-kix_q8ok0mh9yyto-2>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-2,decimal) ". "}.lst-kix_q8ok0mh9yyto-6>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-6,lower-roman) ") "}.lst-kix_4m04az9jmmj8-2>li:before{content:"\0025a0 "}.lst-kix_4m04az9jmmj8-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-7>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-7,lower-latin) ") "}.lst-kix_4m04az9jmmj8-1>li:before{content:"\0025cb "}.lst-kix_4m04az9jmmj8-5>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-4>li{counter-increment:lst-ctn-kix_xv318blpjdo-4}.lst-kix_x1epm4iu41dp-7>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-4>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-8>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-6>li{counter-increment:lst-ctn-kix_xv318blpjdo-6}ol.lst-kix_jj5w63toozfm-1.start{counter-reset:lst-ctn-kix_jj5w63toozfm-1 0}.lst-kix_bfzyeb917dp8-4>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-4,decimal) ") "}.lst-kix_x1epm4iu41dp-3>li:before{content:"\0025cf "}.lst-kix_fd1rucpc9vz2-8>li:before{content:"\0025a0 "}.lst-kix_bfzyeb917dp8-8>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-8,lower-roman) ") "}.lst-kix_fy6y7gyjejoh-2>li:before{content:"\0025a0 "}.lst-kix_fy6y7gyjejoh-6>li:before{content:"\0025cf "}ol.lst-kix_1wulu3ra2vwv-8.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-8 0}ol.lst-kix_s3mi7ukxwiwf-6.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-6 0}ol.lst-kix_jj5w63toozfm-0.start{counter-reset:lst-ctn-kix_jj5w63toozfm-0 0}.lst-kix_emhp84jkv42c-2>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-2,decimal) ". "}.lst-kix_emhp84jkv42c-6>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-6,lower-roman) ") "}.lst-kix_686a8e4qhxwx-0>li:before{content:"\0025cf "}.lst-kix_ndaonzmgp8vn-5>li:before{content:"\0025a0 "}.lst-kix_9jxnjym0nges-3>li:before{content:"\0025cf "}.lst-kix_opi66v2qdsjs-7>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-1>li:before{content:"\0025cb "}.lst-kix_gyhqddkw9i05-7>li:before{content:"\0025cb "}.lst-kix_jj5w63toozfm-6>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-6,decimal) ". "}.lst-kix_u0uqs69v9qbh-3>li:before{content:"\0025cf "}.lst-kix_fd1rucpc9vz2-0>li:before{content:"\0025cf "}.lst-kix_fd1rucpc9vz2-4>li:before{content:"\0025cb "}ol.lst-kix_s3mi7ukxwiwf-5.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-5 0}.lst-kix_opi66v2qdsjs-3>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-3>li:before{content:"\0025cf "}.lst-kix_8p26nc4xx5n8-7>li:before{content:"\0025cb "}.lst-kix_u0uqs69v9qbh-7>li:before{content:"\0025cb "}.lst-kix_bfzyeb917dp8-0>li:before{content:"" counter(lst-ctn-kix_bfzyeb917dp8-0,upper-roman) ". "}.lst-kix_11a9ub9xa97v-1>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-1,upper-latin) ". "}.lst-kix_gyhqddkw9i05-3>li:before{content:"\0025cf "}.lst-kix_9jxnjym0nges-7>li:before{content:"\0025cb "}.lst-kix_11a9ub9xa97v-5>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-5,lower-latin) ") "}ol.lst-kix_11a9ub9xa97v-2.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-2 0}.lst-kix_s3mi7ukxwiwf-4>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-4}.lst-kix_7tib3jrzu2u9-4>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-7 0}ol.lst-kix_xv318blpjdo-5{list-style-type:none}ol.lst-kix_xv318blpjdo-6{list-style-type:none}ol.lst-kix_xv318blpjdo-7{list-style-type:none}ol.lst-kix_xv318blpjdo-0{list-style-type:none}ol.lst-kix_xv318blpjdo-1{list-style-type:none}.lst-kix_7tib3jrzu2u9-1>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-2{list-style-type:none}ol.lst-kix_xv318blpjdo-3{list-style-type:none}.lst-kix_q8ok0mh9yyto-6>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-6}ul.lst-kix_5anu1k9tsyak-7{list-style-type:none}.lst-kix_jj5w63toozfm-6>li{counter-increment:lst-ctn-kix_jj5w63toozfm-6}ul.lst-kix_5anu1k9tsyak-8{list-style-type:none}ul.lst-kix_5anu1k9tsyak-5{list-style-type:none}.lst-kix_11a9ub9xa97v-2>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-2}ol.lst-kix_1wulu3ra2vwv-0{list-style-type:none}ul.lst-kix_5anu1k9tsyak-6{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-1{list-style-type:none}ul.lst-kix_5anu1k9tsyak-3{list-style-type:none}ul.lst-kix_5anu1k9tsyak-4{list-style-type:none}ul.lst-kix_5anu1k9tsyak-1{list-style-type:none}.lst-kix_xv318blpjdo-3>li{counter-increment:lst-ctn-kix_xv318blpjdo-3}ul.lst-kix_5anu1k9tsyak-2{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-6{list-style-type:none}ul.lst-kix_5anu1k9tsyak-0{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-7{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-8{list-style-type:none}.lst-kix_7tib3jrzu2u9-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-2{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-3{list-style-type:none}.lst-kix_7tib3jrzu2u9-7>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-4{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-5{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-5.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-5 0}ol.lst-kix_11a9ub9xa97v-7.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-7 0}ol.lst-kix_q8ok0mh9yyto-2.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-2 0}.lst-kix_11a9ub9xa97v-6>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-6}.lst-kix_5anu1k9tsyak-7>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-2.start{counter-reset:lst-ctn-kix_xv318blpjdo-2 0}.lst-kix_1wulu3ra2vwv-4>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-4}.lst-kix_q8ok0mh9yyto-2>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-2}ol.lst-kix_jj5w63toozfm-4.start{counter-reset:lst-ctn-kix_jj5w63toozfm-4 0}.lst-kix_6qnkx7t1adn9-2>li:before{content:"\0025a0 "}.lst-kix_qeqyxe7gm97l-6>li:before{content:"\0025cf "}.lst-kix_qeqyxe7gm97l-4>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-1>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-1>li:before{content:"\0025cb "}.lst-kix_qeqyxe7gm97l-3>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-4>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-0.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-0 0}ol.lst-kix_q8ok0mh9yyto-7.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-7 0}.lst-kix_j42a5dwgnqyq-3>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-2>li{counter-increment:lst-ctn-kix_jj5w63toozfm-2}ol.lst-kix_1wulu3ra2vwv-3.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-3 0}ol.lst-kix_q8ok0mh9yyto-0.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-0 0}.lst-kix_6qnkx7t1adn9-5>li:before{content:"\0025a0 "}.lst-kix_6qnkx7t1adn9-7>li:before{content:"\0025cb "}.lst-kix_iv2x96orjh4l-7>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-6>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-1>li:before{content:"\0025cb "}.lst-kix_ndaonzmgp8vn-8>li:before{content:"\0025a0 "}.lst-kix_iv2x96orjh4l-1>li:before{content:"\0025cb "}.lst-kix_bfzyeb917dp8-8>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-8}.lst-kix_opi66v2qdsjs-4>li:before{content:"\0025cb "}.lst-kix_fd1rucpc9vz2-1>li:before{content:"\0025cb "}.lst-kix_fd1rucpc9vz2-3>li:before{content:"\0025cf "}.lst-kix_opi66v2qdsjs-6>li:before{content:"\0025cf "}ol.lst-kix_11a9ub9xa97v-4.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-4 0}.lst-kix_bfzyeb917dp8-1>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-1}.lst-kix_ndaonzmgp8vn-0>li:before{content:"\0025cf "}ol.lst-kix_jj5w63toozfm-6.start{counter-reset:lst-ctn-kix_jj5w63toozfm-6 0}ul.lst-kix_b7256qmdgo85-6{list-style-type:none}ul.lst-kix_b7256qmdgo85-7{list-style-type:none}.lst-kix_1wulu3ra2vwv-3>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-3}ul.lst-kix_b7256qmdgo85-8{list-style-type:none}ul.lst-kix_b7256qmdgo85-2{list-style-type:none}ul.lst-kix_b7256qmdgo85-3{list-style-type:none}.lst-kix_11a9ub9xa97v-4>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-4,decimal) ") "}ul.lst-kix_b7256qmdgo85-4{list-style-type:none}ul.lst-kix_b7256qmdgo85-5{list-style-type:none}.lst-kix_11a9ub9xa97v-2>li:before{content:"" counter(lst-ctn-kix_11a9ub9xa97v-2,decimal) ". "}.lst-kix_9jxnjym0nges-4>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-4>li:before{content:"\0025cb "}ul.lst-kix_b7256qmdgo85-0{list-style-type:none}ul.lst-kix_b7256qmdgo85-1{list-style-type:none}.lst-kix_9jxnjym0nges-6>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-2>li:before{content:"\0025a0 "}.lst-kix_bfzyeb917dp8-5>li{counter-increment:lst-ctn-kix_bfzyeb917dp8-5}.lst-kix_h0kibz3smj6t-6>li:before{content:"\0025cf "}.lst-kix_11a9ub9xa97v-3>li{counter-increment:lst-ctn-kix_11a9ub9xa97v-3}ol.lst-kix_11a9ub9xa97v-5.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-5 0}ul.lst-kix_x1epm4iu41dp-0{list-style-type:none}ol.lst-kix_xv318blpjdo-0.start{counter-reset:lst-ctn-kix_xv318blpjdo-0 0}.lst-kix_jkgkf1u9sy0c-0>li:before{content:"\0025cf "}ul.lst-kix_x1epm4iu41dp-6{list-style-type:none}ul.lst-kix_x1epm4iu41dp-5{list-style-type:none}ul.lst-kix_x1epm4iu41dp-8{list-style-type:none}.lst-kix_jkgkf1u9sy0c-3>li:before{content:"\0025cf "}ul.lst-kix_x1epm4iu41dp-7{list-style-type:none}ul.lst-kix_x1epm4iu41dp-2{list-style-type:none}.lst-kix_xv318blpjdo-0>li{counter-increment:lst-ctn-kix_xv318blpjdo-0}ol.lst-kix_jj5w63toozfm-8.start{counter-reset:lst-ctn-kix_jj5w63toozfm-8 0}ul.lst-kix_x1epm4iu41dp-1{list-style-type:none}ul.lst-kix_x1epm4iu41dp-4{list-style-type:none}ul.lst-kix_x1epm4iu41dp-3{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-2.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-2 0}.lst-kix_686a8e4qhxwx-6>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-5>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-5}.lst-kix_h0kibz3smj6t-1>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-6>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-6,lower-roman) ") "}ul.lst-kix_86hsx13ssqid-3{list-style-type:none}ul.lst-kix_86hsx13ssqid-2{list-style-type:none}.lst-kix_xv318blpjdo-3>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-3,lower-latin) ") "}ul.lst-kix_86hsx13ssqid-5{list-style-type:none}ul.lst-kix_86hsx13ssqid-4{list-style-type:none}.lst-kix_686a8e4qhxwx-1>li:before{content:"\0025cb "}ul.lst-kix_86hsx13ssqid-1{list-style-type:none}.lst-kix_jkgkf1u9sy0c-8>li:before{content:"\0025a0 "}ul.lst-kix_86hsx13ssqid-0{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-0{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-1{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-2{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-3{list-style-type:none}.lst-kix_b7256qmdgo85-1>li:before{content:"\0025cb "}ul.lst-kix_86hsx13ssqid-7{list-style-type:none}ul.lst-kix_h9mjmxara98n-0{list-style-type:none}ul.lst-kix_86hsx13ssqid-6{list-style-type:none}ul.lst-kix_86hsx13ssqid-8{list-style-type:none}ul.lst-kix_h9mjmxara98n-3{list-style-type:none}.lst-kix_4m04az9jmmj8-8>li:before{content:"\0025a0 "}ul.lst-kix_fy6y7gyjejoh-8{list-style-type:none}ul.lst-kix_h9mjmxara98n-4{list-style-type:none}ul.lst-kix_h9mjmxara98n-1{list-style-type:none}ul.lst-kix_h9mjmxara98n-2{list-style-type:none}ul.lst-kix_h9mjmxara98n-7{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-4{list-style-type:none}ul.lst-kix_h9mjmxara98n-8{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-5{list-style-type:none}ul.lst-kix_h9mjmxara98n-5{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-6{list-style-type:none}ul.lst-kix_h9mjmxara98n-6{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-7{list-style-type:none}.lst-kix_b7256qmdgo85-6>li:before{content:"\0025cf "}ol.lst-kix_1wulu3ra2vwv-1.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-1 0}.lst-kix_q97rvvc7c69e-0>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-1>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-1,upper-latin) ". "}.lst-kix_4m04az9jmmj8-0>li:before{content:"\0025cf "}ol.lst-kix_11a9ub9xa97v-6.start{counter-reset:lst-ctn-kix_11a9ub9xa97v-6 0}.lst-kix_q8ok0mh9yyto-4>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-4,decimal) ") "}.lst-kix_emhp84jkv42c-0>li{counter-increment:lst-ctn-kix_emhp84jkv42c-0}.lst-kix_q8ok0mh9yyto-5>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-5}.lst-kix_s3mi7ukxwiwf-1>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-1}.lst-kix_4m04az9jmmj8-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-7>li{counter-increment:lst-ctn-kix_xv318blpjdo-7}ol.lst-kix_xv318blpjdo-7.start{counter-reset:lst-ctn-kix_xv318blpjdo-7 0}.lst-kix_gfromclascha-1>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-7>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-3.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-3 0}.lst-kix_1wulu3ra2vwv-7>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-7}ul.lst-kix_fd1rucpc9vz2-0{list-style-type:none}.lst-kix_fy6y7gyjejoh-0>li:before{content:"\0025cf "}ul.lst-kix_fd1rucpc9vz2-1{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-2{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-3{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-6.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-6 0}ul.lst-kix_fd1rucpc9vz2-8{list-style-type:none}.lst-kix_bfzyeb917dp8-6>li:before{content:"(" counter(lst-ctn-kix_bfzyeb917dp8-6,lower-roman) ") "}.lst-kix_6ril5iwt0fcl-3>li:before{content:"\0025cf "}ul.lst-kix_fd1rucpc9vz2-4{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-5{list-style-type:none}ul.lst-kix_fd1rucpc9vz2-6{list-style-type:none}.lst-kix_fd1rucpc9vz2-6>li:before{content:"\0025cf "}ul.lst-kix_fd1rucpc9vz2-7{list-style-type:none}.lst-kix_5anu1k9tsyak-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-8>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-8}.lst-kix_iv2x96orjh4l-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-6>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-6,decimal) ". "}.lst-kix_fy6y7gyjejoh-8>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-4.start{counter-reset:lst-ctn-kix_xv318blpjdo-4 0}.lst-kix_x1epm4iu41dp-1>li:before{content:"\0025cb "}.lst-kix_q97rvvc7c69e-8>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-5.start{counter-reset:lst-ctn-kix_xv318blpjdo-5 0}ul.lst-kix_8p26nc4xx5n8-0{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-1{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-2{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-3{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-4{list-style-type:none}.lst-kix_emhp84jkv42c-0>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-0,upper-roman) ". "}.lst-kix_emhp84jkv42c-8>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-8,lower-roman) ") "}.lst-kix_9jxnjym0nges-1>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-5.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-5 0}.lst-kix_ndaonzmgp8vn-3>li:before{content:"\0025cf "}.lst-kix_jj5w63toozfm-8>li:before{content:"" counter(lst-ctn-kix_jj5w63toozfm-8,lower-roman) ". "}.lst-kix_u0uqs69v9qbh-1>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-1>li:before{content:"\0025cb "}.lst-kix_11a9ub9xa97v-7>li:before{content:"(" counter(lst-ctn-kix_11a9ub9xa97v-7,lower-latin) ") "}.lst-kix_8p26nc4xx5n8-5>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-6.start{counter-reset:lst-ctn-kix_xv318blpjdo-6 0}.lst-kix_1wulu3ra2vwv-0>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-0}.lst-kix_gyhqddkw9i05-5>li:before{content:"\0025a0 "}ul.lst-kix_6qnkx7t1adn9-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-4 0}ul.lst-kix_6qnkx7t1adn9-7{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-5{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-6{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-6{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-5{list-style-type:none}.lst-kix_sholqrhc62dh-3>li:before{content:"\0025cf "}ul.lst-kix_8p26nc4xx5n8-7{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-4{list-style-type:none}ul.lst-kix_8p26nc4xx5n8-8{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-3{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-2{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-1{list-style-type:none}.lst-kix_1wulu3ra2vwv-1>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-1,upper-latin) ". "}ul.lst-kix_6qnkx7t1adn9-0{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c1{margin-left:36pt;padding-top:6pt;padding-left:0pt;padding-bottom:0pt;line-height:1.2;orphans:2;widows:2;text-align:left}.c9{color:#ff5e0e;font-weight:700;text-decoration:none;vertical-align:baseline;font-size:18pt;font-family:"PT Sans Narrow";font-style:normal}.c21{color:#666666;font-weight:400;text-decoration:underline;vertical-align:baseline;font-size:11pt;font-family:"Trebuchet MS";font-style:normal}.c26{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c2{padding-top:6pt;padding-bottom:0pt;line-height:1.2;orphans:2;widows:2;text-align:left}.c10{padding-top:24pt;padding-bottom:0pt;line-height:1.3;page-break-after:avoid;text-align:left}.c4{margin-left:36pt;padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c18{margin-left:72pt;padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c24{padding-top:8pt;padding-bottom:0pt;line-height:1.2;page-break-after:avoid;text-align:left}.c0{font-size:9pt;font-family:"Consolas";color:#880000;font-weight:400}.c11{font-size:9pt;font-family:"Consolas";color:#666600;font-weight:400}.c17{color:#008575;font-weight:400;font-size:16pt;font-family:"PT Sans Narrow"}.c37{color:#695d46;font-weight:700;font-size:42pt;font-family:"PT Sans Narrow"}.c8{font-size:9pt;font-family:"Consolas";color:#006666;font-weight:400}.c29{padding-top:0pt;padding-bottom:0pt;line-height:1.2;text-align:left}.c25{font-size:9pt;font-family:"Consolas";color:#660066;font-weight:400}.c19{padding-top:16pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c36{font-size:18pt;font-family:"PT Sans Narrow";color:#ff5e0e;font-weight:700}.c35{font-size:9pt;font-family:"Consolas";color:#000088;font-weight:400}.c6{font-size:9pt;font-family:"Consolas";color:#000000;font-weight:400}.c13{text-decoration:none;vertical-align:baseline;font-size:11pt;font-style:normal}.c16{text-decoration:none;vertical-align:baseline;font-style:normal}.c31{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c27{font-weight:700;font-size:9pt;font-family:"Consolas"}.c3{font-family:"Open Sans";color:#695d46;font-weight:400}.c33{orphans:2;widows:2}.c15{color:#1155cc;text-decoration:underline}.c5{color:inherit;text-decoration:inherit}.c12{margin-left:72pt;padding-left:0pt}.c20{margin-left:36pt;padding-left:0pt}.c30{font-weight:400;font-family:"Arial"}.c14{font-weight:400;font-family:"Open Sans"}.c7{padding:0;margin:0}.c22{color:#000000}.c32{font-size:12pt}.c23{margin-left:36pt}.c34{font-size:8pt}.c28{margin-left:72pt}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left} 

Oracle Fusion Middleware Deployments Using Docker Swarm Part II


This is the second in a series of blogs that describe how to build a Fusion Middleware (FMW) Cluster that runs as a number of Docker images that run in docker containers.  These containers are coordinated using Docker Swarm and can be deployed to a single host machine or multiple hosts.  This simplifies the task of building FMW clusters and also makes it easier to scale them in and out (adding or subtracting host machines) as well as up and down (using bigger or smaller host machines).

This blog uses Oracle Service Bus as an FMW product but the principles are applicable to other FMW products.

In our previous blog we talked about the overall requirements for running FMW on Docker Swarm and sketched out our overall approach.

In this entry we will explain the concepts of using Docker base images and create an Oracle database image and an Oracle Service Bus image.  The next blog will cover how to create an OSB domain and how to run this in Docker Swarm.

Notes on Building on Existing Docker Images

Docker allows you to create a new image by basing it on an existing image.  The “FROM” instruction in a dockerfile tells docker the base image that you are using as your foundation.  We will build a number of database base images that can then be reused later.

A docker image is a set of files and configuration.  A docker image runs in a docker container.  So a single image may be running in zero, one or more containers.  Think of the image as the software and configuration, think of the container as the active running image.

The diagram shows the images that we will build and their base images referenced in the FROM instruction.

Docker FMW Image Dependencies

The solid lines indicate the image reference by the FROM command in the dockerfile used to create an image.  The dotted lines represent dependencies on other images.

More details on the images will be given in the next section, but the following bullets explain how they work.  Note that we can store the created images in a company docker registry so that they can be reused.

  • Oracle Linux is an image that we use as our starting point.  This is available from github along with instructions (dockerfiles) to create the other images.
  • Oracle Database image is created by installing the Oracle database binaries into the Oracle Linux image.  This image can be used to create databases with different characteristics, such as different character sets, different service and instance names etc.
  • An Oracle Database Instance is created by running the database configuration assistant in a container created from the Oracle Database image.
  • JDK 8 image is created by installing a JDK 8 into the generic Linux image, this could be reused by any software requiring Java.
  • Fusion Middleware Infrastructure image is created by installing the WebLogic Fusion Middleware Infrastructure into the JDK image.  This provides WebLogic and some additional Oracle infrastructure files that are used by Fusion Middleware.  This image can be reused by any Fusion Middleware product image.
  • Oracle Service Bus image provides us with Service Bus installation on top of the Fusion Middleware Infrastructure image.  This provides a software only installation, no domain is created so the image can be used to create any desired Service Bus domain configuration.
  • Service Bus Domain image is the image where we run the domain configuration utility to create a Service Bus domain.  Prior to running the domain configuration wizard the FMW repository configuration utility is run against the database container created from the Oracle Database Instance image.  Depending on the options chosen this could be pointed to and used by a number of different FMW components.  In our case we will install the SOA schemas. We need to refer to the Oracle Database Container to be able to run the RCU and also to complete the domain creation.  Different run commands are used to start a container to run either the Admin Server or a Managed Server.
Retrieving Docker Files for OSB Cluster

We are posting all the required files to go along with this blog on github.  You are welcome to fork from this and improve it.  We cloned many of these files from the official Oracle docker github.  We removed unused versions and added a simplified file to each product directory to make it easy to see how we actually built our environment.  We are still updating the files online and will shortly add details on building the service bus cluster.  We made the following additional changes to the standard Oracle files:

  • Java - we used the JDK rather than the JRE.
  • WebLogic - we added a FMW Infrastructure alongside the generic and developer options.  This is available in other versions of the Oracle files but not in the files.
  • OSB and SOA - Added OSB and SOA directories along with their associated files.
Database Creation

Because Oracle Fusion Middleware relies on a database we need to create a database image.  Once we have created the database then we need to create the FMW schemas within it by running the Repository Creation Utility.  The Repository Creation Utility is only available in the FMW installed code, so to create the schemas we also need to install our FMW component, in our case Service Bus.  The steps we will follow to build, create and configure the database are as follows:

  1. Build Oracle Database image using the Oracle provided database dockerfile.
  2. Create an Oracle Database Instance by creating a docker container and using the provided scripts to initialize the container with a database instance.

Detailed instructions to build the database image are provided in the section “Oracle Database Build Steps

We create the database instance in a docker container rather than baking it into an image because we only want to run a single instance of the database container.

FMW Installation

We will use multiple layered images to get to our FMW install image.  Each image is kept separate to make it flexible and reusable.  For example given the WebLogic FMW Infrastructure image we could create separate FMW images for SOA Suite, WebCenter and Business Intelligence for example.

  • We will install JDK 8 to create a JDK 8 image.  This can be used to create any image requiring a JDK 8 installation.  This if built on top of the Oracle Linux 7 image.
  • We build on top of the JDK 8 image to install Fusion Middleware Infrastructure into a WebLogic FMW Infrastructure image.  This can be used as the basis of any FMW images in the future.
  • In our example we install SOA or OSB on top of the WebLogic FMW Infrastructure image as our FMW component.  This does not create a domain.  It just installs the software.

Detailed steps are given in the sections “Weblogic Docker Image Build Steps” and “OSB Docker Image Build steps

General Build Instructions

You can download our dockerfiles by cloning our github onto your build machine.

git clone

This will create a directory OSB-Docker-Swarm.  We will refer to the location of this as <MASTER> in subsequent instructions.

Database Docker Image Build Steps

There is an excellent blog on Creating an Oracle Database Docker image by Gerald Venzi that covers everything.  We have provided a minimal description of the steps here only to be self contained.

  1. Get Oracle Database Binaries

Retrieve the Oracle binaries from OTN


  and place them at <MASTER>/OracleDatabase/dockerfiles/

  1. Build Oracle Database Docker Image
  • Create a Docker Image for the database using the binaries from the previous step.  This installs the database binaries and saves the result as a docker image.  The has all the paramters needed by the dockerfile, if you are interested in what they do check out the official Oracle docker database image docs.  Note that if we don’t have the Oracle Linux image then the build process will retrieve it from docker hub.


  • Check the image has been built properly by making sure it is listed by the docker images command.

$ docker images

REPOSITORY      TAG         IMAGE ID      CREATED         SIZE

oracle/database 8f0f3c5f4170  49 seconds ago  11.24 GB

oraclelinux     latest      27a5201e554e  3 weeks ago     225.1 MB

  1. Create Oracle Database
  • Run a docker container based on the previously built docker image to create the database instance.  The command that we provide will do this.  Again the details of how it works are in the official Oracle docker database image docs.  We also added a -d parameter to run the container in the background.


  • Check container logs
    docker logs <container_id>
  • Change DB password by running the we provide which sets the database password to be FMWDocker.  You can edit the file to change the password.  We also modified this file to set the password policy to not expire the passwords.


We now have an Oracle database instance running in a docker container.

Weblogic Docker Image Build Steps
  1. Build JDK 1.8 Docker image based on base image
  • Go to <MASTER>/oraclejdk8 folder
  • Download jdk 8 install binary file, jdk-8uXXX-linux-x64.tar.gz from OTN into oraclejdk8 folder.  Any version that starts jdk-8 should work.
  • Run


  • Check that image has been created

$ docker images

REPOSITORY       TAG          IMAGE ID      CREATED         SIZE

oracle/database  086a4a3541bc  34 minutes ago  11.24 GB

oracle/serverjdk 8            85aebb7b773e  22 hours ago    590.4 MB

oraclelinux      latest       27a5201e554e  3 weeks ago     225.1 MB

This JDK image is then used as a base for future images.

  1. Build Weblogic installation image based on JDK 1.8 image
  • Go to folder <MASTER>/wls12.2.1.2
  • Download from OTN to folder wls12.2.1.2
  • Run


  • Run docker images to check the image created in the above steps

$ docker images

REPOSITORY        TAG                      IMAGE ID     CREATED              SIZE

oracle/weblogic  9eceea30c474 About a minute ago   4.096 GB

oracle/database              086a4a3541bc About an hour ago    11.24 GB

oracle/serverjdk  8                        85aebb7b773e 22 hours ago         590.4 MB

oraclelinux       latest                   27a5201e554e 3 weeks ago          225.1 MB

This gives us our FMW infrastructure docker image.

OSB Docker Image Build steps
  • Go to folder <MASTER>/osb
  • Download fmw_12. from OTN to folder osb.  If unavailable on OTN it is available from e-delivery if you have a Service Bus license.
  • Run


  • Check docker image built in the above step

$ docker images

REPOSITORY        TAG                     IMAGE ID     CREATED             SIZE

oracle/osb                59021dc16e40 5 minutes ago       7.231 GB

oracle/weblogic 9eceea30c474 12 minutes ago      4.096 GB

oracle/database             086a4a3541bc About an hour ago   11.24 GB

oracle/serverjdk  8                       85aebb7b773e 23 hours ago        590.4 MB

oraclelinux       latest                  27a5201e554e 3 weeks ago         225.1 MB

This gives us our FMW product docker image, in our case service bus.  We also provided SOA Suite dockerfiles in the git repository.


In this entry we have explained how to install Fusion Middleware and Oracle Database as Docker images, and how to create a Database container.  In our next entry we will use these images to create a cluster in swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

Building an FMW Cluster using Docker (Part I Introduction)

Sat, 2017-01-14 21:19
@import url('');.lst-kix_sholqrhc62dh-7>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-8>li:before{content:"\0025a0 "}.lst-kix_sholqrhc62dh-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-3.start{counter-reset:lst-ctn-kix_xv318blpjdo-3 0}ul.lst-kix_bijol4nzhwf0-8{list-style-type:none}.lst-kix_sholqrhc62dh-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-0>li:before{content:"\0025cf "}ol.lst-kix_emhp84jkv42c-0{list-style-type:none}.lst-kix_emhp84jkv42c-3>li{counter-increment:lst-ctn-kix_emhp84jkv42c-3}ol.lst-kix_emhp84jkv42c-2{list-style-type:none}ol.lst-kix_emhp84jkv42c-1{list-style-type:none}ol.lst-kix_emhp84jkv42c-4{list-style-type:none}ol.lst-kix_emhp84jkv42c-3{list-style-type:none}ol.lst-kix_emhp84jkv42c-6{list-style-type:none}ol.lst-kix_emhp84jkv42c-5{list-style-type:none}ol.lst-kix_emhp84jkv42c-8{list-style-type:none}ol.lst-kix_emhp84jkv42c-7{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-0{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-1{list-style-type:none}ul.lst-kix_4m04az9jmmj8-3{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-2{list-style-type:none}ul.lst-kix_4m04az9jmmj8-2{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-3{list-style-type:none}ul.lst-kix_4m04az9jmmj8-1{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-4{list-style-type:none}ul.lst-kix_4m04az9jmmj8-0{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-5{list-style-type:none}ul.lst-kix_4m04az9jmmj8-7{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-6{list-style-type:none}ul.lst-kix_4m04az9jmmj8-6{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-7{list-style-type:none}ul.lst-kix_4m04az9jmmj8-5{list-style-type:none}ul.lst-kix_j42a5dwgnqyq-8{list-style-type:none}ul.lst-kix_4m04az9jmmj8-4{list-style-type:none}ul.lst-kix_4m04az9jmmj8-8{list-style-type:none}ul.lst-kix_bijol4nzhwf0-4{list-style-type:none}.lst-kix_s3mi7ukxwiwf-2>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-2}ul.lst-kix_bijol4nzhwf0-5{list-style-type:none}ul.lst-kix_bijol4nzhwf0-6{list-style-type:none}ul.lst-kix_bijol4nzhwf0-7{list-style-type:none}ul.lst-kix_bijol4nzhwf0-0{list-style-type:none}ul.lst-kix_bijol4nzhwf0-1{list-style-type:none}ul.lst-kix_bijol4nzhwf0-2{list-style-type:none}ul.lst-kix_bijol4nzhwf0-3{list-style-type:none}.lst-kix_1wulu3ra2vwv-2>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-2}.lst-kix_q8ok0mh9yyto-4>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-4}.lst-kix_bijol4nzhwf0-7>li:before{content:"\0025cb "}.lst-kix_bijol4nzhwf0-6>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-8>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-5>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-3>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-2>li:before{content:"\0025a0 "}.lst-kix_bijol4nzhwf0-4>li:before{content:"\0025cb "}ol.lst-kix_emhp84jkv42c-4.start{counter-reset:lst-ctn-kix_emhp84jkv42c-4 0}ol.lst-kix_xv318blpjdo-8.start{counter-reset:lst-ctn-kix_xv318blpjdo-8 0}.lst-kix_q8ok0mh9yyto-8>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-8}ol.lst-kix_q8ok0mh9yyto-1.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-1 0}ol.lst-kix_s3mi7ukxwiwf-8.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-8 0}ol.lst-kix_s3mi7ukxwiwf-1.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-1 0}.lst-kix_bijol4nzhwf0-0>li:before{content:"\0025cf "}.lst-kix_bijol4nzhwf0-1>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-1>li{counter-increment:lst-ctn-kix_xv318blpjdo-1}ul.lst-kix_gfromclascha-0{list-style-type:none}ol.lst-kix_emhp84jkv42c-2.start{counter-reset:lst-ctn-kix_emhp84jkv42c-2 0}.lst-kix_s3mi7ukxwiwf-1>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-1,lower-latin) ". "}.lst-kix_gfromclascha-0>li:before{content:"\0025cf "}.lst-kix_gfromclascha-2>li:before{content:"\0025a0 "}.lst-kix_gfromclascha-4>li:before{content:"\0025cb "}ul.lst-kix_gfromclascha-7{list-style-type:none}ul.lst-kix_gfromclascha-8{list-style-type:none}ul.lst-kix_gfromclascha-5{list-style-type:none}.lst-kix_gfromclascha-6>li:before{content:"\0025cf "}ul.lst-kix_gfromclascha-6{list-style-type:none}ul.lst-kix_gfromclascha-3{list-style-type:none}ul.lst-kix_gfromclascha-4{list-style-type:none}ul.lst-kix_gfromclascha-1{list-style-type:none}ul.lst-kix_gfromclascha-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-3{list-style-type:none}ul.lst-kix_opi66v2qdsjs-2{list-style-type:none}ul.lst-kix_opi66v2qdsjs-1{list-style-type:none}ul.lst-kix_opi66v2qdsjs-0{list-style-type:none}.lst-kix_q97rvvc7c69e-5>li:before{content:"\0025a0 "}.lst-kix_q97rvvc7c69e-7>li:before{content:"\0025cb "}.lst-kix_q8ok0mh9yyto-0>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-0,upper-roman) ". "}ol.lst-kix_q8ok0mh9yyto-8.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-8 0}.lst-kix_fy6y7gyjejoh-3>li:before{content:"\0025cf "}ul.lst-kix_opi66v2qdsjs-8{list-style-type:none}.lst-kix_q97rvvc7c69e-3>li:before{content:"\0025cf "}ul.lst-kix_opi66v2qdsjs-7{list-style-type:none}ul.lst-kix_opi66v2qdsjs-6{list-style-type:none}ul.lst-kix_opi66v2qdsjs-5{list-style-type:none}.lst-kix_fy6y7gyjejoh-1>li:before{content:"\0025cb "}ul.lst-kix_opi66v2qdsjs-4{list-style-type:none}.lst-kix_s3mi7ukxwiwf-7>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-7,lower-latin) ". "}.lst-kix_xv318blpjdo-8>li{counter-increment:lst-ctn-kix_xv318blpjdo-8}.lst-kix_emhp84jkv42c-7>li{counter-increment:lst-ctn-kix_emhp84jkv42c-7}.lst-kix_s3mi7ukxwiwf-5>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-5,lower-roman) ". "}.lst-kix_fy6y7gyjejoh-7>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-1.start{counter-reset:lst-ctn-kix_xv318blpjdo-1 0}.lst-kix_fy6y7gyjejoh-5>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-3>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-3,decimal) ". "}.lst-kix_emhp84jkv42c-3>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-3,lower-latin) ") "}.lst-kix_emhp84jkv42c-5>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-5,lower-latin) ") "}.lst-kix_emhp84jkv42c-1>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-1,upper-latin) ". "}.lst-kix_emhp84jkv42c-7>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-7,lower-latin) ") "}.lst-kix_1wulu3ra2vwv-4>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-4,decimal) ") "}.lst-kix_1wulu3ra2vwv-6>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-6,lower-roman) ") "}.lst-kix_s3mi7ukxwiwf-6>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-6}.lst-kix_1wulu3ra2vwv-8>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-8,lower-roman) ") "}ol.lst-kix_1wulu3ra2vwv-4.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-4 0}.lst-kix_gfromclascha-8>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-1{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-0{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-1{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-2{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-6{list-style-type:none}.lst-kix_sholqrhc62dh-2>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-3{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-0{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-4{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-5{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-6{list-style-type:none}.lst-kix_sholqrhc62dh-4>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-2>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-2,decimal) ". "}ul.lst-kix_7tib3jrzu2u9-3{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-8{list-style-type:none}.lst-kix_1wulu3ra2vwv-0>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-0,upper-roman) ". "}ul.lst-kix_7tib3jrzu2u9-7{list-style-type:none}ul.lst-kix_7tib3jrzu2u9-8{list-style-type:none}.lst-kix_emhp84jkv42c-2>li{counter-increment:lst-ctn-kix_emhp84jkv42c-2}ol.lst-kix_s3mi7ukxwiwf-4.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-4 0}.lst-kix_xv318blpjdo-1>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-1,upper-latin) ". "}.lst-kix_xv318blpjdo-0>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-0,upper-roman) ". "}ol.lst-kix_1wulu3ra2vwv-7.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-7 0}.lst-kix_1wulu3ra2vwv-1>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-1}.lst-kix_jkgkf1u9sy0c-2>li:before{content:"\0025a0 "}.lst-kix_jkgkf1u9sy0c-1>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-0>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-8>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-8,lower-roman) ") "}.lst-kix_xv318blpjdo-5>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-5,lower-latin) ") "}.lst-kix_jkgkf1u9sy0c-5>li:before{content:"\0025a0 "}.lst-kix_686a8e4qhxwx-3>li:before{content:"\0025cf "}.lst-kix_jkgkf1u9sy0c-6>li:before{content:"\0025cf "}.lst-kix_686a8e4qhxwx-4>li:before{content:"\0025cb "}.lst-kix_emhp84jkv42c-4>li{counter-increment:lst-ctn-kix_emhp84jkv42c-4}.lst-kix_xv318blpjdo-4>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-4,decimal) ") "}.lst-kix_s3mi7ukxwiwf-7>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-7}.lst-kix_q97rvvc7c69e-2>li:before{content:"\0025a0 "}.lst-kix_q8ok0mh9yyto-3>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-3,lower-latin) ") "}.lst-kix_686a8e4qhxwx-8>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-6>li{counter-increment:lst-ctn-kix_emhp84jkv42c-6}.lst-kix_q8ok0mh9yyto-2>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-2,decimal) ". "}ol.lst-kix_1wulu3ra2vwv-6.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-6 0}.lst-kix_q8ok0mh9yyto-6>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-6,lower-roman) ") "}.lst-kix_4m04az9jmmj8-2>li:before{content:"\0025a0 "}.lst-kix_4m04az9jmmj8-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-7>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-7,lower-latin) ") "}.lst-kix_4m04az9jmmj8-1>li:before{content:"\0025cb "}.lst-kix_4m04az9jmmj8-5>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-4>li{counter-increment:lst-ctn-kix_xv318blpjdo-4}.lst-kix_s3mi7ukxwiwf-0>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-0,decimal) ". "}ul.lst-kix_q97rvvc7c69e-4{list-style-type:none}ul.lst-kix_q97rvvc7c69e-3{list-style-type:none}ul.lst-kix_q97rvvc7c69e-6{list-style-type:none}.lst-kix_s3mi7ukxwiwf-8>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-8,lower-roman) ". "}ul.lst-kix_q97rvvc7c69e-5{list-style-type:none}ul.lst-kix_q97rvvc7c69e-8{list-style-type:none}ul.lst-kix_q97rvvc7c69e-7{list-style-type:none}.lst-kix_6qnkx7t1adn9-4>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-8>li:before{content:"\0025a0 "}.lst-kix_gfromclascha-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-6>li{counter-increment:lst-ctn-kix_xv318blpjdo-6}ul.lst-kix_q97rvvc7c69e-0{list-style-type:none}ul.lst-kix_q97rvvc7c69e-2{list-style-type:none}ul.lst-kix_q97rvvc7c69e-1{list-style-type:none}.lst-kix_q97rvvc7c69e-6>li:before{content:"\0025cf "}ol.lst-kix_s3mi7ukxwiwf-3.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-3 0}.lst-kix_fy6y7gyjejoh-2>li:before{content:"\0025a0 "}.lst-kix_fy6y7gyjejoh-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-1>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-1}ol.lst-kix_1wulu3ra2vwv-8.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-8 0}.lst-kix_s3mi7ukxwiwf-4>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-4,lower-latin) ". "}.lst-kix_5anu1k9tsyak-2>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-6.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-6 0}.lst-kix_emhp84jkv42c-2>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-2,decimal) ". "}.lst-kix_emhp84jkv42c-6>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-6,lower-roman) ") "}.lst-kix_686a8e4qhxwx-0>li:before{content:"\0025cf "}.lst-kix_1wulu3ra2vwv-3>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-3,lower-latin) ") "}.lst-kix_9jxnjym0nges-3>li:before{content:"\0025cf "}.lst-kix_opi66v2qdsjs-7>li:before{content:"\0025cb "}.lst-kix_1wulu3ra2vwv-7>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-7,lower-latin) ") "}ol.lst-kix_s3mi7ukxwiwf-5.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-5 0}.lst-kix_opi66v2qdsjs-3>li:before{content:"\0025cf "}.lst-kix_1wulu3ra2vwv-6>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-6}.lst-kix_gfromclascha-7>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-5>li:before{content:"\0025a0 "}.lst-kix_9jxnjym0nges-7>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-1>li:before{content:"\0025cb "}.lst-kix_sholqrhc62dh-5>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-0>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-4>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-4}.lst-kix_7tib3jrzu2u9-4>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-4{list-style-type:none}ol.lst-kix_s3mi7ukxwiwf-7.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-7 0}ol.lst-kix_xv318blpjdo-5{list-style-type:none}ol.lst-kix_xv318blpjdo-6{list-style-type:none}ol.lst-kix_xv318blpjdo-7{list-style-type:none}ol.lst-kix_xv318blpjdo-0{list-style-type:none}ol.lst-kix_xv318blpjdo-1{list-style-type:none}.lst-kix_7tib3jrzu2u9-1>li:before{content:"\0025cb "}.lst-kix_7tib3jrzu2u9-5>li:before{content:"\0025a0 "}ol.lst-kix_xv318blpjdo-2{list-style-type:none}ol.lst-kix_xv318blpjdo-3{list-style-type:none}.lst-kix_q8ok0mh9yyto-6>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-6}.lst-kix_7tib3jrzu2u9-2>li:before{content:"\0025a0 "}.lst-kix_7tib3jrzu2u9-3>li:before{content:"\0025cf "}ul.lst-kix_5anu1k9tsyak-7{list-style-type:none}ul.lst-kix_5anu1k9tsyak-8{list-style-type:none}ul.lst-kix_5anu1k9tsyak-5{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-0{list-style-type:none}ul.lst-kix_5anu1k9tsyak-6{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-1{list-style-type:none}ul.lst-kix_5anu1k9tsyak-3{list-style-type:none}ul.lst-kix_5anu1k9tsyak-4{list-style-type:none}ul.lst-kix_5anu1k9tsyak-1{list-style-type:none}.lst-kix_xv318blpjdo-3>li{counter-increment:lst-ctn-kix_xv318blpjdo-3}ul.lst-kix_5anu1k9tsyak-2{list-style-type:none}.lst-kix_7tib3jrzu2u9-8>li:before{content:"\0025a0 "}ul.lst-kix_sholqrhc62dh-6{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-6{list-style-type:none}ul.lst-kix_5anu1k9tsyak-0{list-style-type:none}ul.lst-kix_sholqrhc62dh-5{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-7{list-style-type:none}ul.lst-kix_sholqrhc62dh-4{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-8{list-style-type:none}ul.lst-kix_sholqrhc62dh-3{list-style-type:none}.lst-kix_7tib3jrzu2u9-6>li:before{content:"\0025cf "}ol.lst-kix_xv318blpjdo-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-2{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-3{list-style-type:none}.lst-kix_7tib3jrzu2u9-7>li:before{content:"\0025cb "}ul.lst-kix_sholqrhc62dh-8{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-4{list-style-type:none}ul.lst-kix_sholqrhc62dh-7{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-5{list-style-type:none}ul.lst-kix_sholqrhc62dh-2{list-style-type:none}ul.lst-kix_sholqrhc62dh-1{list-style-type:none}ul.lst-kix_sholqrhc62dh-0{list-style-type:none}.lst-kix_emhp84jkv42c-1>li{counter-increment:lst-ctn-kix_emhp84jkv42c-1}ol.lst-kix_1wulu3ra2vwv-5.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-5 0}.lst-kix_j42a5dwgnqyq-8>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-2.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-2 0}.lst-kix_5anu1k9tsyak-7>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-6>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-6>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-7>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-2.start{counter-reset:lst-ctn-kix_xv318blpjdo-2 0}.lst-kix_1wulu3ra2vwv-4>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-4}.lst-kix_5anu1k9tsyak-8>li:before{content:"\0025a0 "}ol.lst-kix_s3mi7ukxwiwf-2.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-2 0}ul.lst-kix_686a8e4qhxwx-4{list-style-type:none}ul.lst-kix_686a8e4qhxwx-3{list-style-type:none}ul.lst-kix_686a8e4qhxwx-2{list-style-type:none}.lst-kix_q8ok0mh9yyto-2>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-2}ul.lst-kix_686a8e4qhxwx-1{list-style-type:none}ul.lst-kix_686a8e4qhxwx-8{list-style-type:none}ul.lst-kix_686a8e4qhxwx-7{list-style-type:none}ul.lst-kix_686a8e4qhxwx-6{list-style-type:none}.lst-kix_6qnkx7t1adn9-0>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-5{list-style-type:none}.lst-kix_6qnkx7t1adn9-1>li:before{content:"\0025cb "}.lst-kix_6qnkx7t1adn9-3>li:before{content:"\0025cf "}ul.lst-kix_686a8e4qhxwx-0{list-style-type:none}.lst-kix_6qnkx7t1adn9-2>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-0>li:before{content:"\0025cf "}.lst-kix_j42a5dwgnqyq-2>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-1>li:before{content:"\0025cb "}.lst-kix_j42a5dwgnqyq-5>li:before{content:"\0025a0 "}.lst-kix_j42a5dwgnqyq-4>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-0.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-0 0}ol.lst-kix_q8ok0mh9yyto-7.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-7 0}ol.lst-kix_emhp84jkv42c-3.start{counter-reset:lst-ctn-kix_emhp84jkv42c-3 0}.lst-kix_j42a5dwgnqyq-3>li:before{content:"\0025cf "}.lst-kix_emhp84jkv42c-8>li{counter-increment:lst-ctn-kix_emhp84jkv42c-8}ol.lst-kix_1wulu3ra2vwv-3.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-3 0}ol.lst-kix_q8ok0mh9yyto-0.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-0 0}.lst-kix_6qnkx7t1adn9-5>li:before{content:"\0025a0 "}.lst-kix_6qnkx7t1adn9-7>li:before{content:"\0025cb "}ol.lst-kix_s3mi7ukxwiwf-0.start{counter-reset:lst-ctn-kix_s3mi7ukxwiwf-0 0}.lst-kix_86hsx13ssqid-8>li:before{content:"\0025a0 "}.lst-kix_s3mi7ukxwiwf-0>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-0}.lst-kix_5anu1k9tsyak-3>li:before{content:"\0025cf "}.lst-kix_5anu1k9tsyak-5>li:before{content:"\0025a0 "}.lst-kix_1wulu3ra2vwv-8>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-8}.lst-kix_5anu1k9tsyak-1>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-6{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-5{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-3{list-style-type:none}.lst-kix_9jxnjym0nges-0>li:before{content:"\0025cf "}ol.lst-kix_q8ok0mh9yyto-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-7{list-style-type:none}ol.lst-kix_emhp84jkv42c-0.start{counter-reset:lst-ctn-kix_emhp84jkv42c-0 0}.lst-kix_opi66v2qdsjs-8>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-2{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-1{list-style-type:none}.lst-kix_9jxnjym0nges-2>li:before{content:"\0025a0 "}ol.lst-kix_q8ok0mh9yyto-0{list-style-type:none}.lst-kix_opi66v2qdsjs-4>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-2>li:before{content:"\0025a0 "}.lst-kix_opi66v2qdsjs-6>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-3>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-3}.lst-kix_1wulu3ra2vwv-3>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-3}.lst-kix_86hsx13ssqid-0>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-6>li:before{content:"\0025cf "}.lst-kix_9jxnjym0nges-4>li:before{content:"\0025cb "}.lst-kix_9jxnjym0nges-8>li:before{content:"\0025a0 "}.lst-kix_86hsx13ssqid-4>li:before{content:"\0025cb "}.lst-kix_9jxnjym0nges-6>li:before{content:"\0025cf "}.lst-kix_86hsx13ssqid-2>li:before{content:"\0025a0 "}ul.lst-kix_9jxnjym0nges-2{list-style-type:none}.lst-kix_xv318blpjdo-2>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-2,decimal) ". "}ul.lst-kix_9jxnjym0nges-1{list-style-type:none}ul.lst-kix_9jxnjym0nges-4{list-style-type:none}ul.lst-kix_9jxnjym0nges-3{list-style-type:none}ul.lst-kix_9jxnjym0nges-6{list-style-type:none}ul.lst-kix_9jxnjym0nges-5{list-style-type:none}ul.lst-kix_9jxnjym0nges-8{list-style-type:none}ul.lst-kix_9jxnjym0nges-7{list-style-type:none}.lst-kix_xv318blpjdo-2>li{counter-increment:lst-ctn-kix_xv318blpjdo-2}.lst-kix_s3mi7ukxwiwf-3>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-3}ol.lst-kix_xv318blpjdo-0.start{counter-reset:lst-ctn-kix_xv318blpjdo-0 0}.lst-kix_jkgkf1u9sy0c-0>li:before{content:"\0025cf "}.lst-kix_jkgkf1u9sy0c-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-0>li{counter-increment:lst-ctn-kix_xv318blpjdo-0}ol.lst-kix_emhp84jkv42c-1.start{counter-reset:lst-ctn-kix_emhp84jkv42c-1 0}.lst-kix_jkgkf1u9sy0c-4>li:before{content:"\0025cb "}ol.lst-kix_1wulu3ra2vwv-2.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-2 0}.lst-kix_686a8e4qhxwx-6>li:before{content:"\0025cf "}.lst-kix_s3mi7ukxwiwf-5>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-5}.lst-kix_jkgkf1u9sy0c-7>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-7>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-7,lower-latin) ") "}.lst-kix_686a8e4qhxwx-5>li:before{content:"\0025a0 "}.lst-kix_xv318blpjdo-6>li:before{content:"(" counter(lst-ctn-kix_xv318blpjdo-6,lower-roman) ") "}.lst-kix_q8ok0mh9yyto-7>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-7}ul.lst-kix_86hsx13ssqid-3{list-style-type:none}ul.lst-kix_86hsx13ssqid-2{list-style-type:none}.lst-kix_xv318blpjdo-3>li:before{content:"" counter(lst-ctn-kix_xv318blpjdo-3,lower-latin) ") "}ul.lst-kix_86hsx13ssqid-5{list-style-type:none}ul.lst-kix_86hsx13ssqid-4{list-style-type:none}.lst-kix_686a8e4qhxwx-1>li:before{content:"\0025cb "}ul.lst-kix_86hsx13ssqid-1{list-style-type:none}.lst-kix_jkgkf1u9sy0c-8>li:before{content:"\0025a0 "}ul.lst-kix_86hsx13ssqid-0{list-style-type:none}.lst-kix_686a8e4qhxwx-2>li:before{content:"\0025a0 "}ul.lst-kix_fy6y7gyjejoh-0{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-1{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-2{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-3{list-style-type:none}ul.lst-kix_86hsx13ssqid-7{list-style-type:none}ul.lst-kix_86hsx13ssqid-6{list-style-type:none}ul.lst-kix_86hsx13ssqid-8{list-style-type:none}.lst-kix_4m04az9jmmj8-8>li:before{content:"\0025a0 "}ul.lst-kix_fy6y7gyjejoh-8{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-4{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-5{list-style-type:none}.lst-kix_4m04az9jmmj8-7>li:before{content:"\0025cb "}ul.lst-kix_fy6y7gyjejoh-6{list-style-type:none}ul.lst-kix_fy6y7gyjejoh-7{list-style-type:none}ol.lst-kix_1wulu3ra2vwv-1.start{counter-reset:lst-ctn-kix_1wulu3ra2vwv-1 0}.lst-kix_q97rvvc7c69e-1>li:before{content:"\0025cb "}.lst-kix_q97rvvc7c69e-0>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-1>li:before{content:"" counter(lst-ctn-kix_q8ok0mh9yyto-1,upper-latin) ". "}.lst-kix_4m04az9jmmj8-0>li:before{content:"\0025cf "}.lst-kix_q8ok0mh9yyto-4>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-4,decimal) ") "}.lst-kix_emhp84jkv42c-0>li{counter-increment:lst-ctn-kix_emhp84jkv42c-0}.lst-kix_q8ok0mh9yyto-5>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-5,lower-latin) ") "}.lst-kix_q8ok0mh9yyto-5>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-5}.lst-kix_4m04az9jmmj8-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-1>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-1}.lst-kix_q8ok0mh9yyto-8>li:before{content:"(" counter(lst-ctn-kix_q8ok0mh9yyto-8,lower-roman) ") "}.lst-kix_4m04az9jmmj8-3>li:before{content:"\0025cf "}.lst-kix_xv318blpjdo-7>li{counter-increment:lst-ctn-kix_xv318blpjdo-7}ol.lst-kix_emhp84jkv42c-5.start{counter-reset:lst-ctn-kix_emhp84jkv42c-5 0}ol.lst-kix_xv318blpjdo-7.start{counter-reset:lst-ctn-kix_xv318blpjdo-7 0}.lst-kix_gfromclascha-1>li:before{content:"\0025cb "}.lst-kix_86hsx13ssqid-7>li:before{content:"\0025cb "}.lst-kix_q8ok0mh9yyto-0>li{counter-increment:lst-ctn-kix_q8ok0mh9yyto-0}ol.lst-kix_q8ok0mh9yyto-3.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-3 0}.lst-kix_1wulu3ra2vwv-7>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-7}.lst-kix_6qnkx7t1adn9-6>li:before{content:"\0025cf "}.lst-kix_gfromclascha-5>li:before{content:"\0025a0 "}.lst-kix_fy6y7gyjejoh-0>li:before{content:"\0025cf "}ol.lst-kix_emhp84jkv42c-8.start{counter-reset:lst-ctn-kix_emhp84jkv42c-8 0}ol.lst-kix_q8ok0mh9yyto-6.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-6 0}.lst-kix_q97rvvc7c69e-4>li:before{content:"\0025cb "}.lst-kix_xv318blpjdo-5>li{counter-increment:lst-ctn-kix_xv318blpjdo-5}.lst-kix_5anu1k9tsyak-4>li:before{content:"\0025cb "}.lst-kix_s3mi7ukxwiwf-8>li{counter-increment:lst-ctn-kix_s3mi7ukxwiwf-8}.lst-kix_s3mi7ukxwiwf-6>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-6,decimal) ". "}.lst-kix_fy6y7gyjejoh-8>li:before{content:"\0025a0 "}.lst-kix_1wulu3ra2vwv-5>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-5}.lst-kix_5anu1k9tsyak-0>li:before{content:"\0025cf "}.lst-kix_fy6y7gyjejoh-4>li:before{content:"\0025cb "}ol.lst-kix_xv318blpjdo-4.start{counter-reset:lst-ctn-kix_xv318blpjdo-4 0}.lst-kix_s3mi7ukxwiwf-2>li:before{content:"" counter(lst-ctn-kix_s3mi7ukxwiwf-2,lower-roman) ". "}.lst-kix_q97rvvc7c69e-8>li:before{content:"\0025a0 "}.lst-kix_emhp84jkv42c-4>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-4,decimal) ") "}.lst-kix_emhp84jkv42c-5>li{counter-increment:lst-ctn-kix_emhp84jkv42c-5}ol.lst-kix_xv318blpjdo-5.start{counter-reset:lst-ctn-kix_xv318blpjdo-5 0}.lst-kix_emhp84jkv42c-0>li:before{content:"" counter(lst-ctn-kix_emhp84jkv42c-0,upper-roman) ". "}.lst-kix_emhp84jkv42c-8>li:before{content:"(" counter(lst-ctn-kix_emhp84jkv42c-8,lower-roman) ") "}.lst-kix_9jxnjym0nges-1>li:before{content:"\0025cb "}ol.lst-kix_q8ok0mh9yyto-5.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-5 0}.lst-kix_1wulu3ra2vwv-5>li:before{content:"(" counter(lst-ctn-kix_1wulu3ra2vwv-5,lower-latin) ") "}.lst-kix_opi66v2qdsjs-1>li:before{content:"\0025cb "}.lst-kix_opi66v2qdsjs-5>li:before{content:"\0025a0 "}ol.lst-kix_emhp84jkv42c-7.start{counter-reset:lst-ctn-kix_emhp84jkv42c-7 0}ul.lst-kix_jkgkf1u9sy0c-4{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-5{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-6{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-7{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-8{list-style-type:none}ol.lst-kix_xv318blpjdo-6.start{counter-reset:lst-ctn-kix_xv318blpjdo-6 0}.lst-kix_1wulu3ra2vwv-0>li{counter-increment:lst-ctn-kix_1wulu3ra2vwv-0}ol.lst-kix_emhp84jkv42c-6.start{counter-reset:lst-ctn-kix_emhp84jkv42c-6 0}.lst-kix_9jxnjym0nges-5>li:before{content:"\0025a0 "}ul.lst-kix_6qnkx7t1adn9-8{list-style-type:none}ol.lst-kix_q8ok0mh9yyto-4.start{counter-reset:lst-ctn-kix_q8ok0mh9yyto-4 0}ul.lst-kix_6qnkx7t1adn9-7{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-6{list-style-type:none}.lst-kix_86hsx13ssqid-3>li:before{content:"\0025cf "}ul.lst-kix_6qnkx7t1adn9-5{list-style-type:none}.lst-kix_sholqrhc62dh-3>li:before{content:"\0025cf "}ul.lst-kix_6qnkx7t1adn9-4{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-3{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-0{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-2{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-1{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-1{list-style-type:none}.lst-kix_1wulu3ra2vwv-1>li:before{content:"" counter(lst-ctn-kix_1wulu3ra2vwv-1,upper-latin) ". "}ul.lst-kix_jkgkf1u9sy0c-2{list-style-type:none}ul.lst-kix_6qnkx7t1adn9-0{list-style-type:none}ul.lst-kix_jkgkf1u9sy0c-3{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c22{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:270pt;border-top-color:#000000;border-bottom-style:solid}.c20{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:105.8pt;border-top-color:#000000;border-bottom-style:solid}.c19{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:92.2pt;border-top-color:#000000;border-bottom-style:solid}.c17{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:468pt;border-top-color:#000000;border-bottom-style:solid}.c12{color:#695d46;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:14pt;font-family:"PT Sans Narrow";font-style:normal}.c1{color:#695d46;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Open Sans";font-style:normal}.c29{padding-top:8pt;padding-bottom:0pt;line-height:1.2;page-break-after:avoid;orphans:2;widows:2}.c27{padding-top:16pt;padding-bottom:0pt;line-height:1.0;orphans:2;widows:2}.c31{padding-top:0pt;padding-bottom:0pt;line-height:1.2;orphans:2;widows:2}.c33{text-decoration:none;vertical-align:baseline;font-size:11pt;font-style:normal}.c11{font-size:18pt;font-family:"PT Sans Narrow";color:#ff5e0e;font-weight:700}.c0{margin-left:72pt;border-spacing:0;border-collapse:collapse;margin-right:auto}.c18{margin-left:36pt;border-spacing:0;border-collapse:collapse;margin-right:auto}.c21{font-size:42pt;font-family:"PT Sans Narrow";color:#695d46;font-weight:700}.c30{border-spacing:0;border-collapse:collapse;margin-right:auto}.c6{padding-top:24pt;padding-bottom:0pt;line-height:1.3;page-break-after:avoid}.c4{padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c7{padding-top:6pt;line-height:1.2;orphans:2;widows:2}.c14{font-size:11pt;font-family:"Trebuchet MS";text-decoration:underline}.c16{font-family:"Open Sans";color:#1155cc;text-decoration:underline}.c24{color:inherit;text-decoration:inherit}.c25{padding-bottom:0pt;text-align:left}.c10{margin-left:36pt;padding-left:0pt}.c9{padding:0;margin:0}.c28{max-width:468pt;padding:72pt 72pt 72pt 72pt}.c15{margin-left:72pt;padding-left:0pt}.c32{orphans:2;widows:2}.c13{color:#008575;font-family:"PT Sans Narrow"}.c2{color:#695d46;font-family:"Open Sans"}.c8{height:11pt}.c5{height:0pt}.c3{background-color:#ffffff}.c23{font-size:12pt}.c26{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left} 

Oracle Fusion Middleware Deployments Using Docker Swarm


This is the first in a series of blogs that describe how to build a Fusion Middleware (FMW) Cluster that runs as a number of Docker images that run in docker containers.  These containers are coordinated using Docker Swarm and can be deployed to a single host machine or multiple hosts.  This simplifies the task of building FMW clusters and also makes it easier to scale them in and out (adding or subtracting host machines) as well as up and down (using bigger or smaller host machines).

This blog uses Oracle Service Bus as an FMW product but the principles are applicable to other FMW products.

In this entry we will explain the concepts of using Docker Swarm 1.12 to create a Fusion Middleware Cluster.  We will explain how to set up a minimal Linux machine to run a docker engine and prepare it to start building out a Fusion Middleware Cluster running on Swarm.  In future entries we will cover creating a database docker image that we will use to support Fusion Middleware.  Other entries will explain how to create a docker image to run Fusion Middleware and create a cluster in swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

  1. Create FMW Cluster 12.2 that runs on Docker Swarm 1.12
  2. User Swarm to support scaling in/out of the FMW cluster.

FMW deployments can be complex to setup and configure.  The Enterprise Deployment Guide for SOA Suite 12.2.1 has a lots of steps to follow within its 382 pages.  This is taken care of for you when you subscribe to FMW on the cloud, such as Oracle SOA Cloud Service.  However many companies still run their FMW deployments in on premise systems and are not yet ready to move to the Oracle Cloud Machine, which provides a private cloud environment that looks just like the public cloud.

Docker provides a lightweight container in which to run software.  Multiple docker images can be coordinated by Docker Swarm to form a cluster.  Each image runs in a docker container which virtualizes the resources used by the image, making it possible for multiple images to execute on a single machines or for images to to be distributed across multiple machines.  In either case Swarm helps to manage the cluster of machines.

There are a number of blog entries that explain how to use FMW with docker but most of them only use the developer install, which can run in a single docker image.  A more normal FMW installation has a separate database and multiple managed servers.  There a few blog entries that describe using this, but they use old versions of docker and there are now better ways of implementing this.  We use the latest versions of docker and swarm to show to create FMW clusters running on docker swarm in a configuration that is production ready.

Over this and the next few blog entries I have partnered with my colleague Shuxuan Nie to describe how to run a highly FMW deployment on top of Docker.  We have used Oracle Service Bus as an example FMW deployment but the principles can be applied to any FMW deployment.

AuthorsShuxuan ‘Judy’ Nie029.JPG

Holding a masters degree in computer science from Beijing University of Aeronautics and Astronautics Shuxuan Nie is a senior principal devops engineer working on Oracle's forthcoming Adaptive Intelligence Applications Cloud Service (AIA).  Prior to joining Oracle, Shuxuan worked as a systems architect at Australian based Oracle partner Rubicon Red.  There she specialized in helping customers build highly available FMW environments on both physical hardware and VMs.  She also contributed to Rubicon Reds Myst platform provisioning and continuous delivery tool.  In her current position she works with Oracle Container Cloud Service (which provides docker in the cloud) to provide deployment environments for the AIA cloud service.

Antony ReynoldsIMG_7082.JPG

A graduate of Bristol University Antony Reynolds is a Product Strategy Director in Oracle’sIntegration Products group where he works with Oracle Integration Cloud Service (ICS).  In addition to working with ICS he also helps customers upgrade to the latest SOA Suite releases, working closely with some of the largest users of SOA Suite in the world.  A blogger and author of several books on Oracle SOA Suite Antony was attracted to Docker by its lightweight container model and power of abstraction.


FMW and WebLogic rely on a database and an Admin Server.  This leads us to require the following Docker images to implement FMW on Docker.  Each docker image runs in its own docker container.  The beauty of Docker is that these images can be deployed together on a single machine or distributed across multiple machines without any changes to their configuration.

Docker Containers for FMW Cluster

We could deploy all the images on a single machine as shown below.

Docker Containers Running FMW on a Single Powerful Machine

Alternatively we can distribute them across several machines.

Docker Containers Running FMW on Multiple Machines

Of course we could choose a combination of the two.

Docker Containers Running FMW on Multiple Machines, some Running Multiple Containers

Note that from the docker images perspective each thinks it is running in its own physical machine, although it is actually running in a docker container on a physical or virtual machines and may be sharing that machine with other running docker images.

Initially we deployed all the images to containers on a single machine, once we had that working then we deployed our images to multiple machines.

Docker & Swarm for FMW People

We are used to running FMW on multiple virtual machines.  This is used extensively on Oracle Exalogic for example, as well as the large number of customers who run FMW on Oracle Virtual Machine (OVM) or Dell’s VMWare.  The problem with VMs is that each virtual machine has a whole operating system that is running on top of the VM hypervisor.  This includes the kernel and file system which makes a VM a relatively heavyweight container.

In contrast to a Virtual Machine a Docker Container just abstracts the CPU, memory, network and file system of the underlying operating system.  It does not run a separate kernel, instead deferring most of the execution to the underlying machine,m physical or virtual.  This results in a lighter weight container that still has the benefits of isolation and abstraction that a VM provides.  This is why people are excited about using docker containers to host services, particularly micro services, that would be too expensive to dedicate a VM to.

A docker image is a specific set of binaries and configuration that is targeted to run inside a docker container.  This could be an Oracle database, a WebLogic managed server or a WebLogic admin server.

So let's translate FMW / WebLogic deployment terms onto docker concepts.  Note that this is a conceptual mapping, but is not an exact equivalent.

FMW ConceptDocker ConceptNotes


Docker Engine

Docker engine can run multiple docker containers on a single host.


Swarm Cluster

Docker swarm clusters can be used to run multiple instances of an image, providing a great platform to run an FMW cluster on top of.

Node Manager

Swarm Manager

Manages the swarm cluster and decides on which docker engine to run a particular container.  Note that this function is split between Weblogic Console and Node Manager in WebLogic.

Binaries and Domain Configuration

Docker Image

A docker image represents a set of code and associated configuration packaged up for execution in a docker container.

Managed WebLogic Server in a Cluster

Swarm Service

A swarm service is a generic service.  A WebLogic Admin Server would be a Swarm Service with a single instance.  A Managed Server would be a Swarm Service that allowed multiple instances.

Note that although FMW allows multiple servers to be targeted at a single machine, docker achieves this through two level, a docker container runs a single server, but a docker engine can run multiple containers..  This is not as limiting as it sounds because a docker container is much lighter than a VM and so it is easy to run multiple docker containers on a docker engine running on a single VM or physical machine with minimal overhead on top of the requirements of the WebLogic server.

FMW for Docker People

Oracle Fusion Middleware is the name for Oracle’s middleware products.  These are powerful proprietary middleware products that are used by customers throughout the world to; run applications and portals, integrate systems, provide business analytics and secure their environments, amongst other things.

Although many of these products are available in free developer editions they still require acknowledgement of the Oracle license and as such cannot be distributed as part of a docker image.  These products can also be large, often requiring several gigabytes of download before being installed.  These factors when combined have led Oracle and others to provide dockerfiles to create docker images that install and configure Oracle products into provided base images.  The software to be installed must be provided separately from the dockerfiles.  The created docker images can then stored in a company specific docker repository.  These docker images can then be used in the same way as any other docker image.  This is the approach that will be followed in this document.

Base VM Image

We built on a headless and minimum rpm installed Oracle Enterprise Linux 7 VM that has a download footprint of only 1GB.  The instructions provided are applicable to other OEL 7 and RHEL 7 environments.  With minimal changes the same instructions should also apply to other Linux releases such as Ubuntu.  The image is configured and set up with a docker environment.

The VM is used as our base platform to run docker.

Downloading VM

Because of licensing restrictions we are unable to provide a VM for download.  However if you are an Oracle employee then please contact us and we will point you at a downloadable image.

Image Pre-Requisites

If you don’t use the provided image then the following is needed of an OEL 7 image.

  • As root run yum util to enable UEKR4 and addons in yum repo

yum -y install yum-utils

yum-config-manager --enable ol7_addons

yum-config-manager --enable ol7_UEKR4

yum-config-manager --disable ol7_UEKR3_latest

  • Install 4.x kernel and reboot the system, selecting the UEK R4 kernel if this is not the default boot kernel

yum update

systemctl reboot

  • Install minimum required packages

yum install wget unzip net-tools

  • Provide btrfs file system as storage driver used by docker instead of default device mapper.  We will refer to the root of the btrfs file system as /var/lib/docker
  • Use yum to install btrfs-progs package

root@docker-base ~]# yum install btrfs-progs

  • Create btrfs file system on the device, such as /dev/sdb in this example.

root@docker-base ~]# mkfs.btrfs /dev/sdb

  • Display UUID of the device via blkid command

[root@docker-base ~]# blkid /dev/sdb

/dev/sdb: UUID="fe6bf7a2-34fc-4800-af2b-da19d2d8db6d" UUID_SUB="e955087d-80b5-4051-bb28-ed71edb9cea4" TYPE="btrfs"

  • Create the config file /etc/systemd/system/var-lib-docker.mount with below content, replace your UUID value:


Description = Docker Image Store


What = UUID=<Your UUID Value>

Where = /var/lib/docker

Type = btrfs


WantedBy =

  • The above file defines systemd users to mount the file system on /var/lib/docker, need to create this folder if this is the fresh installation

[root@docker-base ~]# mkdir /var/lib/docker

  • Enable var-lib-docker.mount target and mount the file system

[root@docker-base ~]# systemctl enable var-lib-docker.mount

[root@docker-base ~]# systemctl start var-lib-docker.mount

  • Create the  /etc/systemd/system/docker.service.d/var-lib-docker-mount.conf to tell systemd to mount the /var/lib/docker file system by using the var-lib-docker.mount target before starting the docker service




  • Set the SELinux mode to permissive or disable SELinux. In this demo, we disable SELinux in /etc/selinux/config.  We do this to avoid having to configure selinux policies to run docker.  Your Linux security team may require you to set up an appropriate policy.

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.


# SELINUXTYPE= can take one of three two values:

#     targeted - Targeted processes are protected,

#     minimum - Modification of targeted policy. Only selected processes are protected.

#     mls - Multi Level Security protection.


                The above change requires to reboot the system

[root@docker-base ~]# systemctl reboot

  • Install docker engine, in our demo we install latest version 1.12

[root@docker-base ~]# yum install docker-engine

  • Start docker service and set to auto start

[root@docker-base ~]# systemctl start docker

[root@docker-base ~]# systemctl enable docker

  • Check docker running status

[root@docker-base ~]# systemctl status docker

● docker.service - Docker Application Container Engine

   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)

  Drop-In: /etc/systemd/system/docker.service.d

           └─docker-network.conf, docker-sysconfig.conf, http-proxy.conf, var-lib-docker-mount.conf

   Active: active (running) since Sun 2017-01-08 12:16:38 PST; 52min ago


 Main PID: 871 (dockerd)

   Memory: 64.7M

   CGroup: /system.slice/docker.service

           ├─ 871 dockerd --selinux-enabled

           └─1020 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0...

  • Display docker information, you can verify the version and btrfs storage driver

[root@docker-base ~]# docker info

Containers: 0

 Running: 0

 Paused: 0

 Stopped: 0

Images: 0

Server Version: 1.12.2

Storage Driver: btrfs

 Build Version: Btrfs v3.19.1

 Library Version: 101

Logging Driver: json-file

Cgroup Driver: cgroupfs


 Volume: local

 Network: null host bridge overlay

Swarm: inactive

Runtimes: runc

Default Runtime: runc

Security Options: seccomp

Kernel Version: 4.1.12-61.1.24.el7uek.x86_64

Operating System: Oracle Linux Server 7.3

OSType: linux

Architecture: x86_64

CPUs: 1

Total Memory: 4.133 GiB



Docker Root Dir: /var/lib/docker

Debug Mode (client): false

Debug Mode (server): false


Insecure Registries:

  • Create oracle user
  • useradd oracle
  • Add oracle user to docker group
  • usermod -a -G docker oracle

In this entry we have introduced the concept of using Docker Swarm 1.12 to create a Fusion Middleware Cluster.  We have explained how to set up a minimal Linux machine to run a docker engine and prepared it to start building out a Fusion Middleware Cluster running on Swarm.  In our next entry we will cover creating a database docker image that we will use in later entries to support Fusion Middleware.  Later entries will explain how to install Fusion Middleware and create a cluster in swarm mode by defining swarm services for the database, WebLogic Admin Server and WebLogic managed servers.

Slicing the EDG

Tue, 2014-08-19 21:24
Different SOA Domain Configurations

In this blog entry I would like to introduce three different configurations for a SOA environment.  I have omitted load balancers and OTD/OHS as they introduce a whole new round of discussion.  For each possible deployment architecture I have identified some of the advantages.

Super Domain

This is a single EDG style domain for everything needed for SOA/OSB.   It extends the standard EDG slightly but otherwise assumes a single “super” domain.

This is basically the SOA EDG.  I have broken out JMS servers and Coherence servers to improve scalability and reduce dependencies. Key Points

  • Separate JMS allows those servers to be kept up separately from rest of SOA Domain, allowing JMS clients to post messages even if rest of domain is unavailable.
  • JMS servers are only used to host application specific JMS destinations, SOA/OSB JMS destinations remain in relevant SOA/OSB managed servers.
  • Separate Coherence servers allow OSB cache to be offloaded from OSB servers.
  • Use of Coherence by other components as a shared infrastructure data grid service.
  • Coherence cluster may be managed by WLS but more likely run as a standalone Coherence cluster.
  • Single Administration Point (1 Admin Server)
  • Closely follows EDG with addition of application specific JMS servers and standalone Coherence servers for OSB caching and application specific caches.
  • Coherence grid can be scaled independent of OSB/SOA.
  • JMS queues provide for inter-application communication.
  • Patching is an all or nothing affair.
  • Startup time for SOA may be slow if large number of composites deployed.
Multiple Domains

This extends the EDG into multiple domains, allowing separate management and update of these domains.  I see this type of configuration quite often with customers, although some don't have OWSM, others don't have separate Coherence etc.

SOA & BAM are kept in the same domain as little benefit is obtained by separating them. Key Points

  • Separate JMS allows those servers to be kept up separately from rest of SOA Domain, allowing JMS clients to post messages even if other domains are unavailable.
  • JMS servers are only used to host application specific JMS destinations, SOA/OSB JMS destinations remain in relevant SOA/OSB managed servers.
  • Separate Coherence servers allow OSB cache to be offloaded from OSB servers.
  • Use of Coherence by other components as a shared infrastructure data grid service.
  • Coherence cluster may be managed by WLS but more likely run as a standalone Coherence cluster.
  • Follows EDG but in separate domains and with addition of application specific JMS servers and standalone Coherence servers for OSB caching and application specific caches.
  • Coherence grid can be scaled independent of OSB/SOA.
  • JMS queues provide for inter-application communication.
  • Patch lifecycle of OSB/SOA/JMS are no longer lock stepped.
  • JMS may be kept running independently of other domains allowing applications to insert messages fro later consumption by SOA/OSB.
  • OSB may be kept running independent of other domains, allowing service virtualization to continue independent of other domains availability.
  • All domains use same OWSM policy store (MDS-WSM).
  • Multiple domains to manage and configure.
  • Multiple Admin servers (single view requires use of Grid Control)
  • Multiple Admin servers/WSM clusters waste resources.
  • Additional homes needed to enjoy benefits of separate patching.
  • Cross domain trust needs setting up to simplify cross domain interactions.
  • Startup time for SOA may be slow if large number of composites deployed.
Shared Service Environment

This model extends the previous multiple domain arrangement to provide a true shared service environment.

This extends the previous model by allowing multiple additional SOA domains and/or other domains to take advantage of the shared services.  Only one non-shared domain is shown, but there could be multiple, allowing groups of applications to share patching independent of other application groups. Key Points

  • Separate JMS allows those servers to be kept up separately from rest of SOA Domain, allowing JMS clients to post messages even if other domains are unavailable.
  • JMS servers are only used to host application specific JMS destinations, SOA/OSB JMS destinations remain in relevant SOA/OSB managed servers.
  • Separate Coherence servers allow OSB cache to be offloaded from OSB servers.
  • Use of Coherence by other components as a shared infrastructure data grid service
  • Coherence cluster may be managed by WLS but more likely run as a standalone Coherence cluster.
  • Shared SOA Domain hosts
    • Human Workflow Tasks
    • BAM
    • Common "utility" composites
  • Single OSB domain provides "Enterprise Service Bus"
  • All domains use same OWSM policy store (MDS-WSM)
  • Follows EDG but in separate domains and with addition of application specific JMS servers and standalone Coherence servers for OSB caching and application specific caches.
  • Coherence grid can be scaled independent of OSB/SOA.
  • JMS queues provide for inter-application communication.
  • Patch lifecycle of OSB/SOA/JMS are no longer lock stepped.
  • JMS may be kept running independently of other domains allowing applications to insert messages fro later consumption by SOA/OSB.
  • OSB may be kept running independent of other domains, allowing service virtualization to continue independent of other domains availability.
  • All domains use same OWSM policy store (MDS-WSM).
  • Supports large numbers of deployed composites in multiple domains.
  • Single URL for Human Workflow end users.
  • Single URL for BAM end users.
  • Multiple domains to manage and configure.
  • Multiple Admin servers (single view requires use of Grid Control)
  • Multiple Admin servers/WSM clusters waste resources.
  • Additional homes needed to enjoy benefits of separate patching.
  • Cross domain trust needs setting up to simplify cross domain interactions.
  • Human Workflow needs to be specially configured to point to shared services domain.

The alternatives in this blog allow for patching to have different impacts, depending on the model chosen.  Each organization must decide the tradeoffs for itself.  One extreme is to go for the shared services model and have one domain per SOA application.  This requires a lot of administration of the multiple domains.  The other extreme is to have a single super domain.  This makes the entire enterprise susceptible to an outage at the same time due to patching or other domain level changes.  Hopefully this blog will help your organization choose the right model for you.

Coherence Adapter Configuration

Thu, 2014-07-03 00:05
SOA Suite 12c Coherence Adapter

The release of SOA Suite 12c sees the addition of a Coherence Adapter to the list of Technology Adapters that are licensed with the SOA Suite.  In this entry I provide an introduction to configuring the adapter and using the different operations it supports.

The Coherence Adapter provides access to Oracles Coherence Data Grid.  The adapter provides access to the cache capabilities of the grid, it does not currently support the many other features of the grid such as entry processors – more on this at the end of the blog.

Previously if you wanted to use Coherence from within SOA Suite you either used the built in caching capability of OSB or resorted to writing Java code wrapped as a Spring component.  The new adapter significantly simplifies simple cache access operations.


When creating a SOA domain the Coherence adapter is shipped with a very basic configuration that you will probably want to enhance to support real requirements.  In this section I look at the configuration required to use Coherence adapter in the real world.

Activate Adapter

The Coherence Adapter is not targeted at the SOA server by default, so this targeting needs to be performed from within the WebLogic console before the adapter can be used.

Create a cache configuration file

The Coherence Adapter provides a default connection factory to connect to an out-of-box Coherence cache and also a cache called adapter-local.  This is helpful as an example but it is good practice to only have a single type of object within a Coherence cache, so we will need more than one.  Without having multiple caches then it is hard to clean out all the objects of a particular type.  Having multiple caches also allows us to specify different properties for each cache.  The following is a sample cache configuration file used in the example.

<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">

This defines a single cache called TestCache.  This is a distributed cache, meaning that the entries in the cache will distributed across the grid.  This enables you to scale the storage capacity of the grid by adding more servers.  Additional caches can be added to this configuration file by adding additional <cache-mapping> elements.

The cache configuration file is reference by the adapter connection factory and so needs to be on a file system accessed by all servers running the Coherence Adapter.  It is not referenced from the composite.

Create a Coherence Adapter Connection Factory

We find the correct cache configuration by using a Coherence Adapter connection factory.  The adapter ships with a few sample connection factories but we will create new one.  To create a new connection factory we do the following:

  1. On the Outbound Connection Pools tab of the Coherence Adapter deployment we select New to create the adapter.
  2. Choose the javax.resource.cci.ConnectionFactory group.
  3. Provide a JNDI name, although you can use any name something along the lines of eis/Coherence/Test is a good practice (EIS tells us this an adapter JNDI, Coherence tells us it is the Coherence Adapter, and then we can identify which adapter configuration we are using).
  4. If requested to create a Plan.xml then make sure that you save it in a location available to all servers.
  5. From the outbound connection pool tab select your new connection factory so that you can configure it from the properties tab.
    • Set the CacheConfigLocation to point to the cache configuration file created in the previous section.
    • Set the ClassLoaderMode to CUSTOM.
    • Set the ServiceName to the name of the service used by your cache in the cache configuration file created in the previous section.
    • Set the WLSExtendProxy to false unless your cache configuration file is using an extend proxy.
    • If you plan on using POJOs (Plain Old Java Objects) with the adapter rather than XML then you need to point the PojoJarFile at the location of a jar file containing your POJOs.
    • Make sure to press enter in each field after entering your data.  Remember to save your changes when done.

You may will need to stop and restart the adapter to get it to recognize the new connection factory.


To demonstrate the different operations I created a WSDL with the following operations:

  • put – put an object into the cache with a given key value.
  • get – retrieve an object from the cache by key value.
  • remove – delete an object from the cache by key value.
  • list – retrieve all the objects in the cache.
  • listKeys – retrieve all the keys of the objects in the cache.
  • removeAll – remove all the objects from the cache.

I created a composite based on this WSDL that calls a different adapter reference for each operation.  Details on configuring the adapter within a composite are provided in the Configuring the Coherence Adapter section of the documentation.

I used a Mediator to map the input WSDL operations to the individual adapter references.


The input schema is shown below.

This type of pattern is likely to be used in all XML types stored in a Coherence cache.  The XMLCacheKey element represents the cache key, in this schema it is a string, but could be another primitive type.  The other fields in the cached object are represented by a single XMLCacheContent field, but in a real example you are likely to have multiple fields at this level.  Wrapper elements are provided for lists of elements (XMLCacheEntryList) and lists of cache keys (XMLCacheEntryKeyList).  XMLEmpty is used for operation that don’t require an input.

Put Operation

The put operation takes an XMLCacheEntry as input and passes this straight through to the adapter.  The XMLCacheKey element in the entry is also assigned to the jca.coherence.key property.  This sets the key for the cached entry.  The adapter also supports automatically generating a key, which is useful if you don’t have a convenient field in the cached entity.  The cache key is always returned as the output of this operation.

Get Operation

The get operation takes an XMLCacheKey as input and assigns this to the jca.coherence.key property. This sets the key for the entry to be retrieved.

Remove Operation

The remove operation takes an XMLCacheKey as input and assigns this to the jca.coherence.key property. This sets the key for the entry to be deleted.

RemoveAll Operation

This is similar to the remove operation but instead of using a key as input to the remove operation it uses a filter.  The filter could be overridden by using the jca.coherence.filter property but for this operation it was permanently set in the adapter wizard to be the following query:

key() != ""

This selects all objects whose key is not equal to the empty string.  All objects should have a key so this query should select all objects for deletion.

Note that there appears to be a bug in the return value.  The return value is entry rather than having the expected RemoveResponse element with a Count child element.  Note the documentation states that

When using a filter for a Remove operation, the Coherence Adapter does not report the count of entries affected by the remove operation, regardless of whether the remove operation is successful.

When using a key to remove a specific entry, the Coherence Adapter does report the count, which is always 1 if a Coherence Remove operation is successful.

Although this could be interpreted as meaning an empty part is returned, an empty part is a violation of the WSDL contract.

List Operation

The list operation takes no input and returns the result list returned by the adapter.  The adapter also supports querying using a filter.  This filter is essentially the where clause of a Coherence Query Language statement.  When using XML types as cached entities then only the key() field can be tested, for example using a clause such as:

key() LIKE “Key%1”

This filter would match all entries whose key starts with “Key” and ends with “1”.

ListKeys Operation

The listKeys operation is essentially the same as the list operation except that only the keys are returned rather than the whole object.


To test the composite I used the new 12c Test Suite wizard to create a number of test suites.  The test suites should be executed in the following order:

  1. CleanupTestSuite has a single test that removes all the entries from the cache used by this composite.
  2. InitTestSuite has 3 tests that insert a single record into the cache.  The returned key is validated against the expected value.
  3. MainTestSuite has 5 tests that list the elements and keys in the cache and retrieve individual inserted elements.  This tests that the items inserted in the previous test are actually in the cache.  It also tests the get, list and listAll operations and makes sure they return the expected results.
  4. RemoveTestSuite has a single test that removes an element from the cache and tests that the count of removed elements is 1.
  5. ValidateRemoveTestSuite is similar to MainTestSuite but verifies that the element removed by the previous test suite has actually been removed.
Use Case

One example of using the Coherence Adapter is to create a shared memory region that allows SOA composites to share information.  An example of this is provided by Lucas Jellema in his blog entry First Steps with the Coherence Adapter to create cross instance state memory.

However there is a problem in creating global variables that can be updated by multiple instances at the same time.  In this case the get and put operations provided by the Coherence adapter support a last write wins model.  This can be avoided in Coherence by using an Entry Processor to update the entry in the cache, but currently entry processors are not supported by the Coherence Adapter.  In this case it is still necessary to use Java to invoke the entry processor.

Sample Code

The sample code I refer to above is available for download and consists of two JDeveloper projects, one with the cache config file and the other with the Coherence composite.

  • CoherenceConfig has the cache config file that must be referenced by the connection factory properties.
  • CoherenceSOA has a composite that supports the WSDL introduced at the start of this blog along with the test cases mentioned at the end of the blog.

The Coherence Adapter is a really exciting new addition to the SOA developers toolkit, hopefully this article will help you make use of it.

One Queue to Rule them All

Fri, 2014-03-28 16:16
Using a Single Queue for Multiple Message Types with SOA Suite Problem StatementYou use a single JMS queue for sending multiple message types /  service requests.  You use a single JMS queue for receiving multiple message types / service requests.  You have multiple SOA JMS Adapter interfaces for reading and writing these queues.  In a composite it is random which interface gets a message from the JMS queue.  It is not a problem having multiple adapter instances writing to a single queue, the problem is only with having multiple readers because each reader gets the first message on the queue. Background

The JMS Adapter is unaware of who receives the messages.  Each adapter instance just takes the message from the queue and delivers it to its own configured interface, one interface per adapter instance.  The SOA infrastructure is then responsible for routing that message, usually via a database table and an in memory notification message, to a component within a composite.  Each message will create a new composite but the BPEL engine and Mediator engine will attempt to match callback messages to the appropriate Mediator or BPEL instance.
Note that message type, including XML document type, has nothing to do with the preceding statements.

The net result is that if you have a sequence of two receives from the same queue using different adapters then the messages will be split equally between the two adapters, meaning that half the time the wrong adapter will receive the message.  This blog entry looks at how to resolve this issue.

Note that the same problem occurs whenever you have more than 1 adapter listening to the same queue, whether they are in the same composite or different composites.  The solution in this blog entry is also relevant to this use case.

SolutionsIn order to correctly deliver the messages to the correct interface we need to identify the interface they should be delivered to.  This can be done by using JMS properties.  For example the JMSType property can be used to identify the type of the message.  A message selector can be added to the JMS inbound adapter that will cause the adapter to filter out messages intended for other interfaces.  For example if we need to call three services that are implemented in a single application:
  • Service 1 receives messages on the single outbound queue from SOA, it send responses back on the single inbound queue.
  • Similarly Service 2 and Service 3 also receive messages on the single outbound queue from SOA, they send responses back on the single inbound queue.
First we need to ensure the messages are delivered to the correct adapter instance.  This is achieved as follows:
  • aThe inbound JMS adapter is configured with a JMS message selector.  The message selector might be "JMSType='Service1'" for responses from Service 1.  Similarly the selector would be "JMSType='Service2'" for the adapter waiting on a response from Service 2.  The message selector ensures that each adapter instance will retrieve the first message from the queue that matches its selector.
  • The sending service needs to set the JMS property (JMSType in our example) that is used in the message selector.
Now our messages are being delivered to the correct interface we need to make sure that they get delivered to the correct Mediator or BPEL instance.  We do this with correlation.  There are several correlation options:
  1. We can do manual correlation with a correlation set, identifying parts of the outbound message that uniquely identify our instance and matching them with parts of the inbound message to make the correlation.
  2. We can use a Request-Reply JMS adapter which by default expects the response to contain a JMSCorrelationID equal to the outgoing JMSMessageID.  Although no configuration is required for this on the SOA client side, the service needs to copy the incoming JMSMessageID to the outgoing JMSCorrelationID.
Special Case - Request-Reply Synchronous JMS Adapter

When using a synchronous Request-Reply JMS adapter we can omit to specify the message selector because the Request-Reply JMS adapter will immediately do a listen with a message selector for the correlation ID rather than processing the incoming message asynchronously.
The synchronous request-reply will block the BPEL process thread and hold open the BPEL transaction until a response is received, so this should only be used when you expect the request to be completed in a few seconds.

The JCA Connection Factory used must point to a non-XA JMS Connection Factory and must have the isTransacted property set to “false”.  See the documentation for more details.


I developed a JDeveloper SOA project that demonstrates using a single queue for multiple incoming adapters.  The overall process flow is shown in the picture below.  The BPEL process on the left receives messages from the jms/TestQueue2 and sends messages to the jms/Test Queue1.  A Mediator is used to simulate multiple services and also provide a web interface to initiate the process.  The correct adapter is identified by using JMS message properties and a selector.


The flow above shows that the process is initiated from EM using a web service binding on mediator.  The mediator, acting as a client, posts the request to the inbound queue with a JMSType property set to "Initiate". Model Client BPEL Service Inbound Request Client receives web service request and posts the request to the inbound queue with JMSType='Initiate' The JMS adapter with a message selector "JMSType='Initiate'" receives the message and causes a composite to be created.  The composite in turn causes the BPEL process to start executing.
The BPEL process then sends a request to Service 1 on the outbound queue.
Key Points

  • Initiate message can be used to initate a correlation set if necessary
  • Selector required to distinguish initiate messages from other messages on the queue
Service 1 receives the request and sends a response on the inbound queue with JMSType='Service1' and JMSCorrelationID= incoming JMS Message ID. Separate Request and Reply Adapters   The JMS adapter with a message selector "JMSType='Service1'" receives the message and causes a composite to be created.  The composite uses a correlation set to in turn deliver the message to BPEL which correlates it with the existing BPEL process.
The BPEL process then sends a request to Service 2 on the outbound queue.
Key Points
  • Separate request & reply adapters require a correlation set to ensure that reply goes to correct BPEL process instance
  • Selector required to distinguish service 1 response messages from other messages on the queue
Service 2 receives the request and sends a response on the inbound queue with JMSType='Service2' and JMSCorrelationID= incoming JMS Message ID. Asynchronous Request-Reply Adapter   The JMS adapter with a message selector "JMSType='Service2'" receives the message and causes a composite to be created.  The composite in turn delivers the message to the existing BPEL process using native JMS correlation.
Key Point
  • Asynchronous request-reply adapter does not require a correlation set, JMS adapter auto-correlates using CorrelationID to ensure that reply goes to correct BPEL process instance
  • Selector still required to distinguish service 2 response messages from other messages on the queue
The BPEL process then sends a request to Service 3 on the outbound queue using a synchronous request-reply.
Service 3 receives the request and sends a response on the inbound queue with JMSType='Service2' and JMSCorrelationID= incoming JMS Message ID. Synchronous Request-Reply Adapter   The synchronous JMS adapter receives the response without a message selector and correlates it to the BPEL process using native JMS correlation and sends the overall response to the outbound queue.
Key Points
  • Synchronous request-reply adapter does not require a correlation set, JMS adapter auto-correlates using CorrelationID to ensure that reply goes to correct BPEL process instance
  • Selector also not required to distinguish service 3 response messages from other messages on the queue because the synchronous adapter is doing a selection on the expected CorrelationID
  Outbound Response Client receives the response on an outbound queue.       Summary

When using a single JMS queue for multiple purposes bear in mind the following:

  • If multiple receives use the same queue then you need to have a message selector.  The corollary to this is that the message sender must add a JMS property to the message that can be used in the message selector.
  • When using a request-reply JMS adapter then there is no need for a correlation set, correlation is done in the adapter by matching the outbound JMS message ID to the inbound JMS correlation ID.  The corollary to this is that the message sender must copy the JMS request message ID to the JMS response correlation ID.
  • When using a synchronous request-reply JMS adapter then there is no need for the message selector because the message selection is done based on the JMS correlation ID.
  • Synchronous request-reply adapter requires a non-XA connection factory to be used so that the request part of the interaction can be committed separately to the receive part of the interaction.
  • Synchronous request-reply JMS adapter should only be used when the reply is expected to take just a few seconds.  If the reply is expected to take longer then the asynchronous request-reply JMS adapter should be used.
Deploying the Sample

The sample is available to download here and makes use of the following JMS resources:

JNDI Resource; Notes jms/TestQueue Queue Outbound queue from the BPEL process jms/TestQueue2 Queue Inbound queue to the BPEL process eis/wls/TestQueue JMS Adapter Connector Factory This can point to an XA or non-XA JMS Connection Factory such as weblogic.jms.XAConnectionFactory eis/wls/TestQueue None-XA JMS Adapter Connector Factory This must point to a non-XA JMS Connection Factory such as weblogic.jms.ConnectionFactory and must have isTransacted set to “false”

To run the sample then just use the test facility in the EM console or the soa-infra application.

Not Just a Cache

Thu, 2014-03-27 22:23
Coherence as a Compute Grid

Coherence is best known as a data grid, providing distributed caching with an ability to move processing to the data in the grid.  Less well known is the fact that Coherence also has the ability to function as a compute grid, distributing work across multiple servers in a cluster.  In this entry, which was co-written with my colleague Utkarsh Nadkarni, we will look at using Coherence as a compute grid through the use of the Work Manager API and compare it to manipulating data directly in the grid using Entry Processors.

Coherence Distributed Computing Options

The Coherence documentation identifies several methods for distributing work across the cluster, see Processing Data in a Cache.  They can be summarized as:

  • Entry Processors
    • An InvocableMap interface, inherited by the NamedCache interface, provides support for executing an agent (EntryProcessor or EntryAggregator) on individual entries within the cache.
    • The entries may or may not exist, either way the agent is executed once for each key provided, or if no key is provided then it is executed once for each object in the cache.
    • In Enterprise and Grid editions of Coherence the entry processors are executed on the primary cache nodes holding the cached entries.
    • Agents can return results.
    • One agent executes multiple times per cache node, once for each key targeted on the node.
  • Invocation Service
    • An InvocationService provides support for executing an agent on one or more nodes within the grid.
    • Execution may be targeted at specific nodes or at all nodes running the Invocation Service.
    • Agents can return results.
    • One agent executes once per node.
  • Work Managers
    • A WorkManager class provides a grid aware implementation of the commonJ WorkManager which can be used to run tasks across multiple threads on multiple nodes within the grid.
    • WorkManagers run on multiple nodes.
    • Each WorkManager may have multiple threads.
    • Tasks implement the Work interface and are assigned to specific WorkManager threads to execute.
    • Each task is executed once.
Three Models of Distributed Computation

The previous section listing the distributed computing options in Coherence shows that there are 3 distinct execution models:

  • Per Cache Entry Execution (Entry Processor)
    • Execute the agent on the entry corresponding to a cache key.
    • Entries processed on a single thread per node.
    • Parallelism across nodes.
  • Per Node Execution (Invocation Service)
    • Execute the same agent once per node.
    • Agent processed on a single thread per node.
    • Parallelism across nodes.
  • Per Task Execution (Work Manager)
    • Each task executed once.
    • Parallelism across nodes and across threads within a node.

The entry processor is good for operating on individual cache entries.  It is not so good for working on groups of cache entries.

The invocation service is good for performing checks on a node, but is limited in its parallelism.

The work manager is good for operating on groups of related entries in the cache or performing non-cache related work in parallel.  It has a high degree of parallelism.

As you can see the primary choice for distributed computing comes down to the Work Manager and the Entry Processor.

Differences between using Entry Processors and Work Managers in Coherence Aspect Entry Processors Work Managers Degree of parallelization Is a function of the number of Coherence nodes. EntryProcessors are run concurrently across all nodes in a cluster. However, within each node only one instance of the entry processor executes at a time. Is a function of the number of Work Manager threads. The Work is run concurrently across all threads in all Work Manager instances. Transactionality Transactional. If an EntryProcessor running on one node does not complete (say, due to that node crashing), the entries targeted will be executed by an EntryProcessor on another node. Not transactional. The specification does not explicitly specify what the response should be if a remote server crashes during an execution. Current implementation uses WORK_COMPLETED with WorkCompletedException as a result. In case a Work does not run to completion, it is the responsibility of the client to resubmit the Work to the Work Manager. How is the Cache accessed or mutated? Operations against the cache contents are executed by (and thus within the localized context of) a cache. Accesses and changes to the cache are done directly through the cache API. Where is the processing performed? In the same JVM where the entries-to-be-processed reside. In the Work Manager server. This may not be the same JVM where the entries-to-be-processed reside. Network Traffic Is a function of the size of the EntryProcessor. Typically, the size of an EntryProcessor is much smaller than the size of the data transferred across nodes in the case of a Work Manager approach. This makes the EntryProcessor approach more network-efficient and hence more scalable. One EntryProcessor is transmitted to each cache node. Is a function of the
  • Number of Work Objects, of which multiple may be sent to each server.
  • Size of the data set transferred from the Backing Map to the Work Manager Server.
Distribution of “Tasks” Tasks are moved to the location at which the entries-to-be-processed are being managed. This may result in a random distribution of tasks. The distribution tends to get equitable as the number of entries increases. Tasks are distributed equally across the threads in the Work Manager Instances. Implementation of the EntryProcessor or Work class. Create a class that extends AbstractProcessor. Implement the process method. Update the cache item based on the key passed in to the process method. Create a class that is serializable and implements Implement the run method. Implementation of “Task” In the process method, update the cache item based on the key passed into the process method. In the run method, do the following:
  • Get a reference to the named cache
  • Do the Work – Get a reference to the Cache Item; change the cache item; put the cache item back into the named cache.
Completion Notification When the NamedCache.invoke method completes then all the entry processors have completed executing. When a task is submitted for execution it executes asynchronously on the work manager threads in the cluster.  Status may be obtained by registering a class when calling the WorkManager.schedule method.  This will provide updates when the Work is accepted, started and completed or rejected.  Alternatively the WorkManager.waitForAll and WorkManager.waitForAny methods allow blocking waits for either all or one result respectively. Returned Results java.lang.Object – when executed on one cache item. This returns result of the invocation as returned from the EntryProcessor.
java.util.Map – when executed on a collection of keys. This returns a Map containing the results of invoking the EntryProcessor against each of the specified keys. - There are three possible outcomes
  • The Work is not yet complete. In this case, a null is returned by WorkItem.getResult.
  • The Work started but completed with an exception. This may have happened due to a Work Manager Instance terminating abruptly. This is indicated by an exception thrown by WorkItem.getResult.
  • The Work Manager instance indicated that the Work is complete and the Work ran to completion. In this case, WorkItem.getResult returns a non-null and no exception is thrown by WorkItem.getResult.
Error Handling Failure of a node results in all the work assigned to that node being executed on the new primary. This may result in some work being executed twice, but Coherence ensures that the cache is only updated once per item. Failure of a node results in the loss of scheduled tasks assigned to that node. Completed tasks are sent back to the client as they complete. Fault Handling Extension

Entry processors have excellent error handling within Coherence.  Work Managers less so.  In order to provide resiliency on node failure I implemented a “RetryWorkManager” class that detects tasks that have failed to complete successfully and resubmits them to the grid for another attempt.

A JDeveloper project with the RetryWorkManager is available for download here.  It includes sample code to run a simple task across multiple work manager threads.

To create a new RetryWorkManager that will retry failed work twice then you would use this: WorkManager = new RetryWorkManager("WorkManagerName", 2);  // Change for number of retries, if no retry count is provided then the default is 0.You can control the number of retries at the individual work level as shown below: WorkItem workItem = schedule(work); // Use number of retries set at WorkManager creation
WorkItem workItem = schedule(work, workListener); // Use number of retries set at WorkManager creation
WorkItem workItem = schedule(work, 4); // Change number of retries
WorkItem workItem = schedule(work, workListener, 4); // Change number of retriesCurrently the RetryWorkManager defaults to having 0 threads.  To change use this constructor: WorkItem workItem = schedule(work, workListener, 3, 4); // Change number of threads (3) and retries (4)Note that none of this sample code is supported by Oracle in any way, and is provided purely as a sample of what can be done with Coherence. How the RetryWorkManager Works

The RetryWorkManager delegates most operations to a Coherence WorkManager instance.  It creates a WorkManagerListener to intercept status updates.  On receiving a WORK_COMPLETED callback the listener checks the result to see if the completion is due to an error.  If an error occurred and there are retries left then the work is resubmitted.  The WorkItem returned by scheduling an event is wrapped in a RetryWorkItem.  This RetryWorkItem is updated with a new Coherence WorkItem when the task is retried.  If the client registers a WorkManagerListener then the RetryWorkManagerListener delegates non-retriable events to the client listener.  Finally the waitForAll and waitForAny methods are modified to deal with work items being resubmitted in the event of failure.

Sample Code for EntryProcessor and RetryWorkManager

The downloadable project contains sample code for running the work manager and an entry processor.

The demo implements a 3-tier architecture

  1. Coherence Cache Servers
    • Can be started by running RunCacheServer.cmd
    • Runs a distributed cache used by the Task to be executed in the grid
  2. Coherence Work Manager Servers
    • Can be started by running RunWorkManagerServer.cmd
    • Takes no parameters
    • Runs two threads for executing tasks
  3. Coherence Work Manager Clients
    • Can be started by running RunWorkManagerClient.cmd
    • Takes three parameters currently
      • Work Manager name - should be "AntonyWork" - default is "AntonyWork"
      • Number of tasks to schedule - default is 10
      • Time to wait for tasks to complete in seconds - default is 60

The task stores the number of times it has been executed in the cache, so multiple runs will see the counter incrementing.  The choice between EntryProcessor and WorkManager is controlled by changing the value of USE_ENTRY_PROCESSOR between false and true in the RunWorkManagerClient.cmd script.

The SetWorkManagerEnv.cmd script should be edited to point to the Coherence home directory and the Java home directory.


If you need to perform operations on cache entries and don’t need to have cross-checks between the entries then the best solution is to use an entry processor.  The entry processor is fault tolerant and updates to the cached entity will be performed once only.

If you need to perform generic work that may need to touch multiple related cache entries then the work manager may be a better solution.  The extensions I created in the RetryWorkManager provide a degree of resiliency to deal with node failure without impacting the client.

The RetryWorkManager can be downloaded here.

Packt Publishing Buy One Get One Free Offer

Thu, 2014-03-20 14:35
Packt Publishing celebrates their 2000th title with a Buy One Get One Free Offer

Great time to get those Packt books you’ve been thinking of buying, like the SOA Suite 11g Developers Guide or the SOA Suite 11g Developers Cookbook.

The Impact of Change

Sun, 2014-03-09 16:01
Measuring Impact of Change in SOA Suite
Mormon prophet Thomas S. Monson once said:

When performance is measured, performance improves. When performance is measured and reported, the rate of performance accelerates.

(LDS Conference Report, October 1970, p107)

Like everything in life, a SOA Suite installation that is monitored and tracked has a much better chance of performing well than one that is not measured.  With that in mind I came up with tool to allow the measurement of the impact of configuration changes on database usage in SOA Suite.  This tool can be used to assess the impact of different configurations on both database growth and database performance, helping to decide which optimizations offer real benefit to the composite under test.

Basic Approach

The basic approach of the tool is to take a snapshot of the number of rows in the SOA tables before executing a composite.  The composite is then executed.  After the composite has completed another snapshot is taken of the SOA tables.  This is illustrated in the diagram below:

An example of the data collected by the tool is shown below:

Test Name Total Tables Changed Total Rows Added Notes AsyncTest1 13 15 Async Interaction with simple SOA composite, one retry to send response. AsyncTest2 12 13 Async interaction with simple SOA composite, no retries on sending response. AsyncTest3 12 13 Async interaction with simple SOA composite, no callback address provided. OneWayTest1 12 13 One-Way interaction with simple SOA composite. SyncTest1 7 7 Sync interaction with simple SOA composite.

Note that the first three columns are provided by the tool, the fourth column is just an aide-memoir to identify what the test name actually did. The tool also allows us to drill into the data to get a better look at what is actually changing as shown in the table below:

Test Name Table Name Rows Added AsyncTest1 AUDIT_COUNTER 1 AsyncTest1 AUDIT_DETAILS 1 AsyncTest1 AUDIT_TRAIL 2 AsyncTest1 COMPOSITE_INSTANCE 1 AsyncTest1 CUBE_INSTANCE 1 AsyncTest1 CUBE_SCOPE 1 AsyncTest1 DLV_MESSAGE 1 AsyncTest1 DOCUMENT_CI_REF 1 AsyncTest1 DOCUMENT_DLV_MSG_REF 1 AsyncTest1 HEADERS_PROPERTIES 1 AsyncTest1 INSTANCE_PAYLOAD 1 AsyncTest1 WORK_ITEM 1 AsyncTest1 XML_DOCUMENT 2

Here we have drilled into the test case with the retry of the callback to see what tables are actually being written to.

Finally we can compare two tests to see difference in the number of rows written and the tables updated as shown below:

Test Name Base Test Name Table Name Row Difference AsyncTest1 AsyncTest2 AUDIT_TRAIL 1

Here are the additional tables referenced by this test

Test Name Base Test Name Additional Table Name Rows Added AsyncTest1 AsyncTest2 WORK_ROWS 1 How it Works

I created a database stored procedure, soa_snapshot.take_soa_snaphot(test_name, phase). that queries all the SOA tables and records the number of rows in each table.  By running the stored procedure before and after the execution of a composite we can capture the number of rows in the SOA database before and after a composite executes.  I then created a view that shows the difference in the number of rows before and after composite execution.  This view has a number of sub-views that allow us to query specific items.  The schema is shown below:

The different tables and views are:

    • Used to track number of rows in SOA schema, each test case has two or more phases.  Usually phase 1 is before execution and phase 2 is after execution.
    • This only used by the stored procedure and the views.
    • Used to track changes in number of rows in SOA database between phases of a test case.  This is a view on CHANGE_TABLE.  All other views are based off this view.
    • Provides number of rows changed in each table.
    • Provides a summary of total rows and tables changed.
    • Provides a summary of differences in rows updated between test cases
    • Provides a summary of the extra tables and rows used by a test case.
    • This view makes use of a session context, soa_ctx, which holds the test case name and the baseline test case name.  This context is initialized by calling the stored procedure soa_ctx_pkg.set(testCase, baseTestCase).

I created a web service wrapper to the take_soa_snapshot procedure so that I could use SoapUI to perform the tests.

Sample Output How many rows and tables did a particular test use?

Here we can see how many rows in how many tables changed as a result of running a test:

-- Display the total number of rows and tables changed for each test
select * from summary_delta_view
order by test_name;

-------------------- -------------- -------------- -----------
AsyncTest1                   15              0          13
AsyncTest1noCCIS             15              0          13
AsyncTest1off                 8              0           8
AsyncTest1prod               13              0          12
AsyncTest2                   13              0          12
AsyncTest2noCCIS             13              0          12
AsyncTest2off                 7              0           7
AsyncTest2prod               11              0          11
AsyncTest3                   13              0          12
AsyncTest3noCCIS             13          65536          12
AsyncTest3off                 7              0           7
AsyncTest3prod               11              0          11
OneWayTest1                  13              0          12
OneWayTest1noCCI             13          65536          12
OneWayTest1off                7              0           7
OneWayTest1prod              11              0          11
SyncTest1                     7              0           7
SyncTest1noCCIS               7              0           7
SyncTest1off                  2              0           2
SyncTest1prod                 5              0           5

20 rows selected

Which tables grew during a test?

Here for a given test we can see which tables had rows inserted.

-- Display the tables which grew and show the number of rows they grew by
select * from simple_delta_view
where test_name='AsyncTest1'
order by table_name;
TEST_NAME            TABLE_NAME                      DELTAROWS  DELTASIZE
-------------------- ------------------------------ ---------- ----------
AsyncTest1       AUDIT_COUNTER                           1          0
AsyncTest1       AUDIT_DETAILS                           1          0
AsyncTest1       AUDIT_TRAIL                             2          0
AsyncTest1       COMPOSITE_INSTANCE                      1          0
AsyncTest1       CUBE_INSTANCE                           1          0
AsyncTest1       CUBE_SCOPE                              1          0
AsyncTest1       DLV_MESSAGE                             1          0
AsyncTest1       DOCUMENT_CI_REF                         1          0
AsyncTest1       DOCUMENT_DLV_MSG_REF                    1          0
AsyncTest1       HEADERS_PROPERTIES                      1          0
AsyncTest1       INSTANCE_PAYLOAD                        1          0
AsyncTest1       WORK_ITEM                               1          0
AsyncTest1       XML_DOCUMENT                            2          0
13 rows selected

Which tables grew more in test1 than in test2?

Here we can see the differences in rows for two tests.

-- Return difference in rows updated (test1)
select * from different_rows_view
where test1='AsyncTest1' and test2='AsyncTest2';

TEST1                TEST2                TABLE_NAME                          DELTA
-------------------- -------------------- ------------------------------ ----------
AsyncTest1       AsyncTest2       AUDIT_TRAIL                             1

Which tables were used by test1 but not by test2?

Here we can see tables that were used by one test but not by the other test.

-- Register base test case for use in extra_tables_view
-- First parameter (test1) is test we expect to have extra rows/tables
begin soa_ctx_pkg.set('AsyncTest1', 'AsyncTest2'); end;
anonymous block completed
-- Return additional tables used by test1
column TEST2 FORMAT A20
select * from extra_tables_view;
TEST1                TEST2                TABLE_NAME                      DELTAROWS
-------------------- -------------------- ------------------------------ ----------
AsyncTest1       AsyncTest2       WORK_ITEM                               1



I used the tool to find out the following.  All tests were run using SOA Suite

The following is based on a very simple composite as shown below:

Each BPEL process is basically the same as the one shown below:

Impact of Fault Policy Retry Being Executed Once Setting Total Rows Written Total Tables Updated No Retry 13 12 One Retry 15 13

When a fault policy causes a retry then the following additional database rows are written:

Table Name Number of Rows AUDIT_TRAIL 1 WORK_ITEM 1 Impact of Setting Audit Level = Development Instead of Production Setting Total Rows Written Total Tables Updated Development 13 12 Production 11 11

When the audit level is set at development instead of production then the following additional database rows are written:

Table Name Number of Rows AUDIT_TRAIL 1 WORK_ITEM 1 Impact of Setting Audit Level = Production Instead of Off Setting Total Rows Written Total Tables Updated Production 11 11 Off 7 7

When the audit level is set at production rather than off then the following additional database rows are written:

Table Name Number of Rows AUDIT_COUNTER 1 AUDIT_DETAILS 1 AUDIT_TRAIL 1 COMPOSITE_INSTANCE 1 Impact of Setting Capture Composite Instance State Setting Total Rows Written Total Tables Updated On 13 12 Off 13 12

When capture composite instance state is on rather than off then no additional database rows are written, note that there are other activities that occur when composite instance state is captured:

Impact of Setting oneWayDeliveryPolicy = async.cache or sync Setting Total Rows Written Total Tables Updated async.persist 13 12 async.cache 7 7 sync 7 7

When choosing async.persist (the default) instead of sync or async.cache then the following additional database rows are written:


As you would expect the sync mode behaves just as a regular synchronous (request/reply) interaction and creates the same number of rows in the database.  The async.cache also creates the same number of rows as a sync interaction because it stores state in memory and provides no restart guarantee.

Caveats & Warnings

The results above are based on a trivial test case.  The numbers will be different for bigger and more complex composites.  However by taking snapshots of different configurations you can produce the numbers that apply to your composites.

The capture procedure supports multiple steps in a test case, but the views only support two snapshots per test case.

Code Download

The sample project I used us available here.

The scripts used to create the user (createUser.sql), create the schema (createSchema.sql) and sample queries (TableCardinality.sql) are available here.

The Web Service wrapper to the capture state stored procedure is available here.

The sample SoapUI project that I used to take a snapshot, perform the test and take a second snapshot is available here.

Clustering Events

Wed, 2014-02-26 13:25
Setting up an Oracle Event Processing Cluster

Recently I was working with Oracle Event Processing (OEP) and needed to set it up as part  of a high availability cluster.  OEP uses Coherence for quorum membership in an OEP cluster.  Because the solution used caching it was also necessary to include access to external Coherence nodes.  Input messages need to be duplicated across multiple OEP streams and so a JMS Topic adapter needed to be configured.  Finally only one copy of each output event was desired, requiring the use of an HA adapter.  In this blog post I will go through the steps required to implement a true HA OEP cluster.

OEP High Availability Review

The diagram below shows a very simple non-HA OEP configuration:

Events are received from a source (JMS in this blog).  The events are processed by an event processing network which makes use of a cache (Coherence in this blog).  Finally any output events are emitted.  The output events could go to any destination but in this blog we will emit them to a JMS queue.

OEP provides high availability by having multiple event processing instances processing the same event stream in an OEP cluster.  One instance acts as the primary and the other instances act as secondary processors.  Usually only the primary will output events as shown in the diagram below (top stream is the primary):

The actual event processing is the same as in the previous non-HA example.  What is different is how input and output events are handled.  Because we want to minimize or avoid duplicate events we have added an HA output adapter to the event processing network.  This adapter acts as a filter, so that only the primary stream will emit events to out queue.  If the processing of events within the network depends on how the time at which events are received then it is necessary to synchronize the event arrival time across the cluster by using an HA input adapter to synchronize the arrival timestamps of events across the cluster.

OEP Cluster Creation

Lets begin by setting up the base OEP cluster.  To do this we create new OEP configurations on each machine in the cluster.  The steps are outlined below.  Note that the same steps are performed on each machine for each server which will run on that machine:

  • Run ${MW_HOME}/ocep_11.1/common/bin/
    • MW_HOME is the installation directory, note that multiple Fusion Middleware products may be installed in this directory.
  • When prompted “Create a new OEP domain”.
  • Provide administrator credentials.
    • Make sure you provide the same credentials on all machines in the cluster.
  • Specify a  “Server name” and “Server listen port”.
    • Each OEP server must have a unique name.
    • Different servers can share the same “Server listen port” unless they are running on the same host.
  • Provide keystore credentials.
    • Make sure you provide the same credentials on all machines in the cluster.
  • Configure any required JDBC data source.
  • Provide the “Domain Name” and “Domain location”.
    • All servers must have the same “Domain name”.
    • The “Domain location” may be different on each server, but I would keep it the same to simplify administration.
    • Multiple servers on the same machine can share the “Domain location” because their configuration will be placed in the directory corresponding to their server name.
  • Create domain!
Configuring an OEP Cluster

Now that we have created our servers we need to configure them so that they can find each other.  OEP uses Oracle Coherence to determine cluster membership.  Coherence clusters can use either multicast or unicast to discover already running members of a cluster.  Multicast has the advantage that it is easy to set up and scales better (see but has a number of challenges, including failure to propagate by default through routers and accidently joining the wrong cluster because someone else chose the same multicast settings.  We will show how to use both unicast and multicast to discover the cluster. 

Multicast Discovery Unicast Discovery Coherence multicast uses a class D multicast address that is shared by all servers in the cluster.  On startup a Coherence node broadcasts a message to the multicast address looking for an existing cluster.  If no-one responds then the node will start the cluster. Coherence unicast uses Well Known Addresses (WKAs). Each server in the cluster needs a dedicated listen address/port combination. A subset of these addresses are configured as WKAs and shared between all members of the cluster. As long as at least one of the WKAs is up and running then servers can join the cluster. If a server does not find any cluster members then it checks to see if its listen address and port are in the WKA list. If it is then that server will start the cluster, otherwise it will wait for a WKA server to become available.   To configure a cluster the same steps need to be followed for each server in the cluster:
  • Set an event server address in the config.xml file.
    • Add the following to the <cluster> element:
    • The “server-name” is displayed in the visualizer and should be unique to the server.

    • The “server-host-name” is used by the visualizer to access remote servers.

    • The “server-host-name” must be an IP address or it must resolve to an IP address that is accessible from all other servers in the cluster.

    • The listening port is configured in the <netio> section of the config.xml.

    • The server-host-name/listening port combination should be unique to each server.

  • Set a common cluster multicast listen address shared by all servers in the config.xml file.
    • Add the following to the <cluster> element:
          <!—For us in Coherence multicast only! –>
    • The “multicast-address” must be able to be routed through any routers between servers in the cluster.

  • Optionally you can specify the bind address of the server, this allows you to control port usage and determine which network is used by Coherence

    • Create a “tangosol-coherence-override.xml” file in the ${DOMAIN}/{SERVERNAME}/config directory for each server in the cluster.
      <?xml version='1.0'?>
                  <!—This server Coherence address and port number –>
  • Configure the Coherence WKA cluster discovery.

    • Create a “tangosol-coherence-override.xml” file in the ${DOMAIN}/{SERVERNAME}/config directory for each server in the cluster.
      <?xml version='1.0'?>
                  <!—WKA Configuration –>
                      <socket-address id="1">
                      <socket-address id="2">
                  <!—This server Coherence address and port number –>

    • List at least two servers in the <socket-address> elements.

    • For each <socket-address> element there should be a server that has corresponding <address> and <port> elements directly under <well-known-addresses>.

    • One of the servers listed in the <well-known-addresses> element must be the first server started.

    • Not all servers need to be listed in <well-known-addresses>, but see previous point.

  • Enable clustering using a Coherence cluster.
    • Add the following to the <cluster> element in config.xml.
    • The “enabled” element tells OEP that it will be using Coherence to establish cluster membership, this can also be achieved by setting the value to be “coherence”.

  • The following shows the <cluster> config for another server in the cluster with differences highlighted:
        <!—For us in Coherence multicast only! –>

  • The following shows the <cluster> config for another server in the cluster with differences highlighted:

  • The following shows the “tangosol-coherence-override.xml” file for another server in the cluster with differences highlighted:
    <?xml version='1.0'?>
                <!—WKA Configuration –>
                    <socket-address id="1">
                    <socket-address id="2">
                    <!—This server Coherence address and port number –>

You should now have a working OEP cluster.  Check the cluster by starting all the servers.

Look for a message like the following on the first server to start to indicate that another server has joined the cluster:

<Coherence> <BEA-2049108> <The domain membership has changed to [server2, server1], the new domain primary is "server1">

Log on to the Event Processing Visualizer of one of the servers – http://<hostname>:<port>/wlevs.  Select the cluster name on the left and then select group “AllDomainMembers”.  You should see a list of all the running servers in the “Servers of Group – AllDomainMembers” section.

Sample Application

Now that we have a working OEP cluster let us look at a simple application that can be used as an example of how to cluster enable an application.  This application models service request tracking for hardware products.  The application we will use performs the following checks:

  1. If a new service request (identified by SRID) arrives (indicated by status=RAISE) then we expect some sort of follow up in the next 10 seconds (seconds because I want to test this quickly).  If no follow up is seen then an alert should be raised.
    • For example if I receive an event (SRID=1, status=RAISE) and after 10 seconds I have not received a follow up message (SRID=1, status<>RAISE) then I need to raise an alert.
  2. If a service request (identified by SRID) arrives and there has been another service request (identified by a different SRID) for the same physcial hardware (identified by TAG) then an alert should be raised.
    • For example if I receive an event (SRID=2, TAG=M1) and later I receive another event for the same hardware (SRID=3, TAG=M1) then an alert should be raised.

Note use case 1 is nicely time bounded – in this case the time window is 10 seconds.  Hence this is an ideal candidate to be implemented entirely in CQL.

Use case 2 has no time constraints, hence over time there could be a very large number of CQL queries running looking for a matching TAG but a different SRID.  In this case it is better to put the TAGs into a cache and search the cache for duplicate tags.  This reduces the amount of state information held in the OEP engine.

The sample application to implement this is shown below:

Messages are received from a JMS Topic (InboundTopicAdapter).  Test messages can be injected via a CSV adapter (RequestEventCSVAdapter).  Alerts are sent to a JMS Queue (OutboundQueueAdapter), and also printed to the server standard output (PrintBean).  Use case 1 is implemented by the MissingEventProcessor.  Use case 2 is implemented by inserting the TAG into a cache (InsertServiceTagCacheBean) using a Coherence event processor and then querying the cache for each new service request (DuplicateTagProcessor), if the same tag is already associated with an SR in the cache then an alert is raised.  The RaiseEventFilter is used to filter out existing service requests from the use case 2 stream.

The non-HA version of the application is available to download here.

We will use this application to demonstrate how to HA enable an application for deployment on our cluster.

A CSV file (TestData.csv) and Load generator properties file (HADemoTest.prop) is provided to test the application by injecting events using the CSV Adapter.

Note that the application reads a configuration file ( which should be placed in the domain directory of each event server.

Deploying an Application

Before deploying an application to a cluster it is a good idea to create a group in the cluster.  Multiple servers can be members of this group.  To add a group to an event server just add an entry to the <cluster> element in config.xml as shown below:


Multiple servers can be members of a group and a server can be a member of multiple groups.  This allows you to have different levels of high availability in the same event processing cluster.

Deploy the application using the Visualizer.  Target the application at the group you created, or the AllDomainMembers group.

Test the application, typically using a CSV Adapter.  Note that using a CSV adapter sends all the events to a single event server.  To fix this we need to add a JMS output adapter (OutboundTopicAdapter) to our application and then send events from the CSV adapter to the outbound JMS adapter as shown below:

So now we are able to send events via CSV to an event processor that in turn sends the events to a JMS topic.  But we still have a few challenges.

Managing Input

First challenge is managing input.  Because OEP relies on the same event stream being processed by multiple servers we need to make sure that all our servers get the same message from the JMS Topic.  To do this we configure the JMS connection factory to have an Unrestricted Client ID.  This allows multiple clients (OEP servers in our case) to use the same connection factory.  Client IDs are mandatory when using durable topic subscriptions.  We also need each event server to have its own subscriber ID for the JMS Topic, this ensures that each server will get a copy of all the messages posted to the topic.  If we use the same subscriber ID for all the servers then the messages will be distributed across the servers, with each server seeing a completely disjoint set of messages to the other servers in the cluster.  This is not what we want because each server should see the same event stream.  We can use the server name as the subscriber ID as shown in the below excerpt from our application:

<wlevs:adapter id="InboundTopicAdapter" provider="jms-inbound">
    <wlevs:instance-property name="durableSubscriptionName"
            value="${com_bea_wlevs_configuration_server_ClusterType.serverName}" />

This works because I have placed a ConfigurationPropertyPlaceholderConfigurer bean in my application as shown below, this same bean is also used to access properties from a configuration file:

<bean id="ConfigBean"
        <property name="location" value="file:../"/>

With this configuration each server will now get a copy of all the events.

As our application relies on elapsed time we should make sure that the timestamps of the received messages are the same on all servers.  We do this by adding an HA Input adapter to our application.

<wlevs:adapter id="HAInputAdapter" provider="ha-inbound">
    <wlevs:listener ref="RequestChannel" />
    <wlevs:instance-property name="keyProperties"
            value="EVID" />
    <wlevs:instance-property name="timeProperty" value="arrivalTime"/>

The HA Adapter sets the given “timeProperty” in the input message to be the current system time.  This time is then communicated to other HAInputAdapters deployed to the same group.  This allows all servers in the group to have the same timestamp in their event.  The event is identified by the “keyProperties” key field.

To allow the downstream processing to treat the timestamp as an arrival time then the downstream channel is configured with an “application-timestamped” element to set the arrival time of the event.  This is shown below:

<wlevs:channel id="RequestChannel" event-type="ServiceRequestEvent">
    <wlevs:listener ref="MissingEventProcessor" />
    <wlevs:listener ref="RaiseEventFilterProcessor" />

Note the property set in the HAInputAdapter is used to set the arrival time of the event.

So now all servers in our cluster have the same events arriving from a topic, and each event arrival time is synchronized across the servers in the cluster.

Managing Output

Note that an OEP cluster has multiple servers processing the same input stream.  Obviously if we have the same inputs, synchronized to appear to arrive at the same time then we will get the same outputs, which is central to OEPs promise of high availability.  So when an alert is raised by our application it will be raised by every server in the cluster.  If we have 3 servers in the cluster then we will get 3 copies of the same alert appearing on our alert queue.  This is probably not what we want.  To fix this we take advantage of an HA Output Adapter.  unlike input where there is a single HA Input Adapter there are multiple HA Output Adapters, each with distinct performance and behavioral characteristics.  The table below is taken from the Oracle® Fusion Middleware Developer's Guide for Oracle Event Processing and shows the different levels of service and performance impact:

Table 24-1 Oracle Event Processing High Availability Quality of Service High Availability Option Missed Events? Duplicate Events? Performance Overhead Section, "Simple Failover" Yes (many) Yes (few) Negligible Section, "Simple Failover with Buffering" Yes (few)Foot 1 Yes (many) Low Section, "Light-Weight Queue Trimming" No Yes (few) Low-MediumFoot 2 Section, "Precise Recovery with JMS" No No High

I decided to go for the lightweight queue trimming option.  This means I won’t lose any events, but I may emit a few duplicate events in the event of primary failure.  This setting causes all output events to be buffered by secondary's until they are told by the primary that a particular event has been emitted.  To configure this option I add the following adapter to my EPN:

    <wlevs:adapter id="HAOutputAdapter" provider="ha-broadcast">
        <wlevs:listener ref="OutboundQueueAdapter" />
        <wlevs:listener ref="PrintBean" />
        <wlevs:instance-property name="keyProperties" value="timestamp"/>
        <wlevs:instance-property name="monotonic" value="true"/>
        <wlevs:instance-property name="totalOrder" value="false"/>

This uses the time of the alert (timestamp property) as the key to be used to identify events which have been trimmed.  This works in this application because the alert time is the time of the source event, and the time of the source events are synchronized using the HA Input Adapter.  Because this is a time value then it will increase, and so I set monotonic=”true”.  However I may get two alerts raised at the same timestamp and in that case I set totalOrder=”false”.

I also added the additional configuration to config.xml for the application:

    <warm-up-window-length units="seconds">15</warm-up-window-length>
    <trimming-interval units="millis">1000</trimming-interval>

This causes the primary to tell the secondary's which is its latest emitted alert every 1 second.  This will cause the secondary's to trim from their buffers all alerts prior to and including the latest emitted alerts.  So in the worst case I will get one second of duplicated alerts.  It is also possible to set a number of events rather than a time period.  The trade off here is that I can reduce synchronization overhead by having longer time intervals or more events, causing more memory to be used by the secondary's or I can cause more frequent synchronization, using less memory in the secondary's and generating fewer duplicate alerts but there will be more communication between the primary and the secondary's to trim the buffer.

The warm-up window is used to stop a secondary joining the cluster before it has been running for that time period.  The window is based on the time that the EPN needs to be running to be have the same state as the other servers.  In our example application we have a CQL that runs for a period of 10 seconds, so I set the warm up window to be 15 seconds to ensure that a newly started server had the same state as all the other servers in the cluster.  The warm up window should be greater than the longest query window.

Adding an External Coherence Cluster

When we are running OEP as a cluster then we have additional overhead in the servers.  The HA Input Adapter is synchronizing event time across the servers, the HA Output adapter is synchronizing output events across the servers.  The HA Output adapter is also buffering output events in the secondary’s.  We can’t do anything about this but we can move the Coherence Cache we are using outside of the OEP servers, reducing the memory pressure on those servers and also moving some of the processing outside of the server.  Making our Coherence caches external to our OEP cluster is a good idea for the following reasons:

  • Allows moving storage of cache entries outside of the OEP server JVMs hence freeing more memory for storing CQL state.
  • Allows storage of more entries in the cache by scaling cache independently of the OEP cluster.
  • Moves cache processing outside OEP servers.

To create the external Coherence cache do the following:

  • Create a new directory for our standalone Coherence servers, perhaps at the same level as the OEP domain directory.
  • Copy the tangosol-coherence-override.xml file previously created for the OEP cluster into a config directory under the Coherence directory created in the previous step.
  • Copy the coherence-cache-config.xml file from the application into a config directory under the Coherence directory created in the previous step.
  • Add the following to the tangosol-coherence-override.xml file in the Coherence config directory:
    • <coherence>
    • Important Note: The <cluster-name> must match the name of the OEP cluster as defined in the <domain><name> element in the event servers config.xml.
    • The member name is used to help identify the server.
  • Disable storage for our caches in the event servers by editing the coherence-cache-config.xml file in the application and adding the following element to the caches:
    • <distributed-scheme>
    • The local-storage flag stops the OEP server from storing entries for caches using this cache schema.
    • Do not disable storage at the global level (-Dtangosol.coherence.distributed.localstorage=false) because this will disable storage on some OEP specific cache schemes as well as our application cache.  We don’t want to put those schemes into our cache servers because they are used by OEP to maintain cluster integrity and have only one entry per application per server, so are very small.  If we put those into our Coherence Cache servers we would have to add OEP specific libraries to our cache servers and enable them in our coherence-cache-config.xml, all of which is too much trouble for little or no benefit.
  • If using Unicast Discovery (this section is not required if using Multicast) then we want to make the Coherence Grid be the Well Known Address servers because we want to disable storage of entries on our OEP servers, and Coherence nodes with storage disabled cannot initialize a cluster.  To enable the Coherence servers to be primaries in the Coherence grid do the following:
    • Change the unicast-listener addresses in the Coherence servers tangosol-coherence-override.xml file to be suitable values for the machine they are running on – typically change the listen address.
    • Modify the WKA addresses in the OEP servers and the Coherence servers tangosol-coherence-override.xml file to match at least two of the Coherence servers listen addresses.
    • The following table shows how this might be configured for 2 OEP servers and 2 Cache servers
      OEP Server 1 OEP Server 2 Cache Server 1 Cache Server 2

      <?xml version='1.0'?>

              <socket-address id="1">
              <socket-address id="2">

      <?xml version='1.0'?>

              <socket-address id="1">
              <socket-address id="2">

      <?xml version='1.0'?>
              <socket-address id="1">
              <socket-address id="2">

      <?xml version='1.0'?>
              <socket-address id="1">
              <socket-address id="2">

    • Note that the OEP servers do not listen on the WKA addresses, using different port numbers even though they run on the same servers as the cache servers.
    • Also not that the Coherence servers are the ones that listen on the WKA addresses.
  • Now that the configuration is complete we can create a start script for the Coherence grid servers as follows:
    • #!/bin/sh
      # specify the JVM heap size
      if [[ $1 == '-jmx' ]]; then
      $JAVAEXEC -server -showversion $JAVA_OPTS -cp "${CACHE_SERVER_CLASSPATH}:${COHERENCE_JAR}" $1
    • Note that I put the tangosol-coherence-override and the coherence-cache-config.xml files in a config directory and added that directory to my path (CACHE_SERVER_CLASSPATH=${CACHE_SERVER_HOME}/HADemoCoherence.jar:${CACHE_SERVER_HOME}/config) so that Coherence would find the override file.
    • Because my application uses in-cache processing (entry processors) I had to add a jar file containing the required classes for the entry processor to the classpath (CACHE_SERVER_CLASSPATH=${CACHE_SERVER_HOME}/HADemoCoherence.jar:${CACHE_SERVER_HOME}/config).
    • The classpath references the Coherence Jar shipped with OEP to avoid versoin mismatches (COHERENCE_JAR=${OEP_HOME}/modules/com.tangosol.coherence_3.7.1.6.jar).
    • This script is based on the standard script that ships with standalone Coherence.
    • The –jmx flag can be passed to the script to enable Coherence JMX management beans.

We have now configured Coherence to use an external data grid for its application caches.  When starting we should always start at least one of the grid servers before starting the OEP servers.  This will allow the OEP server to find the grid.  If we do start things in the wrong order then the OEP servers will block waiting for a storage enabled node to start (one of the WKA servers if using Unicast).


We have now created an OEP cluster that makes use of an external Coherence grid for application caches.  The application has been modified to ensure that the timestamps of arriving events are synchronized and the output events are only output by one of the servers in the cluster.  In event of failure we may get some duplicate events with our configuration (there are configurations that avoid duplicate events) but we will not lose any events.  The final version of the application with full HA capability is shown below:


The following files are available for download:

  • Oracle Event Processing
    • Includes Coherence
  • None-HA version of application
    • Includes test file TestData.csv and Load Test property file HADemoTest.prop
    • Includes file to customize to point to your WLS installation
  • HA version of application
    • Includes test file TestData.csv and Load Test property file HADemoTest.prop
    • Includes file to customize to point to your WLS installation
  • OEP Cluster Files
    • Includes config.xml
    • Includes tangosol-coherence-override.xml
    • Includes that will need customizing for your WLS environment
  • Coherence Cluster Files
    • Includes tangosol-coherence-override.xml and coherence-cache-configuration.xml
    • includes start script
    • Includes HADemoCoherence.jar with required classes for entry processor

The following references may be helpful:

Clear Day for Cloud Adapters

Fri, 2014-01-17 16:07 Adapter Released

Yesterday Oracle released their cloud adapter for (SFDC) so I thought I would talk a little about why you might want it.  I had previously integrated with SFDC using BPEL and the SFDC web interface, so in this post I will explore why the adapter might be a better approach.


So if I can interface to SFDC without the adapter why would I spend money on the adapter?  There are a number of reasons and in this post I will just explain the following 3 benefits:

  • Auto-Login
  • Non-Ploymorphic Operations
  • Operation Wizards

Lets take each one in turn.


The first obvious benefit is how you connect and make calls to SFDC.  To perform an operation such as query an account or update an address the SFDC interface requires you to do the following:

  • Invoke a login method which returns a session ID to placed in the header on all future calls and the actual endpoint to call.
  • Invoke the actual operation using the provided endpoint and passing the session ID provided.
  • When finished with calls invoke the logout operation.

Now these are not unreasonable demands.  The problem comes when you try to implement this interface.

Before calling the login method you need the credentials.  These need to be obtained from somewhere, I set them as BPEL preferences but there are other ways to store them.  Calling the login method is not a problem but you need to be careful in how you make subsequent calls.

First all subsequent calls must override the endpoint address with the one returned from the login operation.  Secondly the provided session ID must be placed into a custom SOAP header.  So you have to copy the session ID into a custom SOAP Header and provide that header to the invoke operation.  You also have to override the endpointURI property in the invoke with provided endpoint.

Finally when you have finished performing operations you have to logout.

In addition to the number of steps you have to code there is the problem of knowing when to logout.  The simplest thing to do is for each operation you wish to perform execute the login operatoin folloed y the actual working operation and then do a logout operation.  The trouble with this is that you are now making 3 calls every time you want to perform an operation against SFDC.  This causes additional latency in processing the request.

The adapter hides all this from you, hiding the login/logout operations and allowing connections to  be re-used, reducing the number of logins required.  The adapter makes the SFDC call look like a call to any other web service while the adapter uses a session cache to avoid repeated logins.

Non-Polymorphic Operations

The standard operations in the SFDC interface provide a base object return type, the sObject.  This could be an Account or a Campaign for example but the operations always return the base sObject type, leaving it to the client to make sure they process the correct return type.  Similarly requests also use polymorphic data types.  This often requires in BPEL that the sObject returned is copied to a variable of a more specific type to simplify processing of the data.  If you don’t do this then you can still query fields within the specific object but the SOA tooling cannot check it for you.

The adapter identifies the type of request and response and also helps build the request for you with bind parameters.  This means that you are able to build your process to actually work with the real data structures, not the abstract ones.  This is another big benefit in my view!

Operation Wizards

The SFDC API is very powerful.  Translation: the SFDC API is very complex.  With great power comes complexity to paraphrase Uncle Ben (amongst others).  The adapter groups the operations into logical collections and then provides additional help in selecting from within those collections of operations and providing the correct parameters for them.


Installation takes place in two parts.  The Design time is deployed into JDeveloper and the run time is deployed into the SOA Suite Oracle Home.  The adapter is available for download here and the installation instructions and documentation are here.  Note that you will need OPatch to install the adapter.  OPatch can be downloaded from Oracle Support Patch 6880880.  Don’t use the OPatch that ships with JDeveloper and SOA Suite.  If you do you may see an error like:

Uncaught exception
      Missing class:

You will want the OPatch 11.1.0.x.x.  Make sure you download the correct 6880880, it must be for 11.1.x as that is the version of JDeveloper and SOA Suite and it must be for the platform you are running on.

Apart from getting the right OPatch the installation is very straight forward.

So don’t be afraid of SFDC integration any more, cloud integratoin is clear with the SFDC adapter.

Going Native with JCA Adapters

Mon, 2013-12-30 15:55
Formatting JCA Adapter Binary Contents

Sometimes you just need to go native and play with binary data rather than XML.  This occurs commonly when using JCA adapters, the file to be written is in binary format, or the TCP messsages written by the Socket Adapter are in binary format.  Although the adapter has no problem converting Base64 data into raw binary, it is a little tricky to get that data into base64 format in the first place, so this blog entry will explain how.

Adapter Creation

When creating most adapters (application & DB being the exceptions) you have the option of choosing the message format.  By making the message format “opaque” you are telling the adapter wizard that the message data will be provided as a base-64 encoded string and the adapter will convert this to binary and deliver it.

This results in a WSDL message defined as shown below:

<schema targetNamespace=""
        xmlns="" >
  <element name="opaqueElement" type="base64Binary" />
<wsdl:message name="Write_msg">
    <wsdl:part name="opaque" element="opaque:opaqueElement"/>

The Challenge

The challenge now is to convert out data into a base-64 encoded string.  For this we have to turn to the service bus and MFL.

Within the service bus we use the MFL editor to define the format of the binary data.  In our example we will have variable length strings that start with a 1 byte length field as well as 32-bit integers and 64-bit floating point numbers.

The example below shows a sample MFL file to describe the above data structure:

<?xml version='1.0' encoding='windows-1252'?>
<!DOCTYPE MessageFormat SYSTEM 'mfl.dtd'>
<!--   Enter description of the message format here.   -->
<MessageFormat name='BinaryMessageFormat' version='2.02'>
    <FieldFormat name='stringField1' type='String' delimOptional='y' codepage='UTF-8'>
        <LenField type='UTinyInt'/>
    <FieldFormat name='intField' type='LittleEndian4' delimOptional='y'/>
    <FieldFormat name='doubleField' type='LittleEndianDouble' delimOptional='y'/>
    <FieldFormat name='stringField2' type='String' delimOptional='y' codepage='UTF-8'>
        <LenField type='UTinyInt'/>

Note that we can define the endianess of the multi-byte numbers, in this case they are specified as little endian (Intel format).

I also created an XML version of the MFL that can be used in interfaces.

The XML version can then be imported into a WSDL document to create a web service.

Full Steam Ahead

We now have all the pieces we need to convert XML to binary and deliver it via an adapter using the process shown below:

  • We receive the XML request, in the sample code, the sample delivers it as a web service.
  • We then convert the request data into MFL format XML using an XQuery and store the result in a variable (mflVar).
  • We then convert the MFL formatted XML into binary data (internally this is held as a java byte array) and store the result in a variable (binVar).
  • We then convert the byte array to a base-64 string using javax.xml.bind.DatatypeConverter.printBase64Binary and store the result in a variable (base64Var).
  • Finally we replace the original $body contents with the output of an XQuery that matches the adapter expected XML format.

The diagram below shows the OSB pipeline that implements the above.

A Wrinkle

Unfortunately we can only call static Java methods that reside in a jar file imported into service bus, so we have to provide a wrapper for the printBase64Binary call.  The below Java code was used to provide this wrapper:


import javax.xml.bind.DatatypeConverter;

public class Base64Encoder {
    public static String base64encode(byte[] content) {
        return DatatypeConverter.printBase64Binary(content);
    public static byte[] base64decode(String content) {
        return DatatypeConverter.parseBase64Binary(content);

Wrapping Up

Sample code is available here and consists of the following projects:

  • BinaryAdapter – JDeveloper SOA Project that defines the JCA File Adapter
  • OSBUtils – JDeveloper Java Project that defines the Java wrapper for DataTypeConverter
  • BinaryFileWriter – Eclipse OSB Project that includes everything needed to try out the steps in this blog.

The OSB project needs to be customized to have the logical directory name point to something sensible.  The project can be tested using the normal OSB console test screen.

The following sample input (note 16909060 is 0x01020304)

<bin:OutputMessage xmlns:bin="">
    <bin:stringField1>First String</bin:stringField1>
    <bin:stringField2>Second String</bin:stringField2>

Generates the following binary data file – displayed using “hexdump –C”.  The int is highlighted in yellow, the double in orange and the strings and their associated lengths in green with the length in bold.

$ hexdump -C 2.bin
00000000  0c 46 69 72 73 74 20 53  74 72 69 6e 67 04 03 02  |.First String...|
00000010  01 00 00 00 00 00 00 f8  3f 0d 53 65 63 6f 6e 64  |........?.Second|
00000020  20 53 74 72 69 6e 67                              | String|

Although we used a web service writing through to a file adapter we could have equally well used the socket adapter to send the data to a TCP endpoint.  Similarly the source of the data could be anything.  The same principle can be applied to decode binary data, just reverse the steps and use Java method parseBase64Binary instead of printBase64Binary.

List Manipulation in Rules

Thu, 2013-12-26 19:10
Generating Lists from Rules

Recently I was working with a customer that wanted to use rules to do validation.  The idea was to pass in a document to the rules engine and get back a list of violations, or an empty list if there were no violations.  Turns out that there were a coupe more steps required than I expected so thought I would share my solution in case anyone else is wondering how to return lists from the rules engine.

The Scenario

For the purposes of this blog I modeled a very simple shipping company document that has two main parts.   The Package element contains information about the actual item to be shipped, its weight, type of package and destination details.  The Billing element details the charges applied.

For the purpose of this blog I want to validate the following:

  • A residential surcharge is applied to residential addresses.
  • A residential surcharge is not applied to non-residential addresses.
  • The package is of the correct weight for the type of package.

The Shipment element is sent to the rules engine and the rules engine replies with a ViolationList element that has all the rule violations that were found.

Creating the Return List

We need to create a new ViolationList within rules so that we can return it from within the decision function.  To do this we create a new global variable – I called it ViolationList – and initialize it.  Note that I also had some globals that I used to allow changing the weight limits for different package types.

When the rules session is created it will initialize the global variables and assert the input document – the Shipment element.  However within rules our ViolationList variable has an uninitialized internal List that is used to hold the actual List of Violation elements.  We need to initialize this to an empty RL.list in the Decision Functions “Initial Actions” section.

We can then assert the global variable as a fact to make it available to be the return value of the decision function.  After this we can now create the rules.

Adding a Violation to the List

If a rule fires because of a violation then we need add a Violation element to the list.  The easiest way to do this without having the rule check the ViolationList directly is to create a function to add the Violation to the global variable VioaltionList.

The function creates a new Violation and initializes it with the appropriate values before appending it to the list within the ViolationList.

When a rule fires then it just necessary to call the function to add the violation to the list.

In the example above if the address is a residential address and the surcharge has not been applied then the function is called with an appropriate error code and message.

How it Works

Each time a rule fires we can add the violation to the list by calling the function.  If multiple rules fire then we will get multiple violations in the list.  We can access the list from a function because it is a global variable.  Because we asserted the global variable as a fact in the decision function initialization function it is picked up by the decision function as a return value.  When all possible rules have fired then the decision function will return all asserted ViolationList elements, which in this case will always be 1 because we only assert it in the initialization function.

What Doesn’t Work

A return from a decision function is always a list of the element you specify, so you may be tempted to just assert individual Violation elements and get those back as a list.  That will work if there is at least one element in the list, but the decision function must always return at least one element.  So if there are no violations then you will get an error thrown.


Instead of having a completely separate return element you could have the ViolationList as part of the input element and then return the input element from the decision function.  This would work but now you would be copying most of the input variables back into the output variable.  I prefer to have a cleaner more function like interface that makes it easier to handle the response.


Hope this helps someone.  A sample composite project is available for download here.  The composite includes some unit tests.  You can run these from the EM console and then look at the inputs and outputs to see how things work.

Cleaning Up After Yourself

Tue, 2013-12-24 11:50
Maintaining a Clean SOA Suite Test Environment

Fun blog entry with Fantasia animated gifs got me thinking like Mickey about how nice it would be to automate clean up tasks.

I don’t have a sorcerers castle to clean up but I often have a test environment which I use to run tests, then after fixing problems that I uncovered in the tests I want to run them again.  The problem is that all the data from my previous test environment is still there.

Now in the past I used VirtualBox snapshots to rollback to a clean state, but this has a problem that it not only loses the environment changes I want to get rid of such as data inserted into tables, it also gets rid of changes I want to keep such as WebLogic configuration changes and new shell scripts.  So like Mickey I went in search of some magic to help me.

Cleaning Up SOA Environment

My first task was to clean up the SOA environment by deleting all instance data from the tables.  Now I could use the purge scripts to do this, but that would still leave me with running instances, for example 800 Human Workflow Tasks that I don’t want to deal with.  So I used the new truncate script to take care of this.  Basically this removes all instance data from your SOA Infrastructure, whether or not the data is live.  This can be run without taking down the SOA Infrastructure (although if you do get strange behavior you may want to restart SOA).  Some statistics, such are service and reference statistics, are kept since server startup, so you may want to restart your server to clear that data.  A sample script to run the truncate SQL is shown below.

# Truncate the SOA schemas, does not truncate BAM.
# Use only in development and test, not production.

# Properties to be set before running script
# SOAInfra Database SID
# SOA DB Prefix
# SOAInfra DB password
# SOA Home Directory

# Set DB Environment
. oraenv << EOF

# Run Truncate script from directory it lives in
cd ${SOA_HOME}/rcu/integration/soainfra/sql/truncate

# Run the truncate script
sqlplus ${SOA_PREFIX}_soainfra/${SOAINFRA_PASSWORD} @truncate_soa_oracle.sql << EOF

After running this script all your SOA composite instances and associated workflow instances will be gone.

Cleaning Up BAM

The above example shows how easy it is to get rid of all the runtime data in your SOA repository, however if you are using BAM you still have all the contents of your BAM objects from previous runs.  To get rid of that data we need to use BAM ICommand’s clear command as shown in the sample script below:

# Set software locations
export JAVA_HOME=${FMW_HOME}/jdk1.7.0_17
# Set objects to purge
BAM_OBJECTS=/path/RevenueEvent /path/RevenueViolation

# Clean up BAM
for name in ${BAM_OBJECTS}
  ${BAM_CMD} -cmd clear -name ${name} -type dataobject

After running this script all the rows of the listed objects will be gone.

Ready for Inspection

Unlike the hapless Mickey, our clean up scripts work reliably and do what we want without unexpected consequences, like flooding the castle.

Supporting the Team

Fri, 2013-12-20 15:44
SOA Support Team Blog

Some of my former colleagues in support have created a blog to help answer common problems for customers.  One way they are doing this is by creating better landing zones within My Oracle Support (MOS).  I just used the blog to locate the landing zone for database related issues in SOA Suite.  I needed to get the purge scripts working on and I couldn’t find the patches needed to do that.  A quick look on the blog and I found a suitable entry that directed me to the Oracle Fusion Middleware (FMW) SOA 11g Infrastructure Database: Installation, Maintenance and Administration Guide (Doc ID 1384379.1) in MOS.  Lots of other useful stuff on the blog so stop by and check it out, great job Shawn, Antonella, Maria & JB.

$5 eBook Bonanza

Thu, 2013-12-19 10:20
Packt eBooks $5 Offer

Packt Publishing just told me about their Christmas offer, get eBooks for $5.

From December 19th, customers will be able to get any eBook or Video from Packt for just $5. This offer covers a myriad of titles in the 1700+ range where customers will be able to grab as many as they like until January 3rd 2014 – more information is available at

If you haven’t bought the SOA Developers Cookbook then now is a great time to do so!

Postscript on Scripts

Fri, 2013-11-15 17:07
More Scripts for SOA Suite

Over time I have evolved my startup scripts and thought it would be a good time to share them.  They are available for download here.  I have finally converted to using WLST, which has a number of advantages.  To me the biggest advantage is that the output and log files are automatically written to a consistent location in the domain directory or node manager directory.  In addition the WLST scripts wait for the component to start and then return, this lets us string commands together without worrying about the dependencies.

The following are the key scripts (available for download here):

Script Description Pre-Reqs Stops when
Task Complete Starts Node Manager using WLST None Yes Starts Node Manager None Yes Stops Node Manager using WLST Node Manager running Yes Starts Admin Server using WLST Node Manager running Yes Starts Admin Server None No Stops Admin Server Admin Server running Yes Starts Managed Server using WLST Node Manager running Yes Starts Managed Server None No Stops Managed Server Admin Server running Yes Samples

To start Node Manager and Admin Server ;

To start Node Manager, Admin Server and SOA Server ; ; startWlstManagedServer soa_server1

Note that the Admin server is not started until the Node Manager is running, similarly the SOA server is not started until the Admin server is running.

Node Manager Scripts

Uses WLST to start the Node Manager.  When the script completes the Node manager will be running.

The Node Manager is started in the background and the output is piped to the screen. This causes the Node Manager to continue running in the background if the terminal is closed. Log files, including a .out capturing standard output and standard error, are placed in the <WL_HOME>/common/nodemanager directory, making them easy to find. This script pipes the output of the log file to the screen and keeps doing this until terminated, Terminating the script does not terminate the Node Manager.

Uses WLST to stop the Node Manager.  When the script completes the Node manager will be stopped.

Admin Server Scripts

Uses WLST to start the Admin Server.  The Node Manager must be running before executing this command.  When the script completes the Admin Server will be running.

The Admin Server is started in the background and the output is piped to the screen. This causes the Admin Server to continue running in the background if the terminal is closed.  Log files, including the .out capturing standard output and standard error, are placed in the same location as if the server had been started by Node Manager, making them easy to find.  This script pipes the output of the log file to the screen and keeps doing this until terminated,  Terminating the script does not terminate the server.

Stops the Admin Server.  When the script completes the Admin Server will no longer be running.

Managed Server Scripts <MANAGED_SERVER_NAME>

Uses WLST to start the given Managed Server. The Node Manager must be running before executing this command. When the script completes the given Managed Server will be running. <MANAGED_SERVER_NAME>

The given Managed Server is started in the background and the output is piped to the screen. This causes the given Managed Server to continue running in the background if the terminal is closed. Log files, including the .out capturing standard output and standard error, are placed in the same location as if the server had been started by Node Manager, making them easy to find. This script pipes the output of the log file to the screen and keeps doing this until terminated, Terminating the script does not terminate the server. <MANAGED_SERVER_NAME>

Stops the given Managed Server. When the script completes the given Managed Server will no longer be running.

Utility Scripts

The following scripts are not called directly but are used by the previous scripts.

This script is used to provide information about the Node Manager and WebLogic Domain and must be edited to reflect the installed FMW environment, in particular the following values must be set:

  • DOMAIN_NAME – the WebLogic domain name.
  • NM_USERNAME – the Node Manager username.
  • NM_PASSWORD – the Node Manager password.
  • MW_HOME – the location where WebLogic and other FMW components are installed.
  • WEBLOGIC_USERNAME – the WebLogic Administrator username.
  • WEBLOGIC_PASSWORD - the WebLogic Administrator password.

The following values may also need changing:

  • ADMIN_HOSTNAME – the server where AdminServer is running.
  • ADMIN_PORT – the port number of the AdminServer.
  • DOMAIN_HOME – the location of the WebLogic domain directory, defaults to ${MW_HOME}/user_projects/domains/${DOMAIN_NAME}
  • NM_LISTEN_HOST – the Node Manager listening hostname, defaults to the hostname of the machine it is running on.
  • NM_LISTEN_PORT – the Node Manager listening port.

This script runs the WLST script passed in environment variable ${SCRIPT} and takes its configuration from  It dynamically builds a WLST properties file in the /tmp directory to pass parameters into the scripts.  The properties filename is of the form <DOMAIN_NAME>.<PID>.properties.

This script runs the command passed in as an argument, writing standard out and standard error to a log file.  The log file is rotated between invocations to avoid losing the previous log files.  The log file is then tailed and output to the screen.  This means that this script will never finish by itself.

WLST Scripts

The following WLST scripts are used by the scripts above, taking their properties from /tmp/<DOMAIN_NAME>.<PID>.properties:


The dependencies and relationships between my scripts and the built in scripts are shown in the diagram below.

Thanks for the Memory

Fri, 2013-11-15 15:28
Controlling Memory in Oracle SOA Suite

Within WebLogic you can specify the memory to be used by each managed server in the WebLogic console.  Unfortunately if you create a domain with Oracle SOA Suite it adds a new config script,, that overwrites any USER_MEM_ARGS passed in to the start scripts. only sets a single set of memory arguments that are used by all servers, so an admin server gets the same memory parameters as a BAM server.  This means some servers will have more memory than they need and others will be too tightly constrained.  This is a bad thing.

A Solution

To overcome this I wrote a small script,, that checks to see which server is being started and then sets the memory accordingly.  It supports up to 9 different server types, each identified by a prefix.  If the prefix matches then the max and min heap and max and min perm gen are set.  Settings are controlled through variables set in the script,  If using JRockit then leave the PERM settings empty and they will not be set.


The above settings match any server whose name starts Admin.  The above will result in the following USER_MEM_ARGS value

USER_MEM_ARGS=-Xms768m -Xmx1280m -XX:PermSize=256m -XX:MaxPermSize=512m

If the prefix were soa then it would match soa_server1, soa_server2 etc.

There is a set of DEFAULT_ values that allow you to default the memory settings and only set them explicitly for servers that have settings different from your default.  Note that there must still be a matching prefix, otherwise the USER_MEM_ARGS will be the ones from

This script needs to be called from the  Add the call immediately before the following lines:

if [ "${USER_MEM_ARGS}" != "" ] ; then
        export MEM_ARGS

The script can be downloaded here.

Thoughts on Memory Setting

I know conventional wisdom is that Xms (initial heap size) and Xmx (max heap size) should be set the same to avoid needing to allocate memory after startup.  However I don’t agree with this.  Setting Xms==Xmx works great if you are omniscient, I don’t claim to be omniscient, my omni is a little limited, so I prefer to set Xms to what I think the server needs, this is what I would set it to if I was setting the parameters to be Xms=Xmx.  However I like to then set Xmx to be a little higher than I think the server needs.  This allows me to get the memory requirement wrong and not have my server fail due to out of memory.  In addition I can now monitor the server and if the heap memory usage goes above my Xms setting I know that I calculated wrong and I can change the Xms setting and restart the servers at a suitable time.  Setting them not equal buys be time to fix increased memory needs, for exampl edue to change in usage patterns or new functionality, it also allows me to be less than omniscient.

ps Please don’t tell my children I am not omniscient!

Share & Enjoy : Using a JDeveloper Project as an MDS Store

Sat, 2013-10-12 01:24
Share & Enjoy : Sharing Resources through MDS

One of my favorite radio shows was the Hitchhikers Guide to the Galaxy by the sadly departed Douglas Adams.  One of the characters, Marvin the Paranoid Android, was created by the Sirius Cybernetics Corporation whose corporate song was entitled Share and Enjoy!  Just like using the products of the Sirius Cybernetics Corporation, reusing resources through MDS is not fun, but at least it is useful and avoids some problems in SOA deployments.  So in this blog post I am going to show you how to re-use SOA resources stored in MDS using JDeveloper as a development tool.

The Plan

We would like to have some SOA resources such as WSDLs, XSDs, Schematron files, DVMs etc. stored in a shared location.  This gives us the following benefits

  • Single source of truth for artifacts
  • Remove cross composite dependencies which can cause deployment and startup problems
  • Easier to find and reuse resources if stored in a single location

So we will store a WSDL and XSD in MDS, using a JDeveloper project to maintain the shared artifact and using File based MDS to access it from development and Database based MDS to access it from runtime.  We will create the shared resources in a JDeveloper project and deploy them to MDS.  We will then deploy a project that exposes a service based on the WSDL.  Finally we will deploy a client project to the previous project that uses the same MDS resources.

Creating Shared Resources in a JDeveloper Project

First lets create a JDeveloper project and put our shared resources into that project.  To do this

  1. In a JDeveloper Application create a New Generic Project (File->New->All Technologies->General->Generic Project)
  2. In that project create a New Folder called apps (File->New->All Technologies->General->Folder) – It must be called apps for local File MDS to work correctly.
  3. In the project properties delete the existing Java Source Paths (Project Properties->Project Source Paths->Java Source Paths->Remove)
  4. In the project properties a a new Java Source Path pointing to the just created apps directory (Project Properties->Project Source Paths->Java Source Paths->Add)

Having created the project we can now put our resources into that project, either copying them from other projects or creating them from scratch.

Create a SOA Bundle to Deploy to a SOA Instance

Having created our resources we now want to package them up for deployment to a SOA instance.  To do this we take the following steps.

  1. Create a new JAR deployment profile (Project Properties->Deployment->New->Jar File)
  2. In JAR Options uncheck the Include Manifest File
  3. In File Groups->Project Output->Contributors uncheck all existing contributors and check the Project Source Path
  4. Create a new SOA Bundle deployment profile (Application Properties->Deployment->New->SOA Bundle)
  5. In Dependencies select the project jar file from the previous steps.
  6. On Application Properties->Deployment unselect all options.

The bundle can now be deployed to the server by selecting Deploy from the Application Menu.

Create a Database Based MDS Connection in JDeveloper

Having deployed our shared resources it would be good to check they are where we expect them to be so lets create a Database Based MDS Connection in JDeveloper to let us browse the deployed resources.

  1. Create a new MDS Connection (File->All Technologies->General->Connections->SOA-MDS Connection)
  2. Make the Connection Type DB Based MDS and choose the database Connection and parition.  The username of the connection will be the <PREFIX>_mds user and the MDS partition will be soa-infra.

Browse the repository to make sure that your resources deplyed correctly under the apps folder.  Note that you can also use this browser to look at deployed composites.  You may find it intersting to look at the /deployed-composites/deployed-composites.xml file which lists all deployed composites.


    Create an File Based MDS Connection in JDeveloper

    We can now create a File based MDS connection to the project we just created.  A file based MDS connection allows us to work offline without a database or SOA server.  We will create a file based MDS that actually references the project we created earlier.

    1. Create a new MDS Connection (File->All Technologies->General->Connections->SOA-MDS Connection)
    2. Make the Connection Type File Based MDS and choose the MDS Root Folder to be the location of the JDeveloper project previously created (not the source directory, the top level project directory).

    We can browse the file based MDS using the IDE Connections Window in JDeveloper.  This lets us check that we can see the contents of the repository.

    Using File Based MDS

    Now that we have MDS set up both in the database and locally in the file system we can try using some resources in a composite.  To use a WSDL from the file based repository:

    1. Insert a new Web Service Reference or Service onto your composite.xml.
    2. Browse the Resource Palette for the WSDL in the File Based MDS connection and import it.
    3. Do not copy the resource into the project.
    4. If you are creating a reference, don’t worry about the warning message, that can be fixed later.  Just say Yes you do want to continue and create the reference.

    Note that when you import a resource from an MDS connection it automatically adds a reference to that MDS into the applications adf-config.xml.  SOA applications do not deploy their adf-config.xml, they use it purely to help resolve oramds protocol references in SOA composites at design time.  At runtime the soa-infra applications adf-config.xml is used to help resolve oramds protocol references.

    The reason we set file based MDS to point to the project directory rather than the apps directory underneath is because when we deploy SOA resources to MDS as a SOA bundle the resources are all placed under the apps MDS namespace.  To make sure that our file based MDS includes an apps namespace we have to rename the src directory to be apps and then make sure that our file based MDS points to the directory aboive the new source directory.

    Patching Up References

    When we use an abstract WSDL as a service then the SOA infrastructure automatically adds binging and service information at run time.  An abstract WSDL used as a reference needs to have binding and service information added in order to compile successfully.  By default the imported MDS reference for an abstract WSDL will look like this:

    <reference name="Service3"
      <interface.wsdl interface=" wsdl.interface(WriteFileProcess)"/>
      < port="" location=""/>

    Note that the port and location properties of the binding are empty.  We need to replace the location with a runtime WSDL location that includes binding information, this can be obtained by getting the WSDL URL from the soa-infra application or from EM.  Be sure to remove any MDS instance strings from the URL.


    The port information is a little more complicated.  The first part of the string should be the target namespace of the service, usually the same as the first part of the interface attribute of the interface.wsdl element.  This is followed by a #wsdl.endpoint and then in parenthesis the service name from the runtime WSDL and port name from the WSDL, separated by a /.  The format should look like this:

    {Service Namespace}#wsdl.endpoint({Service Name}/{Port Name})

    So if we have a WSDL like this:

       <wsdl:service name="writefileprocess_client_ep">
          <wsdl:port name="WriteFileProcess_pt"
             <soap:address location=… />

    Then we get a port like this: wsdl.endpoint(writefileprocess_client_ep/WriteFileProcess_pt)

    Note that you don’t have to set actual values until deployment time.  The following binding information will allow the composite to compile in JDeveloper, although it will not run in the runtime:

    < port="dummy#wsdl.endpoint(dummy/dummy)" location=""/>

    The binding information can be changed in the configuration plan.  Deferring this means that you have to have a configuration plan in order to be able to invoke the reference and this means that you reduce the risk of deploying composites with references that are pointing to the wrong environment.


    In this blog post I have shown how to store resources in MDS so that they can be shared between composites.  The resources can be created in a JDeveloper project that doubles as an MDS file repository.  The MDS resources can be reused in composites.  If using an abstract WSDL from MDS I have also shown how to fix up the binding information so that at runtime the correct endpoint can be invoked.  Maybe it is more fun than dealing with the Sirius Cybernetics Corporation!

    Multiple SOA Developers Using a Single Install

    Wed, 2013-10-09 16:37
    Running Multiple SOA Developers from a Single Install

    A question just came up about how to run multiple developers from a single software install.  The objective is to have a single software installation on a shared server and then provide different OS users with the ability to create their own domains.  This is not a supported configuration but it is attractive for a development environment.

    Out of the Box

    Before we do anything special lets review the basic installation.

    • Oracle WebLogic Server 10.3.6 installed using oracle user in a Middleware Home
    • Oracle SOA Suite installed using oracle user
    • Software installed with group oinstall
    • Developer users dev1, dev2 etc
      • Each developer user is a member of oinstall group and has access to the Middleware Home.

    To get this to work I did the following customization

    • In the Middleware Home make all user readable files/directories group readable and make all user executable files/directories group executable.
      • find $MW_HOME –perm /u+r ! –perm /g+r | xargs –Iargs chmod g+r args
      • find $MW_HOME –perm /u+x ! –perm /g+x | xargs –Iargs chmod g+x args
    Domain Creation

    When creating a domain for a developer note the following:

    • Each developer will need their own FMW repository, perhaps prefixed by their username, e.g. dev1, dev2 etc.
    • Each developer needs to use a unique port number for all WebLogic channels
    • Any use of Coherence should use Well Known Addresses to avoid cross talk between developer clusters (note SOA and OSB both use Coherence!)
    • If using Node Manager each developer will need their own instance, using their own configuration.