docs: private Set<String> evaluateScope(String scope, CmsXmlContentDefinition definition) {
  
          Set<String> evaluatedScopes = new HashSet<String>();
          if (scope.contains("*")) {
              // evaluate wildcards to get all allowed permutations of the scope
              // a path like Paragraph*/Image should result in Paragraph[0]/Image, Paragraph[1]/Image and Paragraph[2]/Image
              // in case max occurrence for Paragraph is 3
  
              String[] pathElements = scope.split("/");
              String parentPath = "";
  
              for (int i = 0; i < pathElements.length; i++) {
                  String elementName = pathElements[i];
                  boolean hasWildCard = elementName.endsWith("*");
  
                  if (hasWildCard) {
                      elementName = elementName.substring(0, elementName.length() - 1);
                      parentPath = CmsStringUtil.joinPaths(parentPath, elementName);
                      I_CmsXmlSchemaType type = definition.getSchemaType(parentPath);
                      Set<String> tempScopes = new HashSet<String>();
                      if (type.getMaxOccurs() == Integer.MAX_VALUE) {
                          throw new IllegalStateException(
                              "Can not use fields with unbounded maxOccurs in scopes for editor change handler.");
                      }
                      for (int j = 0; j < type.getMaxOccurs(); j++) {
                          if (evaluatedScopes.isEmpty()) {
                              tempScopes.add(elementName + "[" + (j + 1) + "]");
                          } else {
  
                              for (String evScope : evaluatedScopes) {
                                  tempScopes.add(CmsStringUtil.joinPaths(evScope, elementName + "[" + (j + 1) + "]"));
                              }
                          }
                      }
                      evaluatedScopes = tempScopes;
                  } else {
                      parentPath = CmsStringUtil.joinPaths(parentPath, elementName);
                      Set<String> tempScopes = new HashSet<String>();
                      if (evaluatedScopes.isEmpty()) {
                          tempScopes.add(elementName);
                      } else {
                          for (String evScope : evaluatedScopes) {
                              tempScopes.add(CmsStringUtil.joinPaths(evScope, elementName));
                          }
                      }
                      evaluatedScopes = tempScopes;
                  }
              }
          } else {
              evaluatedScopes.add(scope);
          }
          return evaluatedScopes;
      }