<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->
<configConfMos
  cookie="%cookie%"
  inHierarchical="false">
  <inConfigs>

    <pair key="%ippooldn%">
      <policyObjectGroup
        descr="%descr%"
        dn="%ippooldn%"
        name="%ippoolname%"
        status="created"/>
    </pair>
    <pair key="%ippooldn%/objgrp-expr-2">
      <policyObjectGroupExpression
        dn="%ippooldn%/objgrp-expr-2"
        id="2"
        opr="eq"
        order="unspecified"
        status="created"/>
    </pair>
    <pair key="%ippooldn%/objgrp-expr-2/nw-ip-2">
      <policyIPAddress
        dataType="string"
        descr=""
        dn="%ippooldn%/objgrp-expr-2/nw-ip-2"
        id="2"
        name=""
        placement="none"
        status="created"
        value="%ipvalue%"/>
    </pair>

  </inConfigs>
</configConfMos>

<!--
    ippooldn="org-root/org-vlan-123/org-VDC-vlan-123/objgrp-ccc"
    ippoolname="ccc"
    ipvalue="10.1.1.20"
-->